KNN分类算法
1.优缺点
优点:精度高、对异常值不敏感、无数据输入假定
缺点:计算复杂度高、空间复杂度高
适用数据范围:数值型和标称型
2.k近邻算法
如图:X周围最近有5个邻居(距离),其中4个是W1,1个W3,所以判定X是W1类别
3.实现KNN算法
对未知类别属性的数据集中的每个点依次进行以下操作:
1.计算已知类别数据集中的点与未知点之间的距离
2.按照距离递增次序排列
3.选取与未知点距离最小的K个点
4.确定前k个点所在类别出现的频率
5.返回前k个点出现频率最高的类别作为未知点的预测分类
注:通常采用交叉验证方法选取最佳的K值
4.代码实现
# trainData 训练集
# textData 测试集
# labels 分类
import numpy as np
import operator
def KNN(trainData,textData,labels,k):
rowSize = trainData.shape[0] #计算训练集的行数
diff = np.tile(textData,(rowSize,1)) - trainData #计算训练样本和测试样本的差值
# np.tile(testData, (rowSize, 1)) 是将 testData 这个数据扩展为 rowSize 列,这样能避免运算错误
distance = ((diff ** 2).sum(axis=1))** 0.5 #计算距离
sortdistance = distance.argsort() #对所得距离升序排列
count = {}
for i in range(k):
vote = labels[sortdistance[i]]
count[vote] = count.get(vote,0) +1
sortcount = sorted(count.items(),key=operator.itemgetter(1),reverse = True) #对类别出现的频数降序排序
#sorted(count.items(), key=operator.itemgetter(1), reverse=True) 排序函数,里面的参数 key=operator.itemgetter(1), reverse=True 表示按照 count 这个字典的值(value)从高到低排序,如果把 1 换成 0,则是按字典的键(key)从高到低排序。把 True 换成 False 则是从低到高排序
return sortcount[0][0] #返回频数最高的类别
trainData = np.array([[1,2],[5,3.6],[7,6.2],[11,9.6],[12,10.5]])
labels = ["爱情片","爱情片","悬疑片","悬疑片","悬疑片"]
textData1 =[4,3.6]
textData2 =[10,9.2]
X1 = KNN(trainData,textData1,labels,3)
X2 = KNN(trainData,textData2,labels,3)
print(X1)
print(X2)
看一眼运行结果