KNN分类是一种“投票机制”
选取K个最近的数据进行投票操作,什么类型的数据多即票数多,则测试数据就被分为该类型。
至于最近的概念,就是计算距离
我们使用欧式距离L2公式:
这里进行一个简单的K=1的KNN分类的python实现
import numpy as np
import operator
def createdataset(): #创建数据集
group = np.array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ['A', 'B', 'C', 'D'] #定义标签
return group, labels
#对于KNN我们一般都使用欧式距离进行分类 d(I1 - I2) = √(∑ (Ip1 - Ip2)**2
def classify(Inx, Dataset, labels, k):
DataSetSize = Dataset.shape[0] #获取数据的行数,shape[1]位列数
diffmat = np.tile(Inx, (DataSetSize, 1)) - Dataset #将4个数据扩展为4x1的矩阵然后相减,其实就是原点对数据的距离差值
SqDiffMat = diffmat**2 #平方
SqDistances = SqDiffMat.sum(axis=1) #将矩阵的每一行向量相加求和
Distance = SqDistances**0.5 #开方
print(Distance)
SortedDistanceIndicies = Distance.argsort() #对矩阵进行排序
ClassCount = {}
for i in range(k):
VoteiLabel = labels[SortedDistanceIndicies[i]] #直接挑选出距离最近的一个数据
ClassCount[VoteiLabel] = ClassCount.get(VoteiLabel, 0) + 1 #相同的分类进行"投票"操作
SortedClassCount = sorted(ClassCount.items(), key = operator.itemgetter(1), reverse = True) #对ClassCount进行排序
return SortedClassCount[0][0]
Groups, Labels = createdataset() #赋值
Result = classify([0, 0], Groups, Labels, 1) #分类
print(Result) #结果
最后结果为
[ 1.48660687 1.41421356 0. 0.1 ]
C