KNN算法
什么是KNN算法?
个人觉得比较通俗的解释是:有几个类别,已经分好了,现在又来了一个数据,这个数据应该归为哪一类的,像哪个不就归哪一类吗。怎么个像法呢?举例说一下:
比方说我老家在离安徽,江西,浙江都比较近,那么我是哪个省的呢?这里排除政治划分,就考虑距离因素。比方我是在A城市,安徽有B,C,D三个城市;江西有E,F,G三个城市;浙江也有H,I,J三个城市。那么我可以分别计算一下A到各个城市的距离,如何按距离从小到大排序一下。我就看看排最前面4个城市都是哪个省的。计算到浙江有两个,安徽有一个,江西有一个。那么我就是浙江省的了(哈哈,我本来就是浙江滴)。
这是一种分类思想。下面是关于iris数据集的KNN具体应用,来预测鸢尾花的种类。
下面是代码:
from numpy import *
from sklearn import datasets
import operator
def knn(k,testdata,traindata,labels):
#得到训练数据的行数
datasize = traindata.shape[0]
#将测试数据的维数扩展到和训练数据一样的维数,并计算差值
dif = tile(testdata,(datasize,1)) - traindata
#计算差值平方
sqdif = dif**2
#每一行求和
sumdif = sqdif.sum(axis = 1)
#开方求距离
distance = sumdif**0.5
#将距离排序
sortdis = distance.argsort()
count = {}
#取距离最近的k个数据
for i in range(0,k):
vote = labels[sortdis[i]]
#统计类别个数
count[vote] = count.get(vote,0)+1
sortcount = sorted(count.items(),key = operator.itemgetter(1),reverse = True)
return sortcount[0][0]
traindata = datasets.load_iris().data
testdata = [[6.3, 2.5, 5.3 , 1.9]]
labels = datasets.load_iris().target
label = knn(3,testdata,traindata,labels)
if label == 0:
print("setosa")
if label == 1:
print("versicolor")
if label == 2:
print("virginica")
距离计算方法大家都知道,就一步步去完成就可以了。
距离计算完成后,对其进行排序
sortdis = distance.argsort()
接下来是统计距离最近的K个数据
for i in range(0,k):
vote = labels[sortdis[i]]
#统计类别个数
count[vote] = count.get(vote,0)+1
出现一次类别,就+1
最后是找出出现次数最多的类别:
sortcount = sorted(count.items(),key = operator.itemgetter(1),reverse = True)
代码的意思为按字典中值得大小进行降序排序,key = operator.itemgetter(1)表示的是字典的值。
最后是载入数据集,利用KNN进行预测。预测的结果为:virginica