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近邻的更多相关文章

  1. K近邻法(KNN)原理小结

    K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用.比如,我们判断一个人的人品,只需要观察他来往最密切的几个人的人品好坏就可以得出 ...

  2. k近邻算法(knn)的c语言实现

    最近在看knn算法,顺便敲敲代码. knn属于数据挖掘的分类算法.基本思想是在距离空间里,如果一个样本的最接近的k个邻居里,绝大多数属于某个类别,则该样本也属于这个类别.俗话叫,"随大流&q ...

  3. 机器学习实战笔记--k近邻算法

    #encoding:utf-8 from numpy import * import operator import matplotlib import matplotlib.pyplot as pl ...

  4. k近邻(KNN)复习总结

    摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合内容: 1.算法概述 K近邻算法是一种基本分类和回归方法:分类时,根据其K个最近邻的训练实例的类 ...

  5. scikit-learn K近邻法类库使用小结

    在K近邻法(KNN)原理小结这篇文章,我们讨论了KNN的原理和优缺点,这里我们就从实践出发,对scikit-learn 中KNN相关的类库使用做一个小结.主要关注于类库调参时的一个经验总结. 1. s ...

  6. 学习笔记——k近邻法

    对新的输入实例,在训练数据集中找到与该实例最邻近的\(k\)个实例,这\(k\)个实例的多数属于某个类,就把该输入实例分给这个类. \(k\) 近邻法(\(k\)-nearest neighbor, ...

  7. K近邻分类法

    K近邻法 K近邻法:假定存在已标记的训练数据集,分类时对新的实例根据其K个最近邻的训练实例的类别,通过多数表决等分类决策规则进行预测. k近邻不具有显示学习的过程,是“懒惰学习”(lazy learn ...

  8. 机器学习PR:k近邻法分类

    k近邻法是一种基本分类与回归方法.本章只讨论k近邻分类,回归方法将在随后专题中进行. 它可以进行多类分类,分类时根据在样本集合中其k个最近邻点的类别,通过多数表决等方式进行预测,因此不具有显式的学习过 ...

  9. k近邻算法的Java实现

    k近邻算法是机器学习算法中最简单的算法之一,工作原理是:存在一个样本数据集合,即训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中每一数据和所属分类的对应关系.输入没有标签的新数据之后, ...

随机推荐

  1. opencv,图片遍历

    //肤色提取,skinArea为二值化肤色图像 void skinExtract(const Mat &frame, Mat &skinArea) { Mat YCbCr; vecto ...

  2. HTML5的Server-Sent Events介绍////////////////zzz

    HTML5有一个Server-Sent Events(SSE)功能,允许服务端推送数据到客户端.(通常叫数据推送).我们来看下,传统的WEB应用程序通信时的简单时序图: 现在Web App中,大都有A ...

  3. http 协议集合,超级简单

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Web; ...

  4. asp.net页面生命周期请求管道19个事件

    HttpContext: ecb→ HttpWorkerRequest→HttpContext HttpApplicationFactory.获取了HttpApplication实例之后. (1)Be ...

  5. Cellebrite UFED 5.1 发布,全面支持三星 S6 S6 Edge Note5 HUAWEI series

    世界级取证公司Cellebrite 昨天发布了最新的 UFED 5.1 系统更新,4PC全面支持三星S6,S6EDGE NOTE5 以及HUAWEI,LG系列恢复,锁屏密码XX!下面是部分截图 有需要 ...

  6. Ubuntu 反复进入登录框问题

    记录一下,今天碰到一个问题,到ubuntu登陆界面时,输入用户名和密码之后,马上又回到登陆界面 查看了 .xsession-errors. 网上查找了相关资料,想到自己之前装过nvidia的驱动. 卸 ...

  7. 如何:在 ASP.NET 网页中检测浏览器类型

    https://msdn.microsoft.com/zh-cn/library/3yekbd5b(VS.80).aspx private void Button1_Click(object send ...

  8. 分享一个很早之前写的小工具DtSpyPlus

    几年前写的一个获取windows窗体基本信息和屏幕取色的小工具 ,一直在用. 下载地址 http://files.cnblogs.com/dint/SpyPlus.zip

  9. redis.conf配置详细翻译解析

    # redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位, # 通常的格式就是 1k 5gb 4m 等酱紫: # # 1k => 1000 bytes # 1kb ...

  10. MBP使用笔记

    1. 链接测试机命令: 登录:ssh ria@000.000.000.000 然后输入密码即可 退出:exit 2. SwitchySharp导入的是bak文件. 3. 使用goagentFQ的使用的 ...