简单的说k-近邻算法是通过测量不同特征值之间的距离进行分类.
优点:精度高,对异常值不敏感 无数据输入假定.
缺点:计算复杂度高,空间复杂度高.
适用数据范围:数值型和标称型.
它的工作原理:需要有一个样本数据集,也成为训练样本集,并且样本集中每个数据都有标签(有明确的分类信息).输入没有标签的新数据后,将新数据的每个特征和样本集中每个数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签.一般来说我们只选取样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的正整数.最后,选择k个最相似数据中出现最多的分类作为新数据的分类.
实施分类算法
fromnumpyimport*
importoperator
#《机器学习实战》k—近邻算法实现
# numpy是科学计算包,operator是运算符包
#创建数据集和标签
defcreateDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
returngroup,labels
#实施kNN分类算法
# 1.计算已知类别数据集中的点与当前点之间的距离
# 2.按照距离递增次序排序
# 3.选取与当前点距离最近的k个点
# 4.确定k个点所在类别的出现频率
# 5.返回k个点中出现频率最高的类别作为当前点的预测分类
defclassify0(inX,dataSet,labels,k):
#获取训练样本集的行数
dataSetSize = dataSet.shape[0]
#距离计算 使用欧式计算√(a0 - b0)^2 + (a1 - b1)^2
diffMat = tile(inX,(dataSetSize,1)) - dataSet
sqDiffMat = diffMat **2
sqDistances = sqDiffMat.sum(axis=1)
#选择距离最小的k个点
distances = sqDistances **0.5
sortedDistIndicies = distances.argsort()
classCount = {}
foriinrange(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) +1
#排序
# Python3.5中:iteritems变为items
sortedClassCount =sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
returnsortedClassCount[0][0]
这是用Python实现的k-近邻算法 ,windows下在cmd命令窗下可以执行.
把路径切换到该.py文件路径下,cmd中输入python进入Python交互模式,然后输入下面的命令导入编辑的程序模块(kNN是上面模块的文件名):
import kNN
然后创建训练样本集:
group,labels = kNN.createDataSet()
预测数据所在分类:
kNN.classify0([0,0], group, labels, 3)
输出结果应该是'B',也可以改变输入[0,0]为其他值来测试.
网友评论