K最近邻算法
K最近邻(K-Nearest-Neighbour,KNN)算法是机器学习里简单易掌握的一个算法。通过你的邻居判断你的类型,“近朱者赤,近墨者黑”表达了K近邻的算法思想。
一.算法描述:
1.1 KNN算法的原理
KNN算法的前提是存在一个样本的数据集,每一个样本都有自己的标签,表明自己的类型。现在有一个新的未知的数据,需要判断它的类型。那么通过计算新未知数据与已有的数据集中每一个样本的距离,然后按照从近到远排序。取前K个最近距离的样本,来判断新数据的类型。
通过两个例子来说明KNN算法的原理
(1)下图中,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。

从该图中可以看出K值的选取对类别的判断具有较大的影响,K的选择目前没有很好的办法,经验规则K值一般低于训练样本的开平方。
(2)有六部已知类型的电影,有人统计了电影场景中打斗次数和接吻次数,如下表。最后一行表示有一部新的电影,统计了其中打斗和接吻的次数,那么如何判断这部电影是爱情片还是动作片。
|
电影名称 |
打斗次数 |
接吻次数 |
电影类型 |
|
California Man |
3 |
104 |
Romance |
|
He’s Not Really into Dudes |
2 |
100 |
Romance |
|
Beautiful Woman |
1 |
81 |
Romance |
|
Kevin Longblade |
101 |
10 |
Action |
|
Robo Slayer 3000 |
99 |
5 |
Action |
|
Amped II |
98 |
2 |
Action |
|
未知 |
18 |
90 |
Unknown |
将打斗次数和接吻次数分别作为x,y轴,得到下图

