目录
一:KNN算法概述
1.介绍
KNN(K Near Neighbor):k个最近的邻居,即每个样本都可以用它最接近的k个邻居来代表。KNN算法是一种用于分类和回归的统计方法 ,可以说是最简单的分类算法之一。我的理解就是计算某给点到每个点的距离作为相似度的反馈。
2.原理
knn算法的核心思想是未标记样本的类别,由距离其最近的k个邻居投票来决定。具体的,假设我们有一个已标记好的数据集。此时有一个未标记的数据样本,我们的任务是预测出这个数据样本所属的类别。knn的原理是,计算待标记样本和数据集中每个样本的距离,取距离最近的k个样本。待标记的样本所属类别就由这k个距离最近的样本投票产生
如下,对于一个待分类的圆点,其类别就由k个距离最近的样本决策产生,当然k的取值不同,其最后的结果也会不同,因此,如何合适选择k的取值,也是我们需要思考的问题
简单来说,k近邻算法就是一种“近朱者赤近墨者黑”的分类算法
3.三大要素
k值的选取
当我们选择的k值较小时,泛化能力弱,容易受到异常点的影响(学习近似误差小,但是估计误差增大,过拟合)
当我们选择的k值较大时,模型复杂度降低,但是训练误差会增大,存在样本均衡的问题(学习近似误差大,但是估计误差小,欠拟合)
k值的选取应当适中,我们一般用交叉验证法搜索最优k值
距离度量:
常用的两种距离度量方法如下
欧氏距离:是最容易直观理解的距离度量方法,我们小学、初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离。
在n维空间中,两点之间的欧几里得距离计算公式为:
$$d(x,y)=\sqrt{\sum{i-1}^{n}(x{i}-y_{i})^{2}}$$
曼哈顿距离:在曼哈顿街区要从一个十字路口开车到另一个十字路口,驾驶距离显然不是两点间的直线距离。这个实际驾驶距离就是“曼哈顿距离”。曼哈顿距离就是指两点之间在网格上的实际路径,也称为“城市街区距离”(City Block distance)。
在n维空间中,两点 之间的曼哈顿距离计算公式为:
$$d(x,y)=\sum{i-1}^{n}\vert x{i}-y_{i}\vert$$
分类决策规则
k近邻算法中的分类决策规则一般是多数表决。
二:k近邻算法的实现流程
1.收集准备数据:可以使用任何方法
2.计算已知类别数据集中的点与新样本点之间的距离并对其进行排序
3.选取合适的最近的k个点
4.进行平均或投票:在回归问题中,对于这k个点进行平均。对于分类问题,统计这K个点所在类别出现的频率,选取出现最高的作为新样本点的类别
5.返回结果作为当前点的预测值。
三:一个关于k近邻算法的例子
糖尿病预测算法
数据准备:
收集数据并将数据分为训练集和测试集
将人的身体状态(血压,胰岛素,葡萄糖等等)作为输入,是否患病作为输出
数据集如下所示
数据预处理
特征化处理
将数据划分为训练集和测试集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=0)
print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)
对收集来的数据特征进行标准化处理
引入knn模型
n_neighbors:就是选取最近的点的个数k
p=2,metric='euclidean':使用欧几里得计算距离
classifier = KNeighborsClassifier(n_neighbors=11,p=2,metric='euclidean')
对测试集进行模型的训练
classifier.fit(X_train,y_train)
进行预测
y_pred = classifier.predict(X_test)
评估模型效果
对代码进行精确度评估
print(accuracy_score(y_test,y_pred))
结果为0.8181818181818182
证明本代码预测准度较高
其中关于k值的选择,可以用交叉验证或者网格搜索。
四:k近邻算法的优缺点
1.优点:算法简单易于理解实现且参数量较少
2.缺点:数据越多,计算量越大,效率越低,因此其难以运用到大型的数据集当中