本文为学习记录,写的不好请大家指正见谅,互相学习,也为自己巩固学习成果包括后续复习所用!
1.K近邻算法原理
这个是网上找的图,自己就不制作图了,找了一张只有两个特征的图,简单明了
如图所示,横纵坐标分别表示时间和肿瘤大小两个特征值,绿色点为我们需要作出预测分类的值,当我们的k为3的时候(k为超参数,后面会提到),即表示,根据绿色点,找出3个离绿色点最近距离的三个点,如图所示,三个点都为蓝色,即将我们的绿色点分类为恶性肿瘤。
下面我们来看下具体实现的原理
我们这里使用欧拉距离公式 ,即两个点的距离为他每个轴坐标的距离差的平方求和之后再开方,即:
具体实现代码:X_train 为我们训练集,求出的distances就是我们所有点的距离的集合
from math import sqrt
distances = []
for x_train in X_train:
distances = [sqrt(np.sum((x_train - x)**2)) for x_train in X_train]
distances:
[4.812566907609877,
5.229270827235305,
6.749798999160064,
4.6986266144110695,
5.83460014556857,
1.4900114024329525,
2.354574897431513,
1.3761132675144652,
0.3064319992975,
2.5786840957478887]
接下去我们对distances进行处理,由于用的jupyter,我就直接截图了,根据截图,我们得出x属于类别1
scikit-learn 中的knn,k与上文截图中一样,取3
from sklearn.neighbors import KNeighborsClassifier
knn=KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train,y_train)
y_=knn.predict(x.reshape(1,2))
y_
结果截图
2.knn的超参数
上文中我们提到n_neighbors为我们的超参数,但是knn中超参数不止一个,我们列出3个常用的超参数并进行说明
这里有个比较重要的就是weights这个超参数,代表距离的权重,有什么意义呢,我们来看一下下面这图
根据我们上面如果只采用k为3作为我们的超参数,距离最近的三个点,蓝色点2个,红色点一个,所以系统用将绿色点预测为蓝色点,但是我们可以看到,绿色距离红色是最近的。距离蓝色点其实是偏远的。所以这里我们需要考虑距离的权重,也就是我们的超参数weights。
当weights=‘uniform’的时候代表不考虑权重,当weights=‘distance’的时候代表考虑权重,
当我们提到距离的时候,就要提到另一个参数,也就是P参数
我们先来看看明可夫斯基距离公式
当我们的p=2的时候,我们可以看出上述就是我们的欧拉距离公式
再看看源码说明中 可知knn默认采用的是欧拉距离。也就是p=2,metric=‘minkowski’
我们利用网格搜索去代码实现来找出我们最优的超参数
上面部分基本实现了knn的原理和常用超参数说明,更多超参数大家可自行查阅文档,比如n_jobs代表使用的cpu核数等等
下面是距离公式的扩展,一并展示,有时间我还是要更多的自学的,
KNN算法的缺点:
1.效率低下,当有m个样本n个特征的时候,算法的时间复杂度为O(m*n),
2.高度数据相关
3.预测的结果不具有解释性
4,维度灾难:看似相邻的两个样本随着维度增加,距离也会越来越大,解决方法:降维
注释说明:以上截图均来自慕课网liuyubobo老师的课件,代码部分包括代码截图为自己手敲 ,也当做自己学习练习巩固使用。
下一篇:继续复习相关数据归一化的内容,数据归一化对我们的数据有很重要的作用,所以需要明白其中的原理和数学推导