转载请注明源出处:http://www.cnblogs.com/lighten/p/7593656.html

1.原理

  本章介绍机器学习实战的第一个算法——k近邻算法(k Nearest Neighbor),也称为kNN。说到机器学习,一般都认为是很复杂,很高深的内容,但实际上其学习门栏并不算高,具备基本的高等数学知识(包括线性代数,概率论)就可以了,甚至一些算法高中生就能够理解了。kNN算法就是一个原理很好理解的算法,不需要多好的数学功底,这是一个分类算法(另一个大类是回归),属于监督学习的范畴(还有非监督学习,监督学习需要注有标记的训练集)。

  首先,分类顾名思义就是给同一种事物分成不同的种类,比如人分成男人、女人,书分为工具书,教科书,漫画书等。要对一个事物分类,要有分类的依据,即你为什么这样划分,有时候划分的依据十分准确比如男女按性别,但很多时候是由多个因素来决定划分到哪一个类别,而不同的分类某一单一的因素又可能存在交集,这些因素在机器学习中被称之为特征,特征的选择对算法的准确率也是有影响的。个体用一组特征数据来进行描述,这样计算机处理就成了可能,分类算法所要做的就是判断这个个体所给出的特征属于哪一个类别。方法有很多,kNN采取了一个最简单的方法来判断:判断其与已知分类的训练集数据的差异,差异最小的前k个训练集个体大部分处于哪个分类该输入个体就被认作是哪个分类

  这个原理很好理解,比如判断男女,特征只有身高,体重。通常来说男人都比女人要高和重,即便女人要高,体重也比同等级的男人大部分会轻。所以对于一个输入个体来说,在已知身高、体重的情况下,求其与训练集样本的身高、体重差异,找到训练集中差异最小的k个个体,这k个个体如果大部分是男人,则输入样本就是男人,否则则是女人。选择差异最小的k个个体也就是为了避免小部分不同寻常的样本,因为男人都比女人要高和重也只是大部分情况,这样选择k个的权重,可信度就较高了。差异计算一般采用欧式距离,即各个特征相减,求平方和,开根号:

  

  上图就是差异的定义了,这样挑选出K个最小的训练集,已知这些训练集的分类,选择K个训练集大部分所属的分类就是新输入个体的分类了。

2.问题及优缺点

  kNN算法的原理简单易懂,但是在实现过程中也是有些问题需要解决的。首先我们需要关注d的计算,kNN选择的是d最小的k个训练集个体,所以d的结果合理性是很重要的。但是由该公式可以很明显的看出,d的大小很可能受到某一单一的特征影响。试想一下如果X的取值范围在1~10,Y的取值范围在1000~10000,那么d的大小严重受到Y特征的影响,那么X的作用就几乎没有了。解决该问题的方法就是将数值归一化,意思就是不管X还是Y,按照合理的放缩方法,使他们落在同一个范围区间,一般就选择0~1之间了。这个放缩方法也并不难得出,公式如下:

  优点:精度高,对异常值不敏感,无数据输入假定

  缺点:计算复杂度高、空间复杂度高

  从kNN的实现上也能看出来,其计算代价较高,每个个体都需要和所有的训练集个体进行比较,而且kNN算法无法获得指定分类的一般性特征,因此其不适合大量的训练集。

3.代码

  下面代码出自《机器学习实战》一书,原书中所有代码例子可以在网站:这里。进行下载。

def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize,1)) - dataSet
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
sortedDistIndicies = distances.argsort()
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0] 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 

