终于要开始写自己的第一篇博客啦,真有点小激动(手足无措 =。=!)。因为最近正在琢磨机器学习,第一篇博客就从学的第一个算法开始:k-nearest neighbors algorithm即k近邻算法。

**************************************正文分界线***************************************

wiki:在模式识别和机器学习领域,k近邻算法(k-nearest neighbors algorithm or k-NN for short)是应用于分类问题(classification )和回归问题(regression)的一种无参数方法。分类时,k-NN输出为所属分类(class membership);回归时,k-NN输出为属性值(property value)。

分类(classification),即识别出样本所属的类别。因为还没学到regression,所以只写classification(是只会好嘛,TAT)

首先,看一下数据的形式,比如下图“基于四种特征对鸟进行分类 ”

kNN算法

给定训练样本集(training set),我们知道其中每条数据的label(即所属类别,比如什么鸟)。关注两个key words:特征(feature)和目标变量(target variable),每条数据均看成“特征向量+目标变量”(比如[weight, wingspan, ..., ...]+species)的形式,在这里,数据的label即目标变量。当没有label的新数据“特征向量+?”到来时,我们将它和训练样本集中的每条数据进行比对,计算他们特征向量间的距离(相似程度的度量),挑选训练样本集中k个与之距离最近的数据,观察他们的label并计数,即进行“投票表决”,票数最高的label是新数据的label(分类,并不一定正确)。

General approach to kNN

  1. Collect data : Any method, such as a text file provided or a database.

  2. Prepare : Numeric values are needed for a distance calculation. A structured data format is best.

  3. Analyze : Any method, for example, using Matplotlib to make 2D plots of data.

  4. Train : Does not apply to the kNN algorithm. No explicit training step is required.

  5. Test : Calculate the error rate(=error number/dataset size) with a test set.

  6. Use: This application needs to get some input data and output structured numeric values. Next, the application runs the kNN algorithm on this input data and determines  which  class  the  input  data  should  belong  to.  The  application  then takes some action on the calculated class.

Pros: High accuracy, insensitive to outliers, no assumptions about data

Cons: Computationally expensive, requires a lot of memory

Works with: Numeric values, nominal values

以下几点需要注意

  1. 因为需要计算距离,所以特征应为数字型,比如weight和wingspan,像webbed feet这样的布尔型或者back color这样的字符串型的就不能使用;

  2. 因为特征的单位和数值范围(scale)不同,所以要对特征进行归一化,均压缩至0至1或-1至1

  3. 距离不一定是欧氏距离(Euclidean distance),也可以是其他定义(范数)

  4. 每次classify都要遍历整个样本集,当样本集很大和特征向量很长时,计算成本和内存成本“高昂”

代码实现要点

  1. 将数据组织成我们需要的形式(函数实现),特征向量以行的形式“堆砌”成矩阵(matrix或2d array),相应的目标变量排成一列形成向量(list)

  2. 使用python的dict数据结构用于“计票”很方便,以label为“键”(key),以票数为“值”(value),然后以value排序提取key即可

重要思想

  1. 将样本看成“特征向量+目标变量”的形式

  2. 数据结构的巧妙运用

参考

[1] Harrington, Peter. Machine learning in action. Manning Publications Co., 2012.

[2] http://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm#cite_note-1

