KNN算法全名为k-Nearest Neighbor,就是K最近邻的意思。

算法描述

KNN是一种分类算法,其基本思想是采用测量不同特征值之间的距离方法进行分类。

算法过程如下:

1、准备样本数据集(样本中每个数据都已经分好类,并具有分类标签);
2、使用样本数据进行训练;
3、输入测试数据A;
4、计算A与样本集的每一个数据之间的距离;
5、按照距离递增次序排序;
6、选取与A距离最小的k个点;
7、计算前k个点所在类别的出现频率;
8、返回前k个点出现频率最高的类别作为A的预测分类。

主要因素

训练集(或样本数据)

训练集太小会误判,训练集太大时对测试数据分类的系统开销会非常大。

距离(或相似的衡量算法)

什么是合适的距离衡量?距离越近应该意味着这两个点属于一个分类的可能性越大。

距离衡量包括:

1、欧氏距离

欧几里得度量(euclidean metric)(也称欧氏距离)是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离。

适用于空间问题。

2、曼哈顿距离

出租车几何或曼哈顿距离(Manhattan Distance)是由十九世纪的赫尔曼·闵可夫斯基所创词汇 ,是种使用在几何度量空间的几何学用语,用以标明两个点在标准坐标系上的绝对轴距总和。 曼哈顿距离是欧氏距离在欧几里得空间的固定直角坐标系上所形成的线段对轴产生的投影的距离总和。

图中红线代表曼哈顿距离,绿色代表欧氏距离,也就是直线距离,而蓝色和黄色代表等价的曼哈顿距离。 曼哈顿距离——两点在南北方向上的距离加上在东西方向上的距离,即d(i,j)=|xi-xj|+|yi-yj|。

适用于路径问题。

3、切比雪夫距离

在数学中,切比雪夫距离是向量空间中的一种度量,二个点之间的距离定义是其各坐标数值差绝对值的最大值。

切比雪夫距离会用在计算法网格中两点之间的距离,比如:棋盘、仓储物流等应用。

对一个网格,和一个点的切比雪夫距离为1的点为此点的Moore型邻居(英语:Moore neighborhood)。

使用于在网格中计算距离的问题。

4、闵可夫斯基距离(Minkowski Distance)

闵氏距离不是一种距离,而是一组距离的定义。

根据变参数的不同,闵氏距离可以表示一类的距离。

其公式中有一个变参p:
当p=1时,是曼哈顿距离;
当p=2时,是欧氏距离;
当p→∞时,就是切比雪夫距离。

5、标准化欧氏距离 (Standardized Euclidean distance )

标准化欧氏距离是针对简单欧氏距离的缺点而作的一种改进方案,可以看成是一种加权欧氏距离。

标准欧氏距离的思路: 既然数据各维分量的分布不一样,那先将各个分量都“标准化”到均值、方差相等。

6、马氏距离(Mahalanobis Distance)

表示数据的协方差距离。

它是一种有效的计算两个未知样本集的相似度的方法。

量纲无关,可以排除变量之间的相关性的干扰。

7、巴氏距离(Bhattacharyya Distance) 在统计学中,巴氏距离用于测量两离散概率分布。它常在分类中测量类之间的可分离性。

8、汉明距离(Hamming distance)

两个等长字符串s1与s2之间的汉明距离定义为将其中一个变为另外一个所需要作的最小替换次数。

例如字符串“1111”与“1001”之间的汉明距离为2。

应用:
信息编码(为了增强容错性,应使得编码间的最小汉明距离尽可能大)。

9、夹角余弦(Cosine)

几何中夹角余弦可用来衡量两个向量方向的差异,数据挖掘中可用来衡量样本向量之间的差异。

10、杰卡德相似系数(Jaccard similarity coefficient)

杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。
可将杰卡德相似系数用在衡量样本的相似度上。

11、皮尔森相关系数(Pearson Correlation Coefficient)

