Python与机器学习(三):K-近邻算法

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





你可能感兴趣的:(python,机器学习,knn)