<机器学习实战笔记>_k-近邻算法

简单的说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]为其他值来测试.

你可能感兴趣的:(<机器学习实战笔记>_k-近邻算法)