皮尔森相关系数,也称皮尔森积矩相关系数(Pearson product-moment correlation coefficient) ,是一种线性相关系数。 皮尔森相关系数是用来反映两个变量线性相关程度的统计量。

高维度对距离衡量的影响:
当变量数越多,欧式距离的区分能力就越差。

变量值域对距离的影响:
值域越大的变量常常会在距离计算中占据主导作用,因此应先对变量进行标准化。

k的大小

k太小,分类结果易受噪声点影响,误差会增大;
k太大,近邻中又可能包含太多的其它类别的点(对距离加权,可以降低k值设定的影响);
k=N(样本数),则完全不足取,因为此时无论输入实例是什么,都只是简单的预测它属于在训练实例中最多的类,模型过于简单,忽略了训练实例中大量有用信息。

在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法(简单来说,就是一部分样本做训练集,一部分做测试集)来选择最优的K值。

经验规则:k一般低于训练样本数的平方根。

优缺点

1、优点
简单,易于理解,易于实现,精度高,对异常值不敏感。

2、缺点

KNN是一种懒惰算法,构造模型很简单,但在对测试数据分类的系统开销大(计算量大,内存开销大),因为要扫描全部训练样本并计算距离。

适用范围

数值型和标称型(具有有穷多个不同值,值之间无序)。
比如客户流失预测、欺诈侦测等。

算法实现

这里以python为例描述下基于欧氏距离的KNN算法实现。

欧氏距离公式:

以欧氏距离为例的示例代码:

#! /usr/bin/env python
#-*- coding:utf-8 -*-
# E-Mail : Mike_Zhang@live.com import math class KNN:
def __init__(self,trainData,trainLabel,k):
self.trainData = trainData
self.trainLabel = trainLabel
self.k = k def predict(self,inputPoint):
retLable = "None"
arr=[]
for vector,lable in zip(self.trainData,self.trainLabel):
s = 0
for i,n in enumerate(vector) :
s += (n-inputPoint[i]) ** 2
arr.append([math.sqrt(s),lable])
arr = sorted(arr,key=lambda x:x[0])[:self.k]
dtmp = {}
for k,v in arr :
if not v in dtmp : dtmp[v]=0
dtmp[v] += 1
retLable,_ = sorted(dtmp.items(),key=lambda x:x[1],reverse=True)[0]
return retLable data = [
[1.0, 1.1],
[1.0, 1.0],
[0.0, 0.0],
[0.0, 0.1],
[1.3, 1.1],
] labels = ['A','A','B','B','A']
knn = KNN(data,labels,3) print knn.predict([1.2, 1.1])
print knn.predict([0.2, 0.1])

上面的实现比较简单,在开发中可以使用现成的库,比如scikit-learn :

https://github.com/mike-zhang/pyExamples/blob/master/algorithm/dataMining_KNN/knn_sklearn_test1.py

算法应用

  • 识别手写数字

http://www.cnblogs.com/chenbjin/p/3869745.html

好,就这些了,希望对你有帮助。

本文github地址:

https://github.com/mike-zhang/mikeBlogEssays/blob/master/2017/20170616_KNN算法介绍.md

欢迎补充

