当前课程知识点:R语言数据分析 > 下部:博术 > 第12章 既是世间法、自当有分别 > 12.2 近邻法(I)
大家好
欢迎来到《R语言数据分析》课程
今天和大家交流
分类算法里面的第一种
近邻法
先看一下我们这个算法模型的导航图
除了这个深度学习模型之外
我们基本上其他算法模型我们都会讲解
近邻法 树模型 随机森林
朴素贝叶斯 逻辑斯蒂回归 人工神经网络
以及支持向量机
在讲这些算法模型之前
我想先有一个最基本的概念
就是叫 有生于无
是没有模型的时候
我们是怎么办的
实际上我们发现
在后面建模的过程中
这个有生于无的概念会经常出现
有生于无什么概念
我们先看看
比如说我们现在有这么一个问题
艾新波 当然也是我自己
曾经就读的沙洲中学
这应该是20多年前的事情了
总共有6个班
请你预测一下他读中学的时候属于几班
毫无疑问碰到这种问题的时候
我们没有任何信息
假如没有任何模型的时候怎么办
那我只能就是听天由命了
也是怎么样
掷色子
当我们无从下手的时候基本上也就
一切只能什么
当然我们不能说是随缘吧
应该叫随机
这时候并不是有多佛性
而是什么
确实没有办法的时候
假如我非要预测一下他属于几班
那就是掷色子
色子哪一面朝上
我就说他属于几班
这个方法看似非常随意
但其实在机器学习很多算法模型里面
模型的起始点
就是随机
比如说我们后面会讲到的
要通过梯度下降法来训练一些神经网络也好
训练其他一些模型也好
我得找一个起始点
这个起始点怎么办
我们只能讲是 千里之行 始于随机
这是我们讲的有生于无的第一个概念
没有模型的时候先随机生成一个
我找不到这个参数的时候
我先随机生成一个
这是第一个概念
有生于无的第一概念
好 我们再看另外一个
比如说我们现在一张图片
大家看一下
就假定我们现在碰到好几个幼儿园的小朋友
这个时候我知道
已经知道有几个小朋友的年龄了
比如说这几个小朋友里面
有一个是三岁的
有另外四个是四岁的
那好我现在想问一下
中间这个小朋友他应该几岁
这时候其实我也不需要有任何模型
也没有任何模型来预测它
那这时候怎么办
我肯定是预测他四岁而不是三岁
为什么呢
少数服从多数是不是
所以当我们没有模型的时候
也就有生于无
没有模型怎么办
很多时候我们也通过
通过均值或者众数来进行预测
实际上 在后面的很多模型里面
其实我们都会发现
在很多模型的某一些步骤里面
都要仰仗这个均值和众数的预测的功能
这也就是我们讲的
当然没有模型的时候
在那些没有模型的岁月里面
要不就是随缘
要不就随机
要么采用这个最简单的
均值或者是众数
开展我们的数据分析
有这个有生于无的最基本概念铺垫之后
咱们就正式进入我们的
我们的算法模型的讲解
首先讲第一种
近邻法
说到近邻法
它其实和我们刚才那个幼儿园小朋友
这个年龄预测几乎没有本质的区别
它是什么
它其实也没有比刚才那个预测的方法高明多少
它什么样的
就我自己这个点在数据空间里面
它先找到自己的位置
然后再环顾我周边还有哪些点
比如说假如我现在找三个点
离我最近三个点
发现有两个点
比如说这个三角形
代表是我是文科那好
那我就把自己设为
自己也设成文科
假如我现在找周边的五个点
来看看最近的五个点
看大部分的同学里面
他们头上贴的标签是什么
1-2-3
5个里面有三个是理科的
那我把我自己贴上标签贴成那个理科
所以所谓的近邻法
就先找自己在数据空间里面定位
然后怎么样环顾四周
看看我周边的K个小伙伴
大多数他们头上贴的什么标签
然后就把我自己贴上相应的标签
贴完标签之后
其实也意味着
也就意味着我这个模型的预测功能就完成了对吧
这样说相对有那么点点抽象
我们给大家举一个具体的例子
比如说我们家现在养了很多家禽
有很多鸡 也有很多鸭
这个时候我们知道
假如我现在在一个二维的数据空间里面
从两个特征上来表征它们的话
一个是声音沙哑的程度
一个是走路这个摇摆的程度
我们发现
鸡的话相对来说
它应该是处于左下角这个位置
而鸭的话处于右上角的位置
也就是说它沙哑的程度比较高
同时走路摇摆程度也比较大
摇摆的幅度也比较大
那好 这个时候我就可以对每一只鸡每一只鸭
在我这个二维的数据空间里面找到一个位置
是不是
现在假如我听其言观其行
我发现什么
我发现有一个新的动物进来了
它在这个位置
大家看一看
假如我一个新的动物进来之后
它究竟是鸭子还是鸡
毫无疑问 它该是什么
它跟这个鸭子离得比较近那它就是鸭子
走路也像鸭子
叫起来也像鸭子
那怎么样
那它应该就是鸭子
当然这是一个相对比较形象的表达
我们在讲这个算法的时候
我们再看看具体从算法语言上来讲
它怎么描述的
这算法的话它输入就是近邻的数目
K近邻
我要找我究竟要找几个近邻
我要观察我周边几个小伙伴
把这个K先确定下来
这是一个输入
另外一个输入训练集
还有一个输入是测试集
一个训练集 一个测试集
输出是什么
对测试集里面的每一个测试样本
预测它的类标号
这就是我们这个算法的输入和输出
咱们来看看这个算法的具体过程
对于每一个测试样本
Z它是(X', y')∈T这个测试集
当然毫无疑问
前面这个X'
是一个特征向量
y'是我这个类标签
目前来讲这个类标签是不知道的
还是未知的
y'还是未知
其实我这个for循环之后结果
就想得到这个y'对吧
计算这个Z和每一个训练样本
大家注意了
是对这个测试集里面每一个需要打标签的那个样本
计算它和每个训练集的样本
(X, y)之间的距离
注意了这个距离是计算什么
是X和X'它的计算
就说y和y'毫无疑问是不用参与这个计算的
它只是这个头上标签而已
并不是在这个数据空间里面这个定位的功能
并没有这个定位的功能
要定位这个数据空间的位置的话
只有这个X和X'
所以我是计算这个X与X'就是特征之间的距离
我选择
再下一步 就选择离Z最近的
一旦这个距离计算出来之后
我就可以选出来
K个离Z最近的近邻
也就说在这个训练样本里面找出K个点
K个样本
找到他之后
我进行什么呢
多数表决
这时候用到这个argmax这么一个函数
这个函数就是一个表决函数
什么意思
就对于不同的类标签
比如我们这边有文科有理科
对咱们这个问题情境来讲 就有文科和理科
那好我看一下
这是一个指示函数
当这里面为真的时候 它就为1
为假时为0
K个近邻里面有多少个为文科
有多少个为理科
当为文科的时候
我可以算一下它总数多少
为理科总数有多少
比如这个五个小伙伴里面有三个是文科
有两个是理科
那毫无疑问我应该就选文科
假如有三个是理科两个是文科
我那有四个是理科一个是文科
那毫无疑问应该选理科
那我最后的结果
多数表决这个y'的结果就是多少
应该就是理科了
这就是我们整个这个近邻法的一个
最基本的一个算法的过程
其实相对是比较通俗易懂的
其实就是在计算这个距离
找到K个最近的小伙伴
然后再看看他头上的标签
贴得最多的是哪一个
然后把我自己贴上标签就可以了
这也实现了我这个算法的输出
我们刚才讲了要找这个近邻要计算这个距离
当然计算距离有很多方法
用得比较多的比如说欧式距离
这个欧几里得距离
或者说这个曼哈顿距离
也称之为街区距离
在R里面有这个dist()
这个函数可以计算这个距离
当然也有一些那个专门的包
比如说cluster包里面有个
daisy()这个函数还可以计算 混合距离
这是我们一些距离的计算的一个过程
前面是一个近邻法一个最基本的原理
但是我们需要提出的是
这里面其实有一个局限性
就是我找身边的K个小伙伴的时候
刚才我们在前面的图里面看到
当我选择三个小伙伴和选择五个小伙伴
它其实结果就明显不一样了
那这时候其实很容易
受我这个对这个K的取值不一样
它非常敏感
要减少这种敏感性的话怎么办
有一种方法叫加权的近邻法
也就是说尽管K个点
决定最后我头上贴的标签
但是当我这K个小伙伴它距离不一样的时候
那每一个小伙伴它对我最后
我应该贴什么标签
它影响力是不一样的对吧
离我越近的应该怎么样
因为物以类聚人以群分嘛
离我越近的话它的影响应该是越大
那离我越远的话
即便可能个数多一点
但因为他那几个点离我都很远
那有可能我还是要按照我这个
离我最近的这个标签来贴对不对
这时候有一个所谓的
距离的加权表决
他其实还是这么一个表决函数
但是这个时候就
不仅计算个数了
还要算什么
把他的什么距离的因素考虑进来进行加权
这个加权的函数其实可以有不同的核函数
有不同的核比如说可以通过这个高斯核
或者通过其他一些核函数
比如求这个倒数都可以
它所表征的意思
都是距离越远
那我的相应的这个权值就越小了
距离越小的时候这个权值越大
最终是看
后面的值
哪一个值每一个标签是最大的
最大的一个标签我就设为
我就将我自己贴成y'
贴上相应的标签就可以
这就是所谓的加权的这个近邻法
一个最基本的原理
好 那最终这个K究竟该如何确定
或者我相应的核函数究竟该如何确定
我们说一下就是K的值的确定
一般来讲我们没有一个明确的算法原理
或者明确的一个最基本的原理能告诉我们
在某一组数据里面
你应该把K设为哪个值
应该怎么办
一般都是直接通过实验的方法
我拿过来试一试
我从K等于1开始我来不断的尝试
究竟K等于几的时候
最后的模型性能指标表现最好
说白了就是
要确定这个K的话
其实没有什么特别的一个理论上的方法
更多通过实验的办法来解决它
就通过实验表明
确实哪个K取值最好的话
那个误差最小
那我就设定相应的K
包括我们刚才讲的这个权值确定那个核函数
其实也是一样的
就是K和核的确定
它其实最终都通过实验的方法
而非这个纯理论的方法推导出来的
好以上就是我们关于这个近邻法的一个
原理的最基本的介绍
至于具体在R里面如何实现
我们下次课再讲
本次课到此结束
谢谢大家
-第1章 气象万千、数以等观
--第1章 作业
-第2章 所谓学习、归类而已
--第2章 作业
-第3章 格言联璧话学习
--第3章 作业
-第4章 源于数学、归于工程
--第4章 作业
-讨论题
-第5章 工欲善其事、必先利其器
--第5章 作业
-第6章 基础编程——用别人的包和函数讲述自己的故事
--6.1 编程环境
--6.4 控制流
--第6章 作业
-第7章 数据对象——面向数据对象学习R语言
--第7章 作业
-第8章 人人都爱tidyverse
--第8章 作业
-第9章 最美不过数据框
--第9章 作业
-第10章 观数以形
--第10章 作业
-第11章 相随相伴、谓之关联
--11.1 导引
--第11章 作业
-第12章 既是世间法、自当有分别
--12.1 导引
--第12章 作业
-第13章 方以类聚、物以群分
--13.1 导引
--第13章 作业
-第14章 庐山烟雨浙江潮
--第14章 作业