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. Add&Delete WindowService

    Part One-Add: Step4: Add the new service to windows service: $commandLine = 'D:\IMS\2.16.0.42-DataSe ...

  2. jsp作为服务端,ajax请求回应

    刚学ajax,想以jsp作为服务端,来回应ajax的请求: 代码如下: <!DOCTYPE html> <html> <head lang="en"& ...

  3. android自定义拍照

    调用系统相机,然后在自己的surfaceview上预览,拍照,不废话,直接上源码 package com.example.customecamera; import java.io.File; imp ...

  4. PopupWindowAction breaking MEF import?

    If you use Prism InteractionRequest.PopupWindowAction feature, you might have found the MEF Import a ...

  5. git 常用命令粗略总结

    本文版权归cxun所有,如有转载请注明出处与本文链接,谢谢!原文地址:http://www.cnblogs.com/cxun/p/5630190.html git的功能很强大,但是其实很简单,用来用去 ...

  6. form提交的几种方法

    一. form表单中有 type是submit类型的button,点击 submit,从而会post数据,引发回传. <form action="?" name=" ...

  7. Foundation框架

    1.框架是由许多类.方法.函数.文档按照一定的逻辑组织起来的集合,以便使研发程序变的更容易 清除缓存,删除这个文件夹下的所有文件/Users/fanyafang/Library/Developer/X ...

  8. Linux中profile、bashrc、bash_profile之间的区别和联系

    /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置. 英文描述为: # /etc/pr ...

  9. python字符串方法的简单使用

    学习python字符串方法的使用,对书中列举的每种方法都做一个试用,将结果记录,方便以后查询. (1) s.capitalize() ;功能:返回字符串的的副本,并将首字母大写.使用如下: >& ...

  10. Js控制Div在浏览器中的高度

    //需求是,我需要通过浏览器内容可视化的高度来控制div的高度boxheight(); //执行函数function boxheight(){ //函数:获取尺寸 //获取浏览器窗口高度 var wi ...