?表示未知电影的未知,然后计算该位置到其他点的距离,假定K=3,可知,距离最近都是爱情片,因此判定该电影也是爱情片。
1.2 KNN算法的优缺点
该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。因此可以采用权值的方法(和该样本距离小的邻居权值大)来改进。
该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。
1.3 算法执行步骤:
(1)生成向量位置
(2)计算样本集到新数据的距离
(3)对样本集按距离进行排序
(4)根据K选取样本,判定类型
二.Python实现
1.简单实现
创建数据集并实现knn算法
#knn agorithm***
#2014-1-28 *** from numpy import
import operator def createDataSet():
group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels=['A','A','B','B']
return group,labels def classify0(inX,dataSet,labels,k):
dataSetSize=dataSet.shape[0]
diffMat=tile(inX,(dataSetSize,1))-dataSet
ddMat=diffMat**2
dsumMat=sum(ddMat,axis=1)
deqrMat=dsumMat**0.5
sortMat=deqrMat.argsort()
dic={}
for i in range(k):
lab=labels[sortMat[i]]
dic[lab]=dic.get(lab,0)+1
maxlabelcout=sorted(dic.iteritems(),key=operator.itemgetter(1),reverse=True)
return maxlabelcout[0][0]
对测试数据进行类型判断
#knn *********
#run the knn1 with [0,0]****
#2014-1-28 *********
#zhen ********* import knn1 group,labels=knn1.createDataSet()
print group
print labels
g=knn1.classify0([0,0],group,labels,3)
print g
2.实际应用-约会网站
###knn agorithm
###2014-1-28 from numpy import *
import operator #knn
def classify0(inX,dataSet,labels,k):
dataSetSize=dataSet.shape[0]
diffMat=tile(inX,(dataSetSize,1))-dataSet
ddMat=diffMat**2
dsumMat=sum(ddMat,axis=1)
deqrMat=dsumMat**0.5
sortMat=deqrMat.argsort()
dic={}
for i in range(k):
lab=labels[sortMat[i]]
dic[lab]=dic.get(lab,0)+1
maxlabelcout=sorted(dic.iteritems(),key=operator.itemgetter(1),reverse=True)
return maxlabelcout[0][0] def fileopen(filename):
f=open(filename)
flines=f.readlines()
fsize=len(flines)
index=0
mat=zeros((fsize,3))
labels=[]
for line in flines:
line=line.strip()
list=line.split('\t')
mat[index,:]=list[0:3]
labels.append(int(list[-1]))
index+=1
return mat,labels def autonorm(Dataset):
dmin=Dataset.min(0)
dmax=Dataset.max(0)
ranges=dmax-dmin
datanorm=zeros(shape(Dataset))
m=Dataset.shape[0]
datanorm=Dataset-tile(dmin,(m,1))
datanorm=datanorm/tile(ranges,(m,1))
return datanorm,ranges,dmin def classTest():
hoRatio=0.1
mat,lables=fileopen('datingTestSet2.txt')
dataNorm,ranges,dmin=autonorm(mat)
m=mat.shape[0]
numTest=int(m*hoRatio)
errorCount=0.0
for i in range(numTest):
lablesTest=classify0(dataNorm[i,:],dataNorm[numTest:m,:],\
lables[numTest:m],3)
if (lablesTest!=lables[i]):
errorCount+=1.0
print "the classifier came back with:%d,the real answer is:%d"\
%(lablesTest,lables[i])
print "the total error rate is: %f" % (errorCount/numTest) def classifyperson():
resultTypeList=['not at all','in small doses','in large doses']
percentGame=float(raw_input(\
"percentage of time spent playing video games?"))
miles=float(raw_input("miles earned per year?"))
iceCream=float(raw_input("liters of ice cream per year?"))
mat,lables=fileopen('datingTestSet2.txt')
dataNorm,ranges,dmin=autonorm(mat)
arr=array([miles,percentGame,iceCream])
result=classify0((arr-dmin)/ranges,dataNorm,lables,3)
print "You will probably like this person: ",\
resultTypeList[result-1]
3.手写识别
K最近邻算法的更多相关文章
- 【算法】K最近邻算法(K-NEAREST NEIGHBOURS,KNN)
K最近邻算法(k-nearest neighbours,KNN) 算法 对一个元素进行分类 查看它k个最近的邻居 在这些邻居中,哪个种类多,这个元素有更大概率是这个种类 使用 使用KNN来做两项基本工 ...
- 图说十大数据挖掘算法(一)K最近邻算法
如果你之前没有学习过K最近邻算法,那今天几张图,让你明白什么是K最近邻算法. 先来一张图,请分辨它是什么水果 很多同学不假思索,直接回答:“菠萝”!!! 仔细看看同学们,这是菠萝么?那再看下边这这张图 ...
- 《算法图解》——第十章 K最近邻算法
第十章 K最近邻算法 1 K最近邻(k-nearest neighbours,KNN)——水果分类 2 创建推荐系统 利用相似的用户相距较近,但如何确定两位用户的相似程度呢? ①特征抽取 对水果 ...
- 12、K最近邻算法(KNN算法)
一.如何创建推荐系统? 找到与用户相似的其他用户,然后把其他用户喜欢的东西推荐给用户.这就是K最近邻算法的分类作用. 二.抽取特征 推荐系统最重要的工作是:将用户的特征抽取出来并转化为度量的数字,然后 ...
- [笔记]《算法图解》第十章 K最近邻算法
K最近邻算法 简称KNN,计算与周边邻居的距离的算法,用于创建分类系统.机器学习等. 算法思路:首先特征化(量化) 然后在象限中选取目标点,然后通过目标点与其n个邻居的比较,得出目标的特征. 余弦相似 ...
- PCB 加投率计算实现基本原理--K最近邻算法(KNN)
PCB行业中,客户订购5000pcs,在投料时不会直接投5000pcs,因为实际在生产过程不可避免的造成PCB报废, 所以在生产前需计划多投一定比例的板板, 例:订单 量是5000pcs,加投3%,那 ...
- K最近邻算法项目实战
这里我们用酒的分类来进行实战练习 下面来代码 1.把酒的数据集载入到项目中 from sklearn.datasets import load_wine #从sklearn的datasets模块载入数 ...
- 机器学习【一】K最近邻算法
K最近邻算法 KNN 基本原理 离哪个类近,就属于该类 [例如:与下方新元素距离最近的三个点中,2个深色,所以新元素分类为深色] K的含义就是最近邻的个数.在sklearn中,KNN的K值是通过n ...
- 机器学习-K最近邻算法
一.介绍 二.编程 练习一(K最近邻算法在单分类任务的应用): import numpy as np #导入科学计算包import matplotlib.pyplot as plt #导入画图工具fr ...
- 转载: scikit-learn学习之K最近邻算法(KNN)
版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ================== ...
随机推荐
- SSIS 学习(7):包配置(下)【转】
经过前面几个章节的学习,我们开发的ETL包算已经完成一大半了,但是还不够完美,正如一场足球比赛,前面大家打得很辛苦,传接得也很漂亮,但 是临门一脚的技术不过关,进不了球,一切都是白搭.今天我们就来为大 ...
- 安装tomcat 证书
创建证书keystore 1) Mdmc用户登录服务器,执行如下命令: keytool -genkey -v -alias tomcat -keyalg RSA -keystore tomc ...
- HDU 4433 locker
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4433 这是一道2012年ACM天津赛区现场赛的题目,大意是给出两串数字,求用最少的转换次数将一串(A) ...
- [改善Java代码]使用构造块精炼程序
建议36: 使用构造代码块精炼程序 什么叫代码块(Code Block)?用大括号把多行代码封装在一起,形成一个独立的数据体,实现特定算法的代码集合即为代码块,一般来说代码块是不能单独运行的,必须要有 ...
- 关于Eclipse(MyEclipse)中一次性批量导入多个项目Project.
以前更换Eclipse(MyEclipse)的时候要想把原Eclipse中的项目导入到新的Eclipse中的做法是: 1.先把原Eclipse中工作空间中的项目(不包括.metadata文件夹)复制到 ...
- Java反转单链表(code)
主要是面试中可能会经常碰上该类似操作,尤其是稍大点公司,面试官可能并不在乎你能不能搞定该题,但是这类型题目最是能体现程序员的思维状态 ---一个迷糊头脑的程序员 怎能立志改变这个世界 /** * @a ...
- 关于Merge的整理--AndroidScreenSlidePager开源库中用到的
在做AndroidScreenSlidePager开源库练习demo的时候,发现布局文件使用的是<merge>标签而不是<FrameLayout>标签.作者给出的说法是:Cir ...
- 转: 基于nginx的hls直播系统
转自:http://blog.csdn.net/cjsafty/article/details/9108587 看点: 1. 详细解解答了 nginx rtmp配置过程. 前写了一篇基于nginx的h ...
- iOS开发者如何提高自己的水平(转)
阅读. 把一大堆的知识塞进脑子里.随着时间流逝,终归有一些会留在脑海里.我觉得有些东西读起来还挺有意思,那么也能算作一种愉快的消遣. 分析. 多去熟悉并了解一些工具,从高层的到底层的,不要害怕去使用他 ...
- HTML5与CSS3基础教程第八版学习笔记16-21章
第十六章,表单 HTML5引入了新的表单元素.输入类型和属性,以及内置的对必填字段.电子邮件地址.URL以及定制模式验证. 元素: <input type="email"&g ...