1.K近邻算法概念
K近邻算法(K Nearest Neighbor算法,即KNN算法),是一个经典的机器学习算法,主要根据新数据与样本数据间的距离来判断所属类别。关于距离的测量通常采用以下几种方法:欧氏距离、曼哈顿距离、切比雪夫距离、余弦等。KNN算法的详细思想概念可以参看文章1和文章
2.K近邻算法优缺点
优点:精度高、对异常值不敏感、无数据输入假定;
缺点:计算复杂度高、空间复杂度高。
适用数据范围:数值型和标称型
3.K近邻算法一般流程
1.收集数据:可以使用任何方法;
2.准备数据:距离计算所需数值,最好是结构化的数据格式;
3.分析数据:可以使用任何方法;
4.训练算法:此步骤不适用K近邻算法;
5.测试算法:计算错误率;
6.使用算法:首次需要输入样本数据和机构化的输出结果,然后运行K近邻算法判断输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。
4.简单示例
#KNN.py
#coding = utf-8
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
def classify0(inX,dataSet,labels,k):
dataSetSize = dataSet.shape[0] #读取dataSet的第一维长度
#距离计算
newMat= tile(inX, (dataSetSize,1)) #将inX重复成dataSetSize行
print('newMat= ',newMat)
diffMat = newMat-dataSet
print('diffMat= ',diffMat)
sqDiffMat = diffMat**2
print('sqDiffMat = ',sqDiffMat)
sqDistances = sqDiffMat.sum(axis=1) #矩阵行向量相加
print('sqDistances=',sqDistances)
distances = sqDistances**0.5
print('distance = ',distances)
sortedDistIndicies = distances.argsort() #返回排序后的索引值
print('sortedDistI = ',sortedDistIndicies)
#选择距离最小的K个点
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
#排序
print(classCount.items())
print(operator.itemgetter(1))
#operator模块提供的itemgetter函数用于获取对象的哪些维的数据,这里operator.itemgetter(1)是根据第二个域的数据来排序
#reverse表示升序还是降序排列,默认是false升序,而降序则是true
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
#test.py
import KNN
group,labels = KNN.createDataSet()
result = KNN.classify0([0,0], group, labels, 3)
print(result) # B