机器学习实战(一)k-近邻算法的更多相关文章

  1. 02机器学习实战之K近邻算法

    第2章 k-近邻算法 KNN 概述 k-近邻(kNN, k-NearestNeighbor)算法是一种基本分类与回归方法,我们这里只讨论分类问题中的 k-近邻算法. 一句话总结:近朱者赤近墨者黑! k ...

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

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

  3. 《机器学习实战》-k近邻算法

    目录 K-近邻算法 k-近邻算法概述 解析和导入数据 使用 Python 导入数据 实施 kNN 分类算法 测试分类器 使用 k-近邻算法改进约会网站的配对效果 收集数据 准备数据:使用 Python ...

  4. 《机器学习实战》——K近邻算法

    三要素:距离度量.k值选择.分类决策 原理: (1) 输入点A,输入已知分类的数据集data (2) 求A与数据集中每个点的距离,归一化,并排序,选择距离最近的前K个点 (3) K个点进行投票,票数最 ...

  5. 机器学习实战python3 K近邻(KNN)算法实现

    台大机器技法跟基石都看完了,但是没有编程一直,现在打算结合周志华的<机器学习>,撸一遍机器学习实战, 原书是python2 的,但是本人感觉python3更好用一些,所以打算用python ...

  6. 机器学习03:K近邻算法

    本文来自同步博客. P.S. 不知道怎么显示数学公式以及排版文章.所以如果觉得文章下面格式乱的话请自行跳转到上述链接.后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱.看原博客地址会有更 ...

  7. 机器学习随笔01 - k近邻算法

    算法名称: k近邻算法 (kNN: k-Nearest Neighbor) 问题提出: 根据已有对象的归类数据,给新对象(事物)归类. 核心思想: 将对象分解为特征,因为对象的特征决定了事对象的分类. ...

  8. 机器学习 Python实践-K近邻算法

    机器学习K近邻算法的实现主要是参考<机器学习实战>这本书. 一.K近邻(KNN)算法 K最近邻(k-Nearest Neighbour,KNN)分类算法,理解的思路是:如果一个样本在特征空 ...

  9. 机器学习:1.K近邻算法

    1.简单案例:预测男女,根据身高,体重,鞋码 import numpy as np import matplotlib import sklearn from skleran.neighbors im ...

  10. 机器学习实战笔记-2-kNN近邻算法

    # k-近邻算法(kNN) 本质是(提取样本集中特征最相似数据(最近邻)的k个分类标签). K-近邻算法的优缺点 例 优点:精度高,对异常值不敏感,无数据输入假定: 缺点:计算复杂度高,空间复杂度高: ...

随机推荐

  1. 手机PC文件传输

    QQ啥的现在直接无法全部退出,很纠结后台运行,时不时的来条消息,明明电脑QQ还开着,越来越流氓了. 服务端代码: <%@ Page Language="C#" %> & ...

  2. 如何在Linux中统计一个进程的线程数(转)

    方法一: /proc proc 伪文件系统,它驻留在 /proc 目录,这是最简单的方法来查看任何活动进程的线程数. /proc 目录以可读文本文件形式输出,提供现有进程和系统硬件相关的信息如 CPU ...

  3. Text Converted into Speech in Pi

    Step 1: Convert any text into uint8 type in matlab : Step 2: Add models in matlab : copy the uint8 n ...

  4. go基本操作

    看了一段时间的go的知识了,本来是冲着它是系统级的语言去的,同时又有java的的样子.看了这么久,发现这语言挺好的,语法精简,有c的遗传.在面向对象上,也有些许的java风格.写web的时候,这风格和 ...

  5. C#全局键盘监听(Hook)

    一.为什么需要全局键盘监听? 在某些情况下应用程序需要实现快捷键执行特定功能,例如大家熟知的QQ截图功能Ctrl+Alt+A快捷键,只要QQ程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下 ...

  6. C#模拟请求,模拟登录,Cookie设置、文件上传等问题汇总

    由于业务需求,最近需要模拟完成登陆某个网站,并上传所需要的文件.在开发途中,遇到了很多问题,现在,就我遇到的一些问题及解决办法说明如下,希望对遇到同样问题的人有所帮助.因为技术有限,可能有些内容并不完 ...

  7. Entity Framework学习记录

    记录一次ef code first的学习记录 最近想做一套自己的框架,正在寻找合适的ORM,之前参照力软(很早之前的版本了)的底层代码,做了一套自己的增删改查, 但是使用起来总觉得缺了点什么? 所以决 ...

  8. 【自动化专题】借助firefox插件定位web元素小技巧

    浏览器:firefox 插件:firebug.firepath.firefinder 安装插件---已安装的请跳过 1.安装firefox浏览器 2.打开firefox-附加组件(找不到入口的问度娘) ...

  9. Day 21 序列化模块_Json,Pickle,Shelve

    序列化 , 数据类型,列表 元组, 字符串 只有字符串能被写入文件中. 能在网络上传输的只能是bytes - 字符串 把要传输的和要存储的内容转换成字符串. 字符串 转换回 要传输和存储的内容 序列化 ...

  10. Flask系列03--Flask的路由 app.route中的参数, 动态参数路由

    Flask–路由 添加路由的两种方式 第一种 @app.route("/my_de") def detail() 第二种(了解即可) app.add_url_rule(" ...