机器学习十大算法 之 kNN(一)
机器学习十大算法 之 kNN(一)
最近在学习机器学习领域的十大经典算法,先从kNN开始吧。
简介
kNN是一种有监督学习方法,它的思想很简单,对于一个未分类的样本来说,通过距离它最近的k个“邻居”,来判断这个样本的类别。kNN也是一种lazy learning(不知道中文是啥)技术,训练代价小、分类代价大。算法的要点有四个:
- 训练集
- k的取值
- 距离的衡量方式
- 决定未知样本类别的方式
尽管kNN理解和实现起来都很简单,但是在某些应用上仍然有较好的表现。Cover和Hart指出,在一些合理的假设下,kNN的分类误差的上界是贝叶斯分类器误差的两倍,并且kNN方法的分类误差渐渐逼近贝叶斯分类器。
要点
k的取值
k表示未知样本在分类时“邻居”的个数。
如果k过小,那么分类的风险就会变大,未知样本的分类会很容易受到噪音的干扰。比如古老的封建制度,风险较大,国家大事只有皇帝和极少数重臣拿主意,如果是个明君带领的团队,那很有可能早就诸如“贞观之治”、“康乾盛世”之类的治世,相反,如果是昏君团队,改朝换代也就不远了。
如果k过大,那么分类时就会考虑过多的样本点,其中很可能包括大量无关的样本。随着k值变大,模型会变得越来越简单。极端的情况是k的值等于所有训练样本的个数,那么在训练集不变的情况下,每次分类结果都会是相同的。
确定k值的大小可以采用交叉验证(cross-validation)的方式。
距离的衡量方式
衡量样本点之间的距离最常用得有cosine距离、欧式距离和曼哈顿距离。
- cosine距离:d(x, y) = cos(x, y)
- 欧氏距离:d(x, y) = sqrt(sum(xi - yi)^2)
- 曼哈顿距离:d(x, y) = sqrt(sum(abs(xi - yi)))
在实际应用中,当然应该根据需求对距离进行修改甚至重新设计,但是原则是不变的,就是越相似的两个样本的距离应该是越小的。同时还应该注意在需要的时候进行归一化,避免夸大或者忽略个别值域差别较大的属性。
确定未知样本类别的方式
确定未知样本类别是指,在选取好k个里邻居之后,如何根据这些邻居的类别确定未知样本的类别。
最简单的方式是多数投票,也就是取k个邻居中个数最多的那个类别作为未知样本的类别。这种方式的问题是,当k个邻居分布比较广泛时,距离未知样本近的那些样本理应有更大的贡献,而实际上在投票的时候,所有邻居的权重是一样的。

因此,稍微复杂一点的方法是,在投票时按照与未知样本的距离考虑训练样本的权重。权重的计算方法有多种,例如:距离平方的倒数。
机器学习十大算法 之 kNN(一)的更多相关文章
- 机器学习十大算法之KNN(K最近邻,k-NearestNeighbor)算法
机器学习十大算法之KNN算法 前段时间一直在搞tkinter,机器学习荒废了一阵子.如今想重新写一个,发现遇到不少问题,不过最终还是解决了.希望与大家共同进步. 闲话少说,进入正题. KNN算法也称最 ...
- 机器学习十大算法总览(含Python3.X和R语言代码)
引言 一监督学习 二无监督学习 三强化学习 四通用机器学习算法列表 线性回归Linear Regression 逻辑回归Logistic Regression 决策树Decision Tree 支持向 ...
- 机器学习十大算法之EM算法
此文已由作者赵斌授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 由于目前论坛的Markdown不支持Mathjax,数学公式没法正常识别,文章只能用截图上传了... ...
- 【十大算法实现之KNN】KNN算法实例(含测试数据和源码)
KNN算法基本的思路是比较好理解的,今天根据它的特点写了一个实例,我会把所有的数据和代码都写在下面供大家参考,不足之处,请指正.谢谢! update:工程代码全部在本页面中,测试数据已丢失,建议去UC ...
- 秒懂机器学习---k临近算法(KNN)
秒懂机器学习---k临近算法(KNN) 一.总结 一句话总结: 弄懂原理,然后要运行实例,然后多解决问题,然后想出优化,分析优缺点,才算真的懂 1.KNN(K-Nearest Neighbor)算法的 ...
- 十大算法 pagerank 傅里叶变换
来源于最近阅读的一些链接 首先是介绍十大算法的 http://blog.jobbole.com/70639/ 然后是pageRank算法 http://blog.jobbole.com/23286/ ...
- 机器学习——十大数据挖掘之一的决策树CART算法
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第23篇文章,我们今天分享的内容是十大数据挖掘算法之一的CART算法. CART算法全称是Classification ...
- GJM : 数据结构 - 轻松看懂机器学习十大常用算法 [转载]
转载请联系原文作者 需要获得授权,非法转载 原文作者将享受侵权诉讼 文/不会停的蜗牛(简书作者)原文链接:http://www.jianshu.com/p/55a67c12d3e9 通过本篇文章可以 ...
- 轻松看懂机器学习十大常用算法 (Machine Learning Top 10 Commonly Used Algorithms)
原文出处: 不会停的蜗牛 通过本篇文章可以对ML的常用算法有个常识性的认识,没有代码,没有复杂的理论推导,就是图解一下,知道这些算法是什么,它们是怎么应用的,例子主要是分类问题. 每个算法都看了 ...
随机推荐
- 【开源java游戏框架libgdx专题】-10-核心库-Viewport
Viewport类,又称为视口类,主要负责管理游戏相机,处理游戏世界坐标与布景层坐标的换算关系.在移动端开发,不像PC端容易.因为要适配不同分辨率的设备.libgdx处理不同的设备屏幕时,用视口处理舞 ...
- Java遍历Map、List、Array
1.遍历array,使用for循环或者foreach(本人建议使用) int arr[] = {2, 3, 1}; System.out.println("----1----排序前的一维数组 ...
- Python 函数的使用 外加引入文件
#coding=utf-8 #!user/bin/python import sys import test2 def functionsss(name,sex,age=25): print name ...
- Swift - 18 - 数组的基础操作
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...
- 分享Git的一些个人配置
先贴上自己.gitconfig的相关命令,我再具体说一下 diff.external=~/.git-meld.sh http.sslverify=false http.proxy=http://127 ...
- 【转】Hibernate和ibatis的比较
1. 简介 Hibernate是当前最流行的O/R mapping框架.它出身于sf.net,现在已经成为Jboss的一部分了.iBATIS是另外一种优秀的O/R mapping框架,现已改名叫myB ...
- gdb调试带参数程序(转:笑笑小白,cnblog http://www.cnblogs.com/rosesmall/archive/2012/04/10/2440514.html)
一般来说GDB主要调试的是C/C++的程序.要调试C/C++的程序,首先在编译时,我们必须要 把调试信息加到可执行文件中.使用编译 器(cc/gcc/g++)的 -g 参数可以做到这一点.如: > ...
- jquery 文本框聚焦文字删除
做作业需要,自己写了一个,写的很烂. $(function() { $("#search_input").addClass("before_focus");/* ...
- wamp虚拟机配置
1.找到httpd.conf 里面:找到 # Virtual hosts 开启虚拟机Include conf/extra/httpd-vhosts.conf 2 编辑httpd-vhosts.con ...
- python -- 函数传参
一.参数传入规则 可变参数允许传入0个或任意个参数,在函数调用时自动组装成一个tuple: 关键字参数允许传入0个或任意个参数,在函数调用时自动组装成一个dict: 1. 传入可变参数: def ca ...