k-近邻算法采用测量不同特征值之间的距离方法进行分类。
工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最邻近)的分类标签。
一般来说,只选择样本数据集中前k个最相似的数据,这就是k-邻近算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
from numpy import * #导入科学计算包numpy
import operator #运算符模块
def createDataSet(): #创建数据集和标签
group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels=['A','A','B','B'] #label包含的元素个数等于group矩阵行数
return group,labels
def classify0(inX,dataSet,labels,k):
dataSetSize=dataSet.shape[0]
diffMat=tile(inX,(dataSetSize,1))-dataSet
sqDiffMat=diffMat**2
sqDistances=sqDiffMat.sum(axis=1)
distances=sqDistances**0.5 #距离计算
sortedDistIndicies=distances.argsort()
classCount={}
for i in range(k):
voteIlabel=labels[sortedDistIndicies[i]]
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 #选择距离最小的K个点
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) #排序
return sortedClassCount[0][0]
Debug:AttributeError: module 'KNN' has no attribute 'classify0'
python2和python3不兼容,将iteritems()改为items(),然后重启PyCharm
结果:
>>> import kNN
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'kNN'
>>> import KNN
>>> group,labels=KNN.createDataSet()
>>> group
array([[1. , 1.1],
[1. , 1. ],
[0. , 0. ],
[0. , 0.1]])
>>> labels
['A', 'A', 'B', 'B']
>>> KNN.classify0([0,0],group,labels,3)
'B'
>>> KNN.classify0([1.1,0.5],group,labels,3)
'A'
网友评论