机器学习--K近邻算法(KNN)(2)

一、简介

K-Nearest-Neighbor 算法是一种常用的监督学习算法,它没有显式的训练过程,是‘懒惰学习’的显著代表,此类学习算法仅在训练阶段将训练集保存起来,训练时间开销为0,待收到测试样本后在进行处理

k近邻模型的三要素: K值选择、距离度量、分类评价规则

二、工作机制

给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个‘邻居’的信息来进行预测。

在分类任务中,可使用“投票法”,即选择这k个样本中出现类别最多的标记作为预测结果;评价分类问题可以使用准确率 score

在回归任务中使用“平均法”,将这k个样本的实值输出标记的平均值作为预测结果;评价回归问题可以使用MSE(均方误差)、MAE(平均绝对值误差),需要注意,语法上y值必须是可以计算的数值类型。
最佳拟合:经验误差和泛化误差相近,泛化误差尽可能小

还可以基于距离远近进行加权平均或加权投票,距离越近,权重越大

距离度量方式:
在这里插入图片描述

其中p=2,就是欧氏距离
p=1,就是曼哈顿距离

三、算法实现

K近邻算法的实现最简单的方法是线性扫描,该方法要计算待预测样本与每一个训练实例的距离,当训练集很大时,计算非常耗时,显然这种方法不太可行。故引入kd树

如果实例点是随机分布的,kd树更适用于训练样本数远大于空间维数时的k近邻搜索。当空间维数接近训练实例数时。它的效率会迅速下降,几乎接近线性扫描。

3.1 KD树

Kd-树是K-dimension tree的缩写,是对数据点在k维空间(如二维(x,y),三维(x,y,z),k维(x1,y,z…))中划分的一种数据结构,主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索)。本质上说,Kd-树就是一种平衡二叉树。

构造KD树相当于不断用垂直于坐标轴的超平面将K维空间进行切分,构成一系列的K维超矩形区域,直至子区域没有节点。KD树中的每一个节点对应于一个k维超矩形区域。

通常选择训练实例点再选定坐标轴上的中位数为切分点,这样得到平衡KD树,但平衡KD树不一定就是搜索效率最优的。

3.2 KD树搜索过程

①、在kd树中找出包含目标点的x的叶结点:从根结点出发,递归地向下访问kd树。若目标点x当前维的坐标小于切分点的坐标,则移动到左子结点,否则移动到右子结点。直到子结点为叶结点为止。
②、以此叶结点为“当前最近点”。
③、递归地向上回退,在每个结点进行以下操作:
(a)如果该结点保存的实例点比当前最近点距离目标点更近,则以该实例点为“当前最近点”。
(b)当前最近点一定存在于该节点的一个子结点对应的区域。检查该子结点的父结点的另一子结点对应的区域是否有更近的点。具体地,检查另一子结点对应的区域是否与以目标点为球心、以目标点与“当前最近点的距离为半径的超球体相交。如果相交,可能在另一个子结点对应的区域内存在距离目标点更近的点,移动到另一个子结点。接着,递归地进行最近邻搜索;如果不相交,向上回退。
④、当回退到根结点是,搜索结束,最后的“当前最近点”即为x的最近邻点。

四、简单应用

一般用于小样本集的数据模型,K不能为样本集的容量,K值不能为偶数。K的(经验)取值上限为sqrt(样本容量)

3.1 自定义数据集进行KNN预测(分类)

film:
在这里插入图片描述

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

# 导入我们自己构建的伪数据集
film = pd.read_excel('C:/Users/Administrator/Desktop/films.xlsx')

# 获取特征向量集合,和标签集合
y = film['类别'].copy()
X = film[['动作镜头','爱情镜头']].copy()

# 生成一组待预测样本
X_test = np.array([[11,6],[5,17]])

# 取X中的数值
X.values


# 绘制样本集在特征空间中的分布状况
plt.figure(figsize=(8,5))
plt.scatter(X['动作镜头'],X['爱情镜头'],s=100,c=y.map({
    '动作':0,
    '爱情':1
}),cmap=plt.cm.winter)
plt.legend([])

# 显示中文
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 给空间样本点添加图例描述,因为散点图不支持在绘图时添加图例
action = X.loc[y=='动作']
love = X.loc[y=='爱情']
s = 100
plt.scatter(action['动作镜头'],action['
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: knn.fit(x_train,y_train) 的意思是使用k-近邻算法对训练数据集x_train和对应的标签y_train进行拟合。其中,k-近邻算法是一种基于距离度量的分类算法,它的基本思想是在训练集中找到与待分类样本最近的k个样本,然后根据这k个样本的标签来确定待分类样本的类别。 ### 回答2: knn.fit(x_train,y_train)是k最近邻算法中的一个重要步骤。这个步骤可以用于构建kNN分类器的模型。其中,kNN是一种监督学习算法,它可以用于分类和回归。 在分类问题中,kNN算法的基本思想是根据输入样本的最近邻居所属的类别,来预测输入样本可能属于的类别。kNN算法的核心是找到最近邻居,也就是找到与输入样本最相似的k个样本,然后通过这些样本获得输入样本的类别。因此,我们需要一个训练数据集,其中包含输入样本和对应的类别标签,然后将这些样本和类别标签分配给kNN分类器。 knn.fit(x_train,y_train)中的x_train和y_train分别表示输入样本的特征值和对应的类别标签。x_train是一个二维向量,其中每一列代表一个特征,每一行代表一个样本。y_train是一个一维向量,其中每个元素表示对应样本的类别标签。 在实际应用中,我们通常将训练数据集分成训练集和测试集,用训练集来训练kNN分类器,并使用测试集来评估分类器的性能。所以,在训练kNN分类器时,我们需要使用fit()函数来拟合训练数据。通过knn.fit(x_train,y_train)这样的训练模型函数,我们就可以使用训练数据来训练模型,并使用模型对新的数据进行分类预测。 ### 回答3: knn.fit(x_train,y_train)是一个基于K-最近邻KNN算法的模型拟合函数KNN算法是一种监督学习算法,它的主要思想是通过计算待分类数据点与训练数据集中各个数据点的距离,然后选择K个最近邻居中出现次数最多的类别进行分类。其中K是一个超参数,需要根据具体问题进行调整。 在这个函数中,x_train是一个训练数据集,它由多个特征组成。每个特征都是一个数值或离散的属性,代表某种特征的大小或类别。y_train是训练数据集中每个数据点对应的分类标签,它对应于每个x_train数据点的类别。KNN模型将通过学习训练数据集中的特征和标签信息来进行分类。 在fit函数的执行过程中,模型将使用训练数据集中的数据和标签信息来建立模型,并通过调整模型参数来使得模型更好地拟合数据。当模型拟合完成后,我们就可以通过使用训练好的模型来进行预测了。在进行预测时,我们会将测试数据点作为输入,通过计算测试数据点与训练数据点之间的距离,然后选择K个最近邻居中出现次数最多的类别进行分类。 总的来说,knn.fit(x_train,y_train)是KNN算法中训练模型的重要函数。它能够建立一个模型,通过学习训练数据集中的特征和标签信息来进行分类。通过调整模型参数来使得模型更好地拟合数据,我们可以得到一个准确度更高的模型,用于进行分类预测操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值