一、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-近邻算法的理论原理和代码实现过程
以上就是我的拙见,非常感谢您能看到这里,有什么问题可以评论指正哦。
如有问题请留言,谢谢!