KNN算法介绍的更多相关文章

  1. KNN算法介绍及源码实现

    一.KNN算法介绍 邻近算法,或者说K最邻近(KNN,K-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是K个最近的邻居的意思,说的是每个样本都可以用它 ...

  2. 机器学习--kNN算法识别手写字母

    本文主要是用kNN算法对字母图片进行特征提取,分类识别.内容如下: kNN算法及相关Python模块介绍 对字母图片进行特征提取 kNN算法实现 kNN算法分析 一.kNN算法介绍 K近邻(kNN,k ...

  3. 深入浅出KNN算法(一) KNN算法原理

    一.KNN算法概述 KNN可以说是最简单的分类算法之一,同时,它也是最常用的分类算法之一,注意KNN算法是有监督学习中的分类算法,它看起来和另一个机器学习算法Kmeans有点像(Kmeans是无监督学 ...

  4. KNN算法 - 数据挖掘算法(3)

    (2017-04-10 银河统计) KNN算法即K Nearest Neighbor算法.这个算法是机器学习里面一个比较经典的.相对比较容易理解的算法.其中的K表示最接近自己的K个数据样本.KNN算法 ...

  5. KNN算法原理及实现

    1.KNN算法概述 kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.该方法在确定分类决策上只依据最邻近的一 ...

  6. 算法学习笔记:knn理论介绍

    阅读对象:了解指示函数,了解训练集.测试集的概念. 1.简介 knn算法是监督学习中分类方法的一种.所谓监督学习与非监督学习,是指训练数据是否有标注类别,若有则为监督学习,若否则为非监督学习.所谓K近 ...

  7. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  8. 什么是 kNN 算法?

    学习 machine learning 的最低要求是什么?  我发觉要求可以很低,甚至初中程度已经可以.  首先要学习一点 Python 编程,譬如这两本小孩子用的书:[1][2]便可.   数学方面 ...

  9. 机器学习笔记--KNN算法1

    前言 Hello ,everyone. 我是小花.大四毕业,留在学校有点事情,就在这里和大家吹吹我们的狐朋狗友算法---KNN算法,为什么叫狐朋狗友算法呢,在这里我先卖个关子,且听我慢慢道来. 一 K ...

随机推荐

  1. Struts2框架的基本使用(二)

    上一篇 Struts2框架的基本使用 我们限于篇幅,最后简单介绍了Action的配置问题,本篇接着介绍有关框架的一些其他基本用法,主要内容如下: Action的基本配置 result的基本配置 Str ...

  2. 前端工作日常爬坑之——单页面微信开发Jssdk相关,以及jssdk图片直传自己服务器的实现。

    日常爬坑 遇到的情况大致说明: 项目基于Vue2全家桶实现,vue-router控制前端路由,路由模式是History(主要是领导追求太高,觉得hash带#号太丑,然后遇到了小坑...),主要是服务于 ...

  3. Android WebView导入HTML使Js生效的方法

    WebSettings ws = webview.getSettings(); ws.setJavaScriptEnabled(true);//加上这句 webview.loadDataWithBas ...

  4. OC-不可变数组NSArray

  5. 如何通过 WebP 自适应方案减少图片资源大小

    前言 我们知道,理想的网页应该在 1 秒内打开,而在页面的整体大小中,图片往往是所占比例最大的一部分(大约占到 60% 以上,更多了解请点击),也可以参照如下图所示.优化图片不仅可以加快页面显示,还能 ...

  6. iOS 伐码猿真爱—「偷懒 || 效率 工具类」

    自检 代码不会可以多敲几次,学习的重点是思想:-- 认同. BUT 如果你把自己会的.熟知的.可以说写的似流水的代码,不管是在工作 或是 自学习中你还是一点一点的敲出来,是不是有点...,copy & ...

  7. Unite'17 Shanghai再一次问候

    Unite'17 Shanghai再一次问候 --暨Unity2017年度大会 2017年5月11日,主题为"再一次问候"的Unity年度盛会在上海国际会议中心举行,这是Unity ...

  8. nodejs弯路-01之'express' 不是内部或外部命令

    最近正想用node+angular+mongodb来完成一个小项目,三样都算是从零开始学习吧. 一开始是想用express -e projectname去创建一个ejs模板的项目.(一两句话就可以把大 ...

  9. python requests 模拟登陆网站,抓取数据

    抓取页面数据的时候,有时候我们需要登陆才可以获取页面资源,那么我们需要登陆以后才可以跳转到对应的资源页面,那么我们需要通过模拟登陆,登陆成功以后再次去抓取对应的数据. 首先我们需要通过手动方式来登陆一 ...

  10. 【JAVAWEB学习笔记】07_BootStrap、Viewport介绍

    今天主要学习了BootStrap,viewport的介绍和最后对网站进行了重构 今天晨读单词: Compatible:兼容性 viewport:视口 device:设备 initial:初始化(缩写i ...