一.背景引入
最近邻(KNN-K Nearest Neighbor)算法主要用在分类中,思想是物以类聚。
如下图所示:已知蓝色方块和红色三角,问绿圆属于哪一类?
按照KNN的思想,如果距离选在在第一个圆圈中,此时K=3,红角占比2/3,蓝块占比1/3,所以应属于红角;如果距离选在第二个圆中,K=5,则3/5>2/5,应归为蓝快。从简单例子可以看出,KNN的分类效果取决于两个因素:
1.K的选取;
2.距离的度量。
二.算法原理
1.计算目标点到所有点的距离(欧式距离,曼哈顿距离或其他度量距离);
2.将距离从小到大排列;
3.选取K值,即前K个距离值;
4. 统计K个点中各类所占比例,返回占比最多的点类。
三.Python(3.6)实现
1.KNN.py
import numpy as np
import math
from scipy.spatial import distance# compute distances
#create dataset and classes
def createDataSet():
group=np.array([[1.0,2.0],[1.2,0.1],[0.1,1.4],[0.3,3.5]])
label=['A','A','B','B']
return group, label
#function KNN
def classify(input, group,label,K):
input=np.tile(input,(group.shape[0],1))
dist=distance.cdist(input,group,'euclidean')#Euclidean distances
#numpy.argsort() sort number from small to big, return indices.
sortedDistIndex=np.ravel(np.argsort(dist,axis=0))#np.ravel() compresses dimension
classCount={}
for i in range(K):
voteLabel=label[sortedDistIndex[i]]# record classes
#dic.get(key,default):if has key,get value,else get default
classCount[voteLabel]=classCount.get(voteLabel,0)+1
maxCount=0
for k, v in classCount.items():# extract times
if v>maxCount:
maxCount=v
classes=k
return classes
2. test_KNN.py
import sys
import numpy as np
sys.path.append("D:\python36_exercise")# where your KNN.py stores
import KNN
group, label=KNN.createDataSet()
input=np.array([1.1,0.3])
K=3
output=KNN.classify(input,group,label,K)
print("test data:",input,"classification result:", output)
运行结果:
test data: [1.1 0.3] classification result: A
根据KNN算法将点[1.1,0.3]归为类A,有其合理性。
参考文献: