SIGAI机器学习第七集 k近邻算法
讲授K近邻思想,kNN的预测算法,距离函数,距离度量学习,kNN算法的实际应用。
KNN是有监督机器学习算法,K-means是一个聚类算法,都依赖于距离函数。没有训练过程,只有预测过程。
大纲:
k近邻思想
预测算法
距离函数
距离度量学习
实验环节
实际应用
k近邻思想:

KNN基于模板匹配的思想,如要确定一个水果的类别,可以拿各种水果出来,看它和哪种水果长得像,就判定为哪种水果,这就是模板匹配思想。要拿一些实际的例子来,这些例子就相当于一些标准的模板,要预测样本属于哪个类型,就和这些例子比一遍,看和哪个长得最像就归到哪个类。
预测算法:
KNN算法是没有训练过程的,无train这个函数的,分类或者回归的时候现算,拿待预测样本和每个样本比较一下找到和它最像的K个样本再来投票,K一般凭经验来设置,二分类问题要设置为奇数(偶数在投票时可能两个类票数相等),既可用于分类问题也可用于回归问题。
分类问题
1.计算邻居节点
2.投票
回归问题
1.计算邻居节点
2.计算均值
距离函数:
KNN依赖于一个距离函数(或相似度函数,距离越近相似度越大)。
距离函数将两个样本对应的特征向量映射为大于等于0实数,距离函数要满足:

只要满足上面三条的函数都可以拿来做距离函数。几种常见的距离:

马氏距离,里边是一个二次型,显然这个二次型要半正定才可以(不然开根号没意义),即矩阵S半正定,S可以有很多种讲究,如协方差矩阵,一般取成对称的正定矩阵,S可以通过度量学习学习到。这种距离是一种概率意义上的距离,欧氏距离不考虑样本的分布,而马氏距离考虑样本的分布,如两类样本服从同一分部的话还考虑它的方差,相当于对方差做了一个归一化一样。
巴氏距离,用于直方图这样的特征,x满足∑xi=1且xi≥0,yi也是如此。
距离度量学习:
如马氏距离中的矩阵S的通过学习得到,这就叫做距离度量学习,即通过训练样本学习一种距离函数。
Kilian Q Weinberger, Lawrence K Saul. Distance Metric Learning for Large Margin Nearest Neighbor Classification. 2009, Journal of Machine Learning Research.
这篇论文是用于KNN的距离度量学习,保证对样本进行变换之后,同类样本是k个最近的邻居,不同的样本尽可能远离本样本。
将样本x通过一种线性变换,左乘一个矩阵L(L是通过学习得到的),得到一个向量y,就变换到另外一个空间中去了,变换完之后要保证变换完的每一个样本它和离他最近的k个邻居都和他是同一个类,而和它不同的类的样本离他尽可能的远,也就是说和他同类的样本尽量拉到它的k个邻居里边去,而和他不同类的样本把它推开。

算法原理:
目标邻居:j~->i,指j和i是同一类且在i的k个邻居里边,这种叫目标邻居,变换的目标是让目标邻居真正成为它的k个邻居之一。
冒充者:
,变换完之后,任意一个样本l他和i的距离小于等于i和j的距离加1,j和i是同一种类型,j本来该属于i的最近的k个邻居之一的,冒充者它和i的距离很接近了,比j和i的距离远不了多少,冒充者试图想冲到i的k个邻居里边去,冒充i的真正的邻居,但实际上他们是不同类型的。那么算法就有了优化的目标,通过一种变换L,把原始样本变换到新的空间里边去,保证所有目标邻居尽量是k个邻居,不是同一类的样本尽量推开,间隔至少为1,建立一个间隔。
优化目标函数:(分拉函数和推函数)
把和xi相同类型的样本xj拉到最近的k个邻居里来,距离尽可能的接近。
拉损失函数:
推损失函数:
推损失函数只对不同类型的样本起作用,yi、yl不同类yil=0,否则yil=1。
总损失函数:
目标是最小化拉函数、推函数,即最小化总损失函数,μ是人工设定的参数,用来平衡拉和推之间的作用,求解这样一个最优化问题,最终得到线性变换的矩阵L。对所有样本先用L变换一遍,再算它们之间的距离。
||L(X-Y)||2=(L(X-Y))TL(X-Y)=(X-Y)TLTL(X-Y),这里的LTL就是我们要学习的马氏距离中的矩阵S,本质上就学到了这么一种变换矩阵的距离定义,在这种距离定义下是最利于KNN的分类算法的,把同类的样本尽可能的拉成k个邻居,然后不同类的样本尽可能的分开。通过这么一种简单的变换可以显著的提高KNN算法的精度。
距离度量学习是一种通用的机器学习算法,它的核心思想是根据一组样本((x1,y1),(x2,y2),...)学习一种度量函数(距离函数)出来,然后达到某种目标,如让同类样本尽可能的进不同类样本尽可能远,除了这种定义外还有其他的一些构造的技巧,来达成不同的目的的。把同类样本拉到一起不同样本推开的这种思想在机器学习里边是非常常见的对于分类问题,后边的线性判别分析LDA、深度学习里边的某些算法如人脸识别里边的损失函数,都是一样的思想。
实验环节:

KNN算法是一种判别模型,非线性模型,既可用于分类问题也可用于回归问题,并且它还支持多分类,因此它是一种简单但是很有效的机器学习算法。
贝叶斯分类器是一种生成模型,因为它对联合概率概率密度函数进行建模了,对p(x|y)进行建模的,它只是用来做分类的一种算法,而且是一种非线性的模型,可以解决异或模型,支持多分类。
决策树是一种判别模型,它也是一种非线性模型,支持多分类,决策树既可以用于分类问题也可以用于回归问题。
KNN没有训练过程,只能预测。
实际应用:
实现简单
向量维数高,训练样本数大的时候,计算量大,计算出到所有样本的距离之后,找出topk个样本,找topk也有相应的经典算法。
文本分类
图像分类,如人脸识别,通过机器学习对每个人脸找到一个特征向量,然后用KNN进行分类。
最小距离分类器是KNN的特殊情况,k为1时候的情况,也叫最近邻分类器。
本集总结:
KNN依赖于特征向量x提的好不好,如果特征向量本身有区分度的话,KNN算法的性能是非常好的。
SIGAI机器学习第七集 k近邻算法的更多相关文章
- 机器学习(1)——K近邻算法
KNN的函数写法 import numpy as np from math import sqrt from collections import Counter def KNN_classify(k ...
- 机器学习之K近邻算法(KNN)
机器学习之K近邻算法(KNN) 标签: python 算法 KNN 机械学习 苛求真理的欲望让我想要了解算法的本质,于是我开始了机械学习的算法之旅 from numpy import * import ...
- 机器学习03:K近邻算法
本文来自同步博客. P.S. 不知道怎么显示数学公式以及排版文章.所以如果觉得文章下面格式乱的话请自行跳转到上述链接.后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱.看原博客地址会有更 ...
- 机器学习:k-NN算法(也叫k近邻算法)
一.kNN算法基础 # kNN:k-Nearest Neighboors # 多用于解决分裂问题 1)特点: 是机器学习中唯一一个不需要训练过程的算法,可以别认为是没有模型的算法,也可以认为训练数据集 ...
- 第四十六篇 入门机器学习——kNN - k近邻算法(k-Nearest Neighbors)
No.1. k-近邻算法的特点 No.2. 准备工作,导入类库,准备测试数据 No.3. 构建训练集 No.4. 简单查看一下训练数据集大概是什么样子,借助散点图 No.5. kNN算法的目的是,假如 ...
- 机器学习——KNN算法(k近邻算法)
一 KNN算法 1. KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分 ...
- [机器学习] k近邻算法
算是机器学习中最简单的算法了,顾名思义是看k个近邻的类别,测试点的类别判断为k近邻里某一类点最多的,少数服从多数,要点摘录: 1. 关键参数:k值 && 距离计算方式 &&am ...
- 机器学习实战 - python3 学习笔记(一) - k近邻算法
一. 使用k近邻算法改进约会网站的配对效果 k-近邻算法的一般流程: 收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据.一般来讲,数据放在txt文本文件中,按照一定的格式进 ...
- 【机器学习】k近邻算法(kNN)
一.写在前面 本系列是对之前机器学习笔记的一个总结,这里只针对最基础的经典机器学习算法,对其本身的要点进行笔记总结,具体到算法的详细过程可以参见其他参考资料和书籍,这里顺便推荐一下Machine Le ...
随机推荐
- Scratch—点亮生日蜡烛
过生日是小朋友们创作Scratch作品经常会用到的素材,今天介绍使用一些基础技能来点亮生日蜡烛的实现方法. 1.角色设计只有三种:生日蛋糕.未点燃的蜡烛.已点燃的蜡烛. 2.未点燃的蜡烛:在程序启动时 ...
- redis 缓存对象、列表
在spring boot环境下有个StringRedisTemplate对象,默认已经为我们配置好了,只需要自动注入过来就能用,但是使用它只能在Redis中存放字符串.具体操作如下: @RunWith ...
- 如何将 HTML 转换为 XHTML
1.添加一个 XHTML <!DOCTYPE> 到你的网页中 2.添加 xmlns 属性添加到每个页面的html元素中 3.改变所有的元素为小写 4.关闭所有的空元素 5.修改所有的属性名 ...
- 基因组所三代单分子测序PacBio完成技术升级—超长读长助力基因组学研究
基因组所三代单分子测序PacBio完成技术升级—超长读长助力基因组学研究 2015-09-23 | 作者:所级中心基因组平台 张兵 [关闭] 近日,基因组所所级中心基因组平台三代单分子实时测序PacB ...
- pickle 和 base64 模块的使用
pickle pickle模块是python的标准模块,提供了对于python数据的序列化操作,可以将数据转换为bytes类型,其序列化速度比json模块要高. pickle.dumps() 将pyt ...
- AngularJS入门教程之数据绑定原理详解
这篇文章主要是写给新手的,是给那些刚刚开始接触Angular,并且想了解数据帮定是如何工作的人.如果你已经对Angular比较了解了,那强烈建议你直接去阅读源代码. Angular用户都想知道数据绑定 ...
- c#NPOI导出2007版本excel
2003和2007版本区别: HSSFWorkbook(2003) IWorkbook(2007版本) 写完之后会有个问题,导出会报错[流已关闭]. NPOI生产.xlsx文件件时,在使用book.W ...
- ELK6.x_Kafka 安装配置文档
1. 环境描述 1.1. 环境拓扑 如上图所示:Kafka为3节点集群负责提供消息队列,ES为3节点集群.日志通过logstash或者filebeat传送至Kafka集群,再通过logstash发 ...
- django中解决跨域问题
-跨域问题 -浏览器的:同源策略,浏览器拒绝不是当前域域返回的数据 -ip地址和端口号都相同才是同一个域 -如何解决: -CORS:跨域资源共享 -简单请求:发一次请求 -非简单请求:非简单请求是发送 ...
- 【问题】为啥WMWare Workstation里面虚拟机的网关默认是NAT网关
今天做KickStart自动化安装实验,无意中发现一个奇怪现象. 先描述下我的实验环境:笔记本Win10,安装了WMWare Workstation,在WMWare Workstation上面安装了C ...