k近邻
k近邻(k-NearestNeighbor)算法简称kNN。基本思想简单直接,对于一个需要分类的数据实例x,计算x与所有已知类别的样本点在特征空间中的距离。取与x距离最近的k个样本点,统计这些样本点所属占比最大的类别,作为x的分类结果。下图中与绿色点最近的3个点中,2个属于红色类别,则认为x属于红色的类。然而当k=5时,5个最近的点中有3个是蓝色,则认为绿色点属于蓝色类别。
假如在美国某个小镇上,一户人家最近的二十户邻居里面有十四户华裔,三户非裔,三户美国本土居民。我让你猜这户人家是什么人,我想你大概会猜是中国移民。其实这跟k近邻的思想一致,这里k=20。
下面的实例来自《机器学习实战》。
一个女性收集了约会网站中的男人的三个属性作为特征:每年飞行里程、每月打游戏时间的占比,每周消费冰淇淋公升数。她将曾经约会的男人打上标签:不喜欢、一般魅力,极具魅力。为了决定是否跟一个新的男人约会,她想在见面前判断这个男人是不是自己喜欢的类型。下面来两幅图分别是{每月打游戏时间的占比,消费冰淇淋公升数}、{每月打游戏时间的占比,每年飞行里程}的二维图形展示。可以看出使用{每月打游戏时间的占比,每年飞行里程}可以较好地将男人分成三类。
生成图形的代码:
datingDataMat, datingLabels = kNN.file2matrix("datingTestSet2.txt") #print(datingDataMat)
#print(datingLabels[0:20]) fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(datingDataMat[:,0],datingDataMat[:,1], 20.0*array(datingLabels), 15.0*array(datingLabels))
plt.xlabel(u"飞行里程/年", fontproperties='SimHei')
plt.ylabel(u"玩游戏时间百分比", fontproperties='SimHei')
plt.show()
kNN算法流程图:
值得注意的是在最开始的时候要将个特征值进行归一化,否则在计算样本点与待分类点的距离时将由于各个特征的数值的相对大小不同而导致错误。
下面的代码选择datingTestSet2.txt中的一半作为已标记样本集合,对另外一半的样本进行分类。设置k=3,分类正确率为92%。设置k=10时,分类正确率几乎不变,观察{每月打游戏时间的占比,每年飞行里程}的散点图,我认为是处在分类边界上的点以及已标记样本的数量太小导致了分类的正确率无法进一步提升。若使用95%的样本作为已标记样本,对另外的5%的样本类别进行预测,准确率为98%。
#kNN文件参考《机器学习实战》的源码
#源码以及数据集下载链接:http://download.csdn.net/detail/u012491566/6474803
normMat, ranges, minVals = kNN.autoNorm(datingDataMat)
#print('normMat: ', normMat)
#print('ranges: ', ranges)
#print('minVals', minVals) length = normMat.shape[0]
ratio =0.95
numSample = int(ratio*length)
numtest = length - numSample errCnt =0
for i in range(numtest):
val = kNN.classify0(normMat[i,:], normMat[numtest:length,:], datingLabels[numtest:length], 10)
if(val != datingLabels[i]):
errCnt +=1 precision = 1-errCnt/numtest print('precision of prediction:', precision)
kNN算法分析:
kNN算法简单有效,对异常数据不敏感,无数据输入假定。且可以处理分类以及回归问题(对于回归问题,可以将最近的k个点的均值作为该点的预测值)。然而,kNN算法需要保存已知样本集,空间复杂度高;由于需要对每个待分类点计算与所有已知样本点的距离,时间复杂度高。不仅如此,k近邻算法只注重分类点在特征空间中位置信息,并没有去真正理解数据的内在含义。
k近邻的更多相关文章
- K近邻法(KNN)原理小结
K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用.比如,我们判断一个人的人品,只需要观察他来往最密切的几个人的人品好坏就可以得出 ...
- k近邻算法(knn)的c语言实现
最近在看knn算法,顺便敲敲代码. knn属于数据挖掘的分类算法.基本思想是在距离空间里,如果一个样本的最接近的k个邻居里,绝大多数属于某个类别,则该样本也属于这个类别.俗话叫,"随大流&q ...
- 机器学习实战笔记--k近邻算法
#encoding:utf-8 from numpy import * import operator import matplotlib import matplotlib.pyplot as pl ...
- k近邻(KNN)复习总结
摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合内容: 1.算法概述 K近邻算法是一种基本分类和回归方法:分类时,根据其K个最近邻的训练实例的类 ...
- scikit-learn K近邻法类库使用小结
在K近邻法(KNN)原理小结这篇文章,我们讨论了KNN的原理和优缺点,这里我们就从实践出发,对scikit-learn 中KNN相关的类库使用做一个小结.主要关注于类库调参时的一个经验总结. 1. s ...
- 学习笔记——k近邻法
对新的输入实例,在训练数据集中找到与该实例最邻近的\(k\)个实例,这\(k\)个实例的多数属于某个类,就把该输入实例分给这个类. \(k\) 近邻法(\(k\)-nearest neighbor, ...
- K近邻分类法
K近邻法 K近邻法:假定存在已标记的训练数据集,分类时对新的实例根据其K个最近邻的训练实例的类别,通过多数表决等分类决策规则进行预测. k近邻不具有显示学习的过程,是“懒惰学习”(lazy learn ...
- 机器学习PR:k近邻法分类
k近邻法是一种基本分类与回归方法.本章只讨论k近邻分类,回归方法将在随后专题中进行. 它可以进行多类分类,分类时根据在样本集合中其k个最近邻点的类别,通过多数表决等方式进行预测,因此不具有显式的学习过 ...
- k近邻算法的Java实现
k近邻算法是机器学习算法中最简单的算法之一,工作原理是:存在一个样本数据集合,即训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中每一数据和所属分类的对应关系.输入没有标签的新数据之后, ...
随机推荐
- UDP server & client
Server: import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; ...
- IIS无法加载字体文件(*.woff,*.svg)的解决办法
在编写前端代码的过程中经常会遇到使用特定的字体(*.woff,*.svg),此时在加载字体时请求会被返回 Failed to load resource: the server responded w ...
- Android 主题切换 小结
前言 我们用手机的时候经常看到 设置里面有夜间模式和白天模式来更换APP的主题,以前以为很简单,但是实际做起来还是有各种不完美,那么我们也要去了解各种解决方案来丰富我们的知识,现在我们就来看看各种优劣 ...
- JavaWeb-springMVC
<context:component-scan/> 扫描指定的包中的类上的注解,常用的注解有: @Controller 声明Action组件@Service 声明Service组件 ...
- http 中定义的八种请求的介绍
在http1.1协议中,共定义了8种可以向服务器发起的请求(这些请求也叫做方法或动作),本文对这八种请求做出简要的介绍: 1.PUT:put的本义是推送 这个请求的含义就是推送某个资源到服务器,相当于 ...
- Http TCP/IP 协议的关系
转自:http://www.cnblogs.com/ymy124/archive/2012/03/18/2404958.html 项目要求Web服务是高安全级别,在选择.net remoting,we ...
- C++11基于范围的for循环
C++11包含一种新的 for 循环,称为基于范围的 for 循环,可以简化对数组元素的遍历.格式如下: for(Type VarName : Array){ //每个元素的值会依次赋给 VarNam ...
- 网络层、传输层、应用层、端口通信协议编程接口 - http,socket,tcp/ip 网络传输与通讯知识总结
引: http://coach.iteye.com/blog/2024511 什么是TCP和UDP,以及二者区别是什么? TCP的全称为传输控制协议.这种协议可以提供面向连接的.可靠的.点到点的通信. ...
- oracle优化:避免全表扫描(高水位线)
如果我们查询了一条SQL语句,这条SQL语句进行了全表扫描,那到底是扫描了多少个数据块呢?是表有多少数据,就扫描多少块吗?不是的.而是扫描高水位线一下的所有块.有的时候有人经常说,我的表也不大呀,怎么 ...
- Dynamics AX 2012 R2 业务系列-销售业务流程
在博文Dynamics AX R2 业务系列中,Reinhard对这个系列做了一个规划,下面我们就按照规划开始说业务吧. 1.销售的主要职责 其实这里说的职责主要是针对销售文员,并非整天外面满世界跑业 ...