刚才浏览器插件给我推荐的诗句正好听:杏花开了燕飞忙,正是好春光,正好这两天西安天气不错,有点感同身受,就是空气不怎么好,需要下点雨提升一下空气质量了。
K邻近算法(KNN),是一种常用的分类或者是回归算法,给定一个训练样本集合D以及一个需要进行预测的样本x,KNN的思想很简单:对于分类问题,从所有训练样本集合中找到和x最接近的k个样本,然后通过投票法来选择这k个氧泵中出现次数最多的类别作为x的预测结果,,回归问题也是类似,都是找到和x最相近的k个氧泵,然后对这k个样本的标签求平均值,最后得到x的预测结果,KNN的描述如下:
input:训练集,k值,待预测样本x,如果是KNN分类,同时给出类别集合
output:样本所属类别或是预测值y:
1、计算x与所有训练集合中所有氧泵之间的距离,从小到大进行排序,然后返回样本的索引:
2、对于分类问题,投票挑选出前k个样本中包含数量最多的类别:
3、对于回归问题,用前k个样本表情按的均值作为x的估计值:
对于KNN的研究包含三个方面,k值的选取,距离的度量以及如何快速的进行K个邻近的检索。
一、k值选取:
投票法的准则是少数服从多数,k值很小的时候,得到的结果会出现偏差,最邻近算法就是这种情况下的极端(k=1)。其中,样本x的测试结果只由训练集中阈值距离最近的样本决定。但是如果我们的k值选取较大,则可能会将大量其他类别的样本包含进来,极端情况下,将整个训练集的所有氧泵全部都包含进来,这样同样会造成预测错误,一般情况下,我们可以通过交叉验证、再验证集上多次尝试不同的k值来挑选最佳k值。
2、距离的度量:
对于连续变量,一般是用欧氏距离来直接进行距离度量,对于离散变量,可以先将离散变量连续话,然后再用欧氏距离进行度量。
3、快速检索:
训练集和的规模很大的时候,我们怎么样才能快速找到样本x的k个邻近成为计算机实现KNN的关键。
很朴素的思想就是:
1、计算样本x与训练集中所有样本之间的距离,
2、将这些点根据距离从小到大进行排序,选择前k个
算法的时间复杂度是计算到训练集中所有样本距离的时间加上排序的时间,更可取的方法是为训练样本选建立索引,用以减少计算规模,KD树是一种典型的存储k维空间数据的数据结构,建立好KD树之后,给定新样本就可以在树上进行检索,这样就能够降低检索k个邻近的时间,尤其是当训练集样本数远大于样本维度时候。
书上有个基于KNN实现鸢尾花分类的,我们跟着试试看:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier as KNN
if __name__=='__main__':
iris=load_iris()
x_train,x_test,y_train,y_test=train_test_split(iris.data[:,[1,3]],iris.target)
model=KNN()
model.fit(x_train,y_train)
train_score=model.score(x_train,y_train)
test_score=model.score(x_test,y_test)
print("train_score:",train_score)
print("test_score:",test_score)
结果显示:
在训练集上的正确率是0.964285,
在测试集上的正确率是0.947368,
看样子,准确性还不错。