分类算法 – KNN算法
KNN(K-Nearest Neighbor)是一个分类算法,属于有监督学习。
KNN思想的核心在于:近朱者赤,近墨者黑,根据新样本的k个最近邻居来判定其类别。
1. 理论说明
1.1 算法概论
假设我们已知n个样本的特征和标签(即所属分类),并以此作为样本集A。
当输入一个没有标签的样本b时,我们可以通过比较新样本b与样本集A中的数据对应的特征,然后提取出最为相似的k个数据。
最后我们选取k个最相似的数据中出现次数最多的分类,作为新数据的分类。
1.2 算法步骤
- Step 1:计算已知类别的样本集A中的所有样本与新样本b之间的距离
- Step 2:按照距离的递增次序,对样本集A中的样本进行排序
- Step 3:选取与当前样本b距离最近的k个样本
- Step 4:确定这k个样本所在类别的出现频率
- Step 5:返回这k个样本中出现频率最高的类别作为当前样本b的预测分类
1.3 算法优劣
优势:精度高、对异常值不敏感、算法思想简单、比较适合多分类问题
劣势:计算成本高,中间步骤的储存成本高,对大规模数据不是很友好
1.4 详细问题
①k的选择
和聚类分析中的K-means算法相同,k的选择也是KNN方法的难点所在。
若k很小,结果容易受到噪声和极端值的影响;若k很大,则在选取的近邻中又包含很多无关的点,增加计算量的同时也影响计算结果。
根据经验,我们一般会让k小于样本集A中样本数量的平方根
②距离的度量
在算法中,我们明确说明了要计算已知类别的样本集A中的所有样本与新样本b之间的距离。那我们需要选择哪种距离呢?
当样本特征的单位相同、方差差距不大时,此时选择欧式距离是合理的;
当样本特征的单位不同,并且方差差距较大时,选择欧式距离会更加关注方差大的特征而忽视方差较小的特征,所以此时选取马氏距离效果较好。
python实现:
import numpy as np
from collections import Counter
from math import sqrt
def knn(x_train, y_train, x, k):
distace = [sqrt(np.sum((train_data - x)**2)) for train_data in x_train]
neast = np.argsort(distace)[:k]
label = [y_train[i] for i in neast]
votes = Counter(label)
print("votes: {}".format(votes))
predict = votes.most_common(1)[0][0]
return predict
x = [[0,0],
[1,1],
[2,2],
[10,10],
[11,11],
[12,12]]
y = [0,0,0,1,1,2]
X_train = np.array(x)
y_train = np.array(y)
x = np.array([13,13])
predict = knn(X_train,y_train,x, 3)
print(predict)
参考:https://blog.youkuaiyun.com/weixin_43216017/article/details/86679334

863

被折叠的 条评论
为什么被折叠?



