机器学习中常用的分类算法 k-近邻算法:
分类是什么意思?
本人口述:存在一个样本集,简单理解为原有的数据,数据包含了样本,和样本对应的标签,每一个样本可以有多个标签,分类就是当给出一个新的数据,根据原有的数据样本集给出这个数据所对应的标签(分类)
k-近邻算法的原理
近邻算法:输入没有标签的新数据后,将新数据的每一个特征与样本集中的数据经行比较,k-近邻算法是一种将数据集建立在数轴坐标下,也就是说每个数据集的数据点表示的是一个关系数据轴里面的坐标点,同时每一个点都有特有的标签。
要知道新的新的数据点的标签(分类),就要计算这个数据坐标点和数据集里面所有的坐标点的数据的距离,
计算所有点的距离之后,排序,距离越近当然表示和这个数据点很相似,分到这个标签的可能性也越大!
K-近邻中的含义?k表示的就是通过 计算好的与每个点的距离(从小到大)排序后的提取前K个点,注意可能你不会明白这句话的“点”是什么意思, 这个“点”表示的是输入的数据点在数据集中距离最近的K个数据集点。
提取这几个点之后再统计距离最近的前K个点的标签个数,标签越多的就是这个数据点的(标签)分类
例程:
写在前面:本例子使用python语言实现,主要涉及numpy库处理,里面包含了非常简单的矩阵运算,和numpy 库函数的实用。本例子会给出一些numpy库函数详细说明的链接。
- 建立数据集:
-数据集是一个二维坐标,里面有四个点,标签为A,A, B,B,这个直接看代码吧!
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
#先测试下
if __name__ == '__main__':
group,labels = createDataSet()
print(group)
print(labels)
运行结果:
开始kNN分类:
- 制作数据集,这个部分最好是结构化的
- 计算数据点和数据集中没个点的距离
- 将距离排序并且取前K个点
- 将前K个点所对应的标签排序,标签分类数量最多的就是这个数据点的分类
函数体:
def classify0(inX,dataSet, labels, k):
-
inX,表示输入的数据
-
dataSet,表示数据坐标,这里是一个numpy.array类型
-
labels 标签
-
k 就是k值
还是边看代码边理解吧
新手不懂可以看我之前的博客:
numpy.tile()函数看这里:
https://blog.csdn.net/weixin_44119512/article/details/102423333
关于字典排序看这里:
https://blog.csdn.net/weixin_44119512/article/details/101473850
关于numpy.sum求和不懂看这里:
https://blog.csdn.net/weixin_44119512/article/details/102540262
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):
print(dataSet.shape)#以元组的结构返回N行*M列
dataSetSize = dataSet.shape[0]#[0]表示行
diffMat = tile( inX , (dataSetSize, 1)) - dataSet
#tile函数是什么?点这里:https://blog.csdn.net/weixin_44119512/article/details/102423333
#diffMat表示各个数据集的点与inX的差
print("diffMat= ",diffMat)
sqDiffMat = diffMat **2
print("sqDiffMat=",sqDiffMat)
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances ** 0.5
print("distances = ",distances)
sortedDistIndices = distances.argsort()
#index的复数形式 表示索引
''' 在中argsort函数 排序函数,返回array类型 argsort函数返回的是数组值从小到大的元素的索引值 刚好是距离小到大的,如果大到小可以考虑反向索引 有点像是指针,存储的是真正数组的小到大的索引值 '''
print(sortedDistIndices)
classCount = {
}
for i in range(k):
#统计向量在前K个点(最近的几个标签是谁) 在数据集的标签频率,频率越高说明越接近该分类的标签
voteIlabel = labels[sortedDistIndices[i]]
print(voteIlabel)
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
print(classCount)
#以下代码是排序,选取频率最大的标签,不一定选取一个
#排序看不懂的话 先来看看这个:
#https://blog.csdn.net/weixin_44119512/article/details/101473850
sortedClassCount = sorted(classCount.items(),key= operator.itemgetter(1),reverse=True)
print(sortedClassCount)
return sortedClassCount[0][0]
if __name__ == '__main__':
group,labels = createDataSet()
print(classify0([0,0.2],group,labels,3))
最后啰嗦一句:numpy 不是很懂没关系,可以先一句一句代码打印结果出来看,然后按照步骤来就可以了,遇到不懂的可以看看我的链接。
运行结果:
(4, 2)
diffMat= [[-1. -0.9]
[-1. -0.8]
[ 0. 0.2]
[ 0. 0.1]]
sqDiffMat= [[1. 0.81]
[1. 0.64]
[0. 0.04]
[0. 0.01]]
distances = [1.3453624 1.28062485 0.2 0.1 ]
[3 2 1 0]
B
B
A
{‘B’: 2, ‘A’: 1}
[(‘B’, 2), (‘A’, 1)]
B
今天的文章机器学习实践之kNN(k-近邻)算法原理及python代码实现介绍分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/66001.html