K-近邻算法-理论原理

一、K-近邻算法原理

如图所示,数据表中有两个属性,两个标签(A,B),预测最后一行属于哪种标签。

属性一 属性二 标签
2.1 1.2 A
1.3 2.5 B
1.4 2.3 B
2.2 1.3 A
2.3 1.5 A
2.1 1.4

 通过可视化数据,可以看到A和B分别集中某一领域,观察可见,第六行(2.1,1.4)比较靠近标签A。

  

K-近邻原理:因为未知标签的属性是已知的,可以通过计算未知标签的属性与已知标签的属性的距离,参数K表示最近邻居的数目,如当K=3,即取最近的三个距离值,通过概率论,三个之中哪个标签占的概率高就代表,未知标签就是等同此标签。

公式: 

例如:点(1,0)与(2.3)之间的距离计算为:

            ((1-0)^2 +(2-3)^2)再开方

《机器学习实战》这本书原话: 

对未知类别属性的数据集中的每个点依次执行以下操作:

(1) 计算已知类别数据集中的点与当前点之间的距离;

(2) 按照距离递增次序排序;

(3) 选取与当前点距离最小的k个点;

(4) 确定前k个点所在类别的出现频率;

(5) 返回前k个点出现频率最高的类别作为当前点的预测分类。

 

二、代码处理K-近邻算法步骤

 1 import numpy as np  #导入numpy模块
 2 import operator as op  #导入operator模块
 3 import operator 
 4 
 5 
 6 #生成训练数据函数
 7 def createDataSet():
 8     dataSet = np.array([[2.1,1.2],[1.3,2.5],[1.4,2.3],[2.2,1.3],[2.3,1.5]])  #数据集的规模是四行两列的数组
 9     labels = ['A','B','B','A','A']  #数据集每一条记录所对应的标签
10     return dataSet, labels  #返回数据集数据和它对应的标签 
#K-NN预测分类函数

#inX:一条未知标签的数据记录
#dataSet:训练数据集
#labels:训练数据集每一条记录所对应的标签
#k:事先人为定义的数值
def classify0(inX, dataSet, labels, k):
    #获取数据集的行数或者记录数,.shape[0]:获取矩阵的行数,.shape[1]:获取数据集的列数
    dataSetSize = dataSet.shape[0]  
    #将修改规模后的未知标签的数据记录与训练数据集作差
    diffMat = np.tile(inX, (dataSetSize,1)) - dataSet  
    #再将对应得到的差值求平方
    sqDiffMat = diffMat**2  
    #横向求得上面差值平方的和,axis=1:表示矩阵的每一行分别进行相加
    sqDistances = sqDiffMat.sum(axis=1)
    #再对每条记录的平方和开方,得到每一条已知标签的记录与未知标签数据的距离
    distances = sqDistances**0.5
    #对求得的距离进行排序,返回的是排序之后的数值对应它原来所在位置的下标
    sortedDistIndicies = distances.argsort()  
    #创建一个空的字典,用来保存和统计离未知标签数据最近的已知标签与该标签的个数,标签作为字典的key(键),该标签的个数作为字典的value(值)
    classCount={}          
    for i in range(k):
        #sortedDistIndicies[i]排序之后得到的k个离未知标签数据最近的训练数据记录下标,比如是第二条记录,那它就等于1(下标从零开始)
        #voteIlabel就是:训练数据第sortedDistIndicies[i]条记录的标签
        voteIlabel = labels[sortedDistIndicies[i]]
        #把上面得到的那个标签作为字典的键,并且累计k个标签中,该标签有多少个,这个累计个数作为该标签的键值,也就是value
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    #对上面循环得到的标签统计字典进行按值(标签的累计数)排序,并且是从大到小排序
    #下面的写法是固定的
    #classCount.items():得到字典的键和值两个列表
    #key=operator.itemgetter(1):指明该排序是按字典的值从小到大排序,与键无关
    #reverse=True:从大到小排序
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
    #统计数最大的那个标签,作为对未知标签的预测,也就是该返回标签就是未知标签数据inX的预测标签了
    return sortedClassCount[0][0]
#填写一个预测属性值,输出属性对应的标签 aa
= classify0([1.2,2.3], dataSet, labels, 3) print(aa)

以上就是简单的K-近邻算法的理论原理和代码实现过程

 以上就是我的拙见,非常感谢您能看到这里,有什么问题可以评论指正哦。

如有问题请留言,谢谢!
原文地址:https://www.cnblogs.com/yunsi/p/11061781.html