其实想想手写那么多字,偶内心是比较拒绝的。不过今天随笔写一点,刚好手边书翻到了KNN分类,那就写一个哈~~
不过还是期待我的机器学习&深度学习十部曲把!!!!!是不是应该加一句颤抖吧!地球人!!!
看这个就明白的哈~~
http://blog.csdn.net/sunshine_java_l/article/details/77905865
OK~现在的主题
KNN分类,不知道你们对于这个是怎么考虑,不知道你们有没有看过里面的源码,还是直接from sklearn import neighbors。是不是大部分第二个,其实如果理解了公式,直接导入包是一个比较高效的行为,但是前提是你懂
我现在说的是如何深入简单理解KNN.
step 1: 数据
不知道要不要下载一个实际的数据,想想算了,太麻烦。随便设置吧
random.randint(10,size=(6,2))
[[0 2]
[4 8]
[8 9]
[8 4]
[1 8]
[5 7]]
labels不能随便了,随机的那我就自己表一下好了
[0,1,2,2,0,1]
看出来了吗?三类哈~~~
step 2:公式
这里有马氏距离,欧氏距离。嗯~欧氏距离公式好打一点,那就用欧氏距离,还有一个问题,这里没有公式编辑器吗???不会吧,还真没有,嗯嗯~~我自己的博客站一定要有这个
算了,将就吧~~~
弄个公式麻烦死了](https://img-blog.csdn.net/20170909101713484?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU3Vuc2hpbmVfSmF2YV9M/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
差评!!!
好了,公式简单的想自杀是不是
,我也是这样觉得,相对于那些求导又微分又泰勒的,这个简直业界良心!
其实
思路很简单,对于输入点与已知
数据的距离,最后得到前k小的数据,通过投票机制得到最优分类!
step 3: 代码
import numpy as np
from numpy import random
import operator
def creatData():
group = np.array([[0 ,2]
, [4 ,8]
,[8 ,9]
, [8 ,4]
, [1 ,8]
, [5 ,7]])
labels = [0,1,2,2,0,1]
return group, labels
def KNN(input, train, labels, k):
trainSize = train.shape[0]
diff = np.tile(input, (trainSize, 1))-train#tile是复制函数
#print(diffMat)
pow2 = diff**2#开平方
#print(sqDiffMat)
pow2Sum = pow2.sum(axis=1)#得到加和
final = pow2Sum**0.5#开方
#print(final)
sortFilan = final.argsort()#这个要注意,这个得到的是排序后的index
#投票
#print(sortFilan)
count = {}
for i in range(k):
votes = labels[sortFilan[i]]#0 2 2
#print(count.get(votes,0))
count[votes] = count.get(votes, 0)+1#
print(count)
sort_Count = sorted(count.values())
maxVote = max(sort_Count)#得到最大投票
label = list(count.keys())[list(count.values()).index(maxVote)]
return label
if __name__=='__main__':
#print(random.randint(10,size=(6,2)))
dataSet, labels = creatData()
label = KNN([0,1], dataSet, labels, 3)
print(label)
step 4:运行得到[0,1]属于第0类。是不是很简单啊!!!
其实自己写明白所有公式比起来自己直接导入包更又成就感,Then, 你可以自己封装KNN包,自己调用,多好~
是吧!!!
打了这么多字,太累了!!!!!!!
再次推荐我即将上线的个人博客
http://blog.csdn.net/sunshine_java_l/article/details/77905865