kNN原理:
对于一个给定的训练集,我们知道训练样本中的每组数据特征及其分类标签。然后输入没有标签的新数据,将新数据的每个特征与训练集中的每个特征进行比较,选取特征最相似(最近邻:k=1)的分类标签,一般来说,我们只选取前 k 个最相似的分类标签,这也是 k-近邻算法中 k 的由来,通常 k 不超过 20。最后,选择 k 个数据中出现次数最多的分类标签作为新数据的分类结果。
K-近邻算法的一般流程
收集数据:可以使用任何方法
准备数据:距离计算所需要的数值,最好是结构化的数据格式
分析数据:可以使用任何方法
训练算法:此步骤不适用于K-近邻算法
测试算法:计算错误率
使用算法:首先需要输入样本数据和结构化的输出结果,然后运行K-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。
K近邻算法伪代码:
对未知类别属性的数据集中的每个点依次执行以下操作:
(1)计算已知类别数据集中的点与当前点之间的距离;
(2)按照距离递增次序排序;
(3)选取与当前点距离最小的k和点;
(4)确定前k个点所在类别的出现频率;
(5)返回当前k个点出现频率最高类别作为当前点的预测分类。
python3.5函数代码:
import numpy as np
import operator
group = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
def classify0(inX,dataSet,labels,k):
dataSetSize=dataSet.shape[0]
#距离计算,新的数据与样本的距离进行减法
diffMat = np.tile(inX, (dataSetSize,1)) - dataSet
#对数组的每一项进行平方
sqDiffMat=diffMat**2
#数组每个特征值进行求和
sqDistances=sqDiffMat.sum(axis=1)
#每个值开方
distances=sqDistances**0.5
#索引值排序
sortedDistIndicies = distances.argsort()
#选取距离最小的前k个值进行索引,从k个中选取分类最多的一个作为新数据的分类
classCount={}
for i in range(k):
voteIlabel=labels[sortedDistIndicies[i]]
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
#返回前k个点中频率最高的类别
return sortedClassCount[0][0]
print(classify0([0,0],group,labels,3))
out:B
网友评论