Classifying with k-Nearest Neighbors(k近邻)的更多相关文章

  1. [机器学习系列] k-近邻算法(K–nearest neighbors)

    C++ with Machine Learning -K–nearest neighbors 我本想写C++与人工智能,但是转念一想,人工智能范围太大了,我根本介绍不完也没能力介绍完,所以还是取了他的 ...

  2. K Nearest Neighbor 算法

    文章出处:http://coolshell.cn/articles/8052.html K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法, 总体来说KN ...

  3. K NEAREST NEIGHBOR 算法(knn)

    K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法, 总体来说KNN算法是相对比较容易理解的算法.其中的K表示最接近自己的K个数据样本.KNN算法和K-M ...

  4. Approximate Nearest Neighbors.接近最近邻搜索

    (一):次优最近邻:http://en.wikipedia.org/wiki/Nearest_neighbor_search 有少量修改:如有疑问,请看链接原文.....1.Survey:Neares ...

  5. lintcode 中等题:k Sum ii k数和 II

    题目: k数和 II 给定n个不同的正整数,整数k(1<= k <= n)以及一个目标数字. 在这n个数里面找出K个数,使得这K个数的和等于目标数字,你需要找出所有满足要求的方案. 样例 ...

  6. 今天遇到的面试题for(j=0,i=0;j<6,i<10;j++,i++) { k=i+j; } k 值最后是多少?

    for(j=0,i=0;j<6,i<10;j++,i++) { k=i+j; } k 值最后是多少? <script type="text/javascript" ...

  7. 设子数组A[0:k]和A[k+1:N-1]已排好序(0≤K≤N-1)。试设计一个合并这2个子数组为排好序的数组A[0:N-1]的算法。

    设子数组A[0:k]和A[k+1:N-1]已排好序(0≤K≤N-1).试设计一个合并这2个子数组为排好序的数组A[0:N-1]的算法.要求算法在最坏情况下所用的计算时间为O(N),只用到O(1)的辅助 ...

  8. 有两个序列A和B,A=(a1,a2,...,ak),B=(b1,b2,...,bk),A和B都按升序排列。对于1<=i,j<=k,求k个最小的(ai+bj)。要求算法尽量高效。

    有两个序列A和B,A=(a1,a2,...,ak),B=(b1,b2,...,bk),A和B都按升序排列.对于1<=i,j<=k,求k个最小的(ai+bj).要求算法尽量高效. int * ...

  9. Python交互K线工具 K线核心功能+指标切换

    Python交互K线工具 K线核心功能+指标切换 aiqtt团队量化研究,用vn.py回测和研究策略.基于vnpy开源代码,刚开始接触pyqt,开发界面还是很痛苦,找了很多案例参考,但并不能完全满足我 ...

  10. 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。

    从第0行开始,输出第k行,传的参数为第几行,所以在方法中先将所传参数加1,然后将最后一行加入集合中返回. 代码如下: public static List<Integer> generat ...

随机推荐

  1. [linux]CentOS安装pre-built Nginx

    官方文档:https://nginx.org/en/linux_packages.html Nginx安装分为软件包安装和pre-built安装.这里使用的pre-built安装,不用自己编译. 设置 ...

  2. hadoop tez 结合搭建以及测试异常解决

    hadoop tez 搭建 1.下载tez,本人下载的是bin.0.92版本. http://www.apache.org/dyn/closer.lua/tez/0.9.2/ hadoop dfs - ...

  3. es6的基本数据详解

    一.Set 基本用法:   1)ES6提供了新的数据机构-Set. 它类似于数组,但是成员的值都是唯一的,没有重复的值.Set本身是一个构造函数,用来生成Set数据结构. 先来看一段最简单的代码: 1 ...

  4. 181102 Python环境搭建(安装Sublime Text3)

    利用Pycharm来编写.执行python代码是一个不错的选择,Pycharm的安装的确也很方便.但是偶然看到别人用Sublime Text来编写.执行代码,觉得很酷.所以自己动手搭建环境. 1. 下 ...

  5. 771. Jewels and Stones

    You're given strings J representing the types of stones that are jewels, and S representing the ston ...

  6. 错误提示:Dynamic Performance Tables not accessible, Automatic Statistics Disabled for this session You can disable statistics in the preference menu,or obtanin select priviliges on the v$session,v$sess

    1.错误提示:Dynamic Performance Tables not accessible, Automatic Statistics Disabled for this session You ...

  7. CSS Sprite雪碧图

    为了减少http请求数量,加速网页内容显示,很多网站的导航栏图标.登录框图片等,使用的并不是<image>标签,而是CSS Sprite雪碧图. 两个小例子: 淘宝首页的侧栏图 代码 &l ...

  8. 基于Jmeter的thrift-RPC接口测试

    根据需求,产品部分功能采用thrift-RPC协议进行接口的增.删.改.查,前期采用Junit对其进行测试,为了提高RPC接口测试的简洁化和后期的性能测试需求,打算通过Jmeter的java类测试实现 ...

  9. eclipse中生成的html存在中文乱码问题的解决方法

    最近在做测试报告生成时遇到了个中文乱码的问题,虽然在html创建过程中设置了编码格式htmlReporter.config().setEncoding("UTF-8");但是生成的 ...

  10. ssh 报error: kex protocol error: type 30 seq 1

    由于近期服务器升级了openssl,在使用navicat连接数据库报 查看日志 sshd[1990]: error: kex protocol error: type 30 seq 1 [preaut ...