这段代码实现了一个简单的K最近邻(K-Nearest Neighbors,简称KNN)分类算法。KNN是一种基本的分类算法,其思想是:通过测量不同特征值之间的距离来进行分类。它的工作原理是:通过计算待分类样本与已知分类样本之间的距离,取距离最小的K个样本,看这K个样本中哪个类别最多,就把待分类样本分为这个类别。
下面是代码的逐行解释:
-
首先,导入了
numpy
和operator
模块。numpy
用于数组操作,operator
模块提供了一个itemgetter
函数,用于获取项的索引。 -
定义了两个NumPy数组
x
和y
,分别代表输入数据的特征和对应的真实类别标签。 -
定义了一个函数
KNN_classify
,它接受以下参数:x
:输入数据的特征数组。y
:对应的真实类别标签数组。k
:选择最近的K个邻居。test_sample
:待分类的样本。
-
在函数内部,首先计算了测试样本与所有输入数据之间的欧氏距离,并存储在
distance
数组中。 -
使用
np.argsort
对距离进行排序,得到从小到大的索引,存储在sortedIndex
数组中。 -
创建一个字典
labelCount
,用于统计每个类别在最近K个邻居中的出现次数。 -
遍历排序后的索引数组
sortedIndex
的前K个元素,将对应的类别标签添加到labelCount
字典中,并统计每个类别的出现次数。 -
打印出
labelCount
字典,显示每个类别的出现次数。 -
使用
sorted
函数对labelCount.items()
进行排序,得到按出现次数降序排列的列表,并返回出现次数最多的类别及其计数。 -
在
__main__
部分,调用KNN_classify
函数,传入输入数据、标签、邻居个数k=3
,以及待分类的样本np.array([3,4])
。 -
打印出分类结果,即出现次数最多的类别及其计数。
-
打印出分类结果中类别的标签,即
result[0][0]
,这表示最可能的类别标签。
在这个例子中,如果待分类样本是[3,4]
,并且k=3
,那么算法会找到与[3,4]
距离最近的3个样本,统计这3个样本中每个类别的出现次数,然后返回出现次数最多的类别作为分类结果。在给定的数据中,[3,4]
与[4,4]
的距离最近,其次是[4,3]
和[2,2]
,因此,根据这3个样本,算法会将[3,4]
分类为类别B
。
import numpy as np
import operator
x = np.array([[1, 1], [1, 1.5], [2, 2], [4, 3], [4, 4]])
y = np.array(['A', 'A', 'A', 'B', 'B'])
def KNN_classify(x, y, k, test_sample):
distance = np.sum((x - test_sample)**2,axis=1) ** 0.5
sortedIndex=np.argsort(distance)
labelCount={}
for index in sortedIndex[:k]:
label=y[index]
labelCount[label]=labelCount.get(label,0)+1
print(labelCount)
return sorted(labelCount.items(),key=operator.itemgetter(1),reverse=True)[0]
"""
X:输入数据
y:真实值
k:邻居个数
test_sample:待测试样本
return:待测试样本类别
"""
if __name__=="__main__":
result=KNN_classify(x,y,3,np.array([3,4]))
print(result)
print(result[0][0])