K-近邻算法概述
K-近邻算法采用测量不同特征值之间的距离方法进行分类
优点:精度高、对异常值不敏感、无数据输入假定
缺点:计算复杂度高、空间复杂度高
适用数据类型:数值型和标称型
工作原理:存在一个样本数据集,且样本集中每个数据都存在标签,即我们知道样本集中每个数据对应的分类。输入没有标签的新数据之后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据的分类标签。通常只取前k个最相似的数据,k往往是不大于20的整数。最后选择k个最相似数据中出现次数最多的分类作为新数据的分类。
创建名为knn.py的Python模块,在文件中添加下面的代码:
from numpy import * #科学计算包
import operator #运算符模块
def createDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
return group,labels
保存文件,改变当前路径到存储knn.py的位置。进入Python交互式开发环境,输入如下命令导入刚编辑好的Python模块。
import knn
然后输入如下命令创建变量group和labels
group,labels=knn.createDataSet()
此时可输入变量名以检验是否正确的定义了变量。
Mac可参考如下操作:
打开终端,找到刚存储的knn.py文件
为了简单地实现数据可视化,对于每个数据点通常只使用两个特征。向量labels包含了每个数据点的标签信息,labels包含的元素个数等于group矩阵行数。这里我们将数据点(1,1.1)定义为类A,数据点(0,0.1)定义为类B。
分类函数伪代码
对未知类别属性的数据集中的每个点依次执行以下操作:
1.计算已知类别数据集中的点与当前点的距离;
2.按照距离递增次序排序;
3.选取与当前点距离最小的k个点;
4.确定前k个点所在类别的出现频率;
5.返回前k个点出现频率最高的类别作为当前点的预测分类。
Python函数代码实现:
def classify0(inX,dataSet,labels,k): #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] #排序
该函数有四个输入参数:用于分类的输入向量是inX,输入的训练样本集是dataSet,标签向量是labels,参数k表示用于选择近邻的数目,其中标签向量的元素数目和矩阵dataSet的行数相同。该函数中计算距离使用的是欧式距离,即
计算完所有点之间的距离后,对数据按照从小到大的次序排序,随后确定前k个距离最小元素所在的分类,最后,将classCount字典分解成元组列表,使用运算符模块的itemgetter方法,按照第二个元素的次序对元组进行排序(逆序),最后返回频率最高的元素标签。
为预测数据所在分类,在python提示符中输入下列命令:
knn.classify0([0,0],group, labels,3)
输出结果为B
分类器构造完成。