kNN及Python实现

一.背景引入

最近邻(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,有其合理性。

参考文献:

https://www.cnblogs.com/ybjourney/p/4702562.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值