看到这个名字,是不是觉得很高大上?
看到网上的那些大佬写了一堆的代码,一堆的分析,是不是有点头昏脑胀?
这还是机器学习中最简单的算法么?
# ===================
如果你也遇到了什么这些迷惑,我想选择看这篇文章,可能会对你有很大的帮助,因为我也不喜欢那些复杂的推理什么的。(好吧,只是因为想安慰你们才这么说的)
相信短短的20行代码就会让你快速掌握Knn算法(机器学习中最简单算法)
为了帮助很多对于算法不太理解的人,我做了一些帮助清单(如果遇到Knn算法中,哪个用法或者是函数不懂的话,就看这个清单,都是很短的东西)
1.tile()函数讲解
2.sum(axis = 1)讲解
3.numpy.argsort()函数的讲解
4.operator.itermgetter()函数的讲解
很多很细心的朋友就可以看到,这个代码在网上很多都有,但是,你搜索的很多也是长的差不多的代码,但其实那些代码,现在,在本机上,并不能通过。
但是这个我是在Pycharm 上运行了没有问题的代码。
至于原因,大家可以在仔细比对下代码的差异性,我在这留给大家一个进步的机会,实在看不出来,可以发信息给我。
from numpy import *import operatordef createDataSet():group = array([[1.0, 1.1], [1, 0.9], [0, 0], [0.1, 0.1]])lables = ['A', 'A', 'B', 'B']return group, lablesdef classify0(inX, dataSet, labels, k):# k means how many you need to get your P(x)dataSetSize = dataSet.shape[0]DiffMat = tile(inX, (dataSetSize, 1)) - dataSetsqDiffMat = DiffMat**2sqDistances = sqDiffMat.sum(axis=1)distances = sqDistances**0.5 # 到这里求解了欧式距离(并构成了一个ndarray)sortedDistances = distances.argsort() # 根据排名作为索引 IndexclassCount = {}for i in range(k):voteIlabel = labels[sortedDistances[i]]classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1# 选出了距离最小的k个点,并且做了一个简单的统计sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) #按照第一个(从0开始数)进行排序return sortedClassCount[0][0] # 返回的出现次数最多的那个标签# 函数main:group, labels = createDataSet()x = [1, 1]print(classify0(x, group, labels, 2))
第一函数是创造一个数据集(我就按照特性写了个数据集),所以是创造一个数据集,但是实际应用中,多半都是从哪收集的或者是别的什么的方式得到的数据,但是内容没有很大区别。
classify0才是knn算法是实现部分
然后后面那几句是测试代码。(可以理解为main函数,至于为什么我没写main,那是因为我懒)
Knn 的意思就是k个最近邻(会英语的一下就理解了)
就是一堆数据,然后,选一个k
再把你要算的数据拿出来,(inX)放到这个函数中
把这些点那些参数都理解为坐标。
我们想要考虑的那个样本点和原来的数据集距离。
这里用的是欧式距离(是不是逼格很高? 其实就是 根号下的平方和)
如果你上个高中的数学课(或者还没有忘记的话)你所知道的算两点距离的方法就是算的是欧式距离
(对了,你要是上面这个都不知道,要么你自个看看百度百科,要么,你就是点错了才看我这文章的emmm)
算出那么多距离之后,之前不是确定了一个k值了么?就把最小的那前k个拿出来,看下有多少个类型的点。并统计下概率。
就是预测值和概率了。
看完上面的入门版,可以接着看进阶版的代码(还是同样的问题)
最后,老套路,宣传一波自己的公众号!(求关注哇!)
本人中大一肥宅,欢迎大家关注,请扫下面的二维码(〃’▽’〃)