当前课程知识点:R语言数据分析 > 下部:博术 > 第13章 方以类聚、物以群分 > 13.3 层次方法
大家好
欢迎来到《R语言数据分析》课程
在前面课程里面我们简单交流了一下
基于划分的kmeans方法
今天我们跟大家一块交流一下
另外一种方法也非常经典
叫做层次聚类法
和咱们前面kmeans方法不一样
咱们这个层次聚类法它是
它是试图在不同的层次上对数据集进行划分
它的结果是一个谱系图
或者说树状图
也称之为系统树图
也就是说我通过这么一个树状图
通过这么一个谱系图来表征数据对象
就是说在我这个数据空间里面
它数据对象的一个距离的远近关系
具体什么意思
比如说我们这是一个二维的数据空间
我们可以看得出来
点3和点6这两个数据对象是离的最近的
那我先把它合并
再比如说这两个点
相对来说和这个4离得又比较近
再给它合并
然后和这个上面这个点第一个点
我再进行一个嵌套一个合并
那相反的这个2和5相对也比较近
它也离得比较近
然后最后才是我们整体这个数据点
整体这个一个数据对象的一个远近关系
所以可以通过这么一个
咱们一个谱系图可以看得出来
就像血缘关系一样
距离上谁近一点
谁相对远一点
习惯上理解
这是我们所谓的层次聚类一个最基本的思想
那具体怎么做
我们看一下它的一个算法过程
最基本的那个层次聚类的话它其实有两种方向
一种是自上而下的不断的分裂
另外一种是自下而上
一层层往上凝聚
咱们看这种那个凝聚的方法
凝聚方法分这么五个步骤
首先是计算邻近性的矩阵
也就说把不同的簇
大家注意了
不是不同的点
而是不同的簇之间的距离先算出来
然后进入一个不断的循环迭代的过程
具体循环过程是什么呢
合并最近的两个簇
然后我再重新再次更新
不同的这个簇之间的距离
因为你合并一次之后
刚开始可能总共有m个点
然后合并一次之后 变成m-1个点
就相当于有
我们刚开始的m个点
我都视为m个簇
每个点作为一个簇
然后合并完之后就变成了m-1个簇了
m-1簇之后
它这个m-1个簇相互的距离的关系怎么样
我重新更新一下
然后再
再次计算
再次进行合并
在看看这个m-1个簇里面
哪两个最近
我再合并
变成m-2个簇
一直这样
一直迭代一直迭代
迭代到什么时候
只剩下一个簇
只剩下一个簇
因为你每次两两合并
每次两两合并的时候只会越来越少
最后变成一个
(这就是)我们这个层次聚类
这个凝聚的这么自下而上的那个最基本的过程
所以我们要强调一下
在这个凝聚的过程中
它其实都是在算不同的簇之间的距离
那好 不同的簇的距离是怎么算的
我们说这个层次聚类
它其实关注的是簇之间的距离
但是簇之间的距离其实是
基于它所包含的点来定义的
比如说它有下面这种典型的那么四种方法
第一种最小距离
就对于两个簇来讲
它的距离怎么算
我就看它所包含的点
比如说P是在这个第一个簇里面Ci里面
P'在第二个簇里面
那好我就看这两个任意两个点
这两个群里面任意两个点它之间的距离
哪一个最近我就视为
将它定义为这两个簇之间的距离
这是一种那个最小距离法
最大距离是
最大距离是
就是我也是在这两个点群里面
这两个簇里面分别选任意的两个点
然后计算它们之间距离
找最大的一个
作为我这两个点群之间的距离
当然还有一种就是平均距离
什么意思
我把所有的点
比如说P在这个Ci这个群里面
然后P'在这个Cj这个点群里面
那好
那任意两个点两两之间的距离都计算出来
计算出来之后我取一个平均值
取个平均值
然后作为这个两个点群之间的距离
当然还有另外一种方法
最后一种就是这个均值距离
什么意思
就我把这两个点群之间的质心先找到
它的那个中心在哪
然后我计算这两个中心之间的距离
作为两个点群的距离
这就是我们通常典型的有这么四种
计算簇之间距离的方法
所以它们其实最终都是什么
最终是点的距离换算过来的
这样说可能稍微有点抽象
我们看一看具体的这个图形
来展示一下
比如说第一种
这里面我们都是分成两个点群
两个簇
这毫无疑问
第一种就是所谓的最小距离
这里面其实有好多不同的点
之前都有什么相应的距离可以计算
但是我们发现
这两个点离得最近
我就把这个距离视为这两个点群的距离
大家注意了是点群的距离
那第二种毫无疑问
这就是所谓的最大距离法
最大距离法
这里面也是有若干个点相互进行组合
你也把可以把不同的点的距离也进行计算
但是这两个点群距离怎么定义
我把这两个点群里面最远的两个点这一对
它之间的距离定义为我这点群的距离
第三种就是我们所谓的平均距离
把每一个点的相互之间两两组合
每一个点对之间的距离都算出来
算出来之后
我把它们取一个平均值
作为我这个所谓点群之间的距离
最后这个我先把每个点(群)的中心先找到
先把中心找到
找到之后
看看中心点之间的距离
中心点之间的距离
这就是我们通过图的方法直观的理解一下
究竟我们所谓的四种不同的簇之间的距离
是如何定义的
一旦通过这个点之间的那个距离
换算成出簇之间的距离
那其实所谓的层次分析法就是
不断的凝聚
不断的合并
离得最近的两个点群
最近两个簇
在R里面实现的时候
第一种叫这种
最短距离叫single
这个complete
下面也有什么相应的平均的以及相应的
这个中心点的
咱们看看R里面具体如何实现的
我们说到那个具体某一个算法实现的时候
毫无疑问还是可以先看
这个Task View
因为它是一个官方的一个
官方的一个对我们整个这个包进行一个梳理
分成不同的主题
然后在这个对于聚类分析而言
它专门有一个主题叫Cluster
专门有一个主题叫Cluster
那这里面就对聚类分析的相应算法
相应的包以及里面的函数
进行一个归纳
可以看得出来
这个hclust是我们用的比较多的
而且它是在哪
在这个stats
这个stats这个包里面
这个stats包里面
应该是这种凝聚
自下而上的凝聚这种算法
用得最多的一个函数了
咱们看一看具体的这个函数如何使用
我们这样我们为了演示
我们就将700多个同学
我从里面选了十个出来
当然最后的模型评估模型的应用
我们还是基于700多个数据
但是为了展示整个这个建模的过程
以及建模的结果来解释
我先选其中十名同学先来看一看
具体如何调用这个hclust的函数
首先我选择了十个同学
我从这个成绩表里面filter
filter
就是姓名在这个
就包含了这几个名字的这个字符的相应同学
我先取出来
这个时候毫无疑问只有十条记录
然后我只选择
只选择姓名这一列以及这九门科目
当然我最后聚类的时候
毫无疑问是用那九门科目来做聚类
这个稍微要注意一下将姓名这一列
作为什么
作为我的一个行名
这个非常关键
就尤其是后面计算这个dist()的
计算这个距离矩阵的时候
包括我后面要对这个hclust
层次聚类结果进行展示的时候
要展示出来具体的标签的话
那这个是必不可少的
得把这个姓名直接给变成行名了
变完之后
我们通过这个dist()函数
求出来这个距离矩阵
就这十个同学两两之间的距离
十个同学两两的距离
然后 在这个基础之上
就可以调用这个hclust
大家注意了
和我们前面的kmeans不一样
这个hclust它所接受的参数是谁
是这个距离矩阵
而不是说这个scores本身
不是这个数据集本身而是
而是已经换算出来的距离
这其实更加灵活
无论是我们这个数据单纯的数值型的
由数值型属性所组成的数据集
还是说它是混合类型的
比如混合类型
我要改成什么
这个dist改成那个daisy
这个cluster包里面的daisy
然后计算完之后
这个距离我再交给这个hclust
所建的模型
我们同样是把它放到imodel到里面来
咱们看一看这个imodel的这个
具体的模型它包含哪些组成部分
当然假如我们直接把这个imodel的拿过来查看的话
它会告诉我们首先你是如何调用它的
然后这个时候所采用的这个簇之间的
距离定义方法是
是complete
也就是说
最远的那一条
最远的那一个
Distance是用了欧式距离进行计算
我们总共有十个数据点
也就十个数据对象进行参与聚类
好 我们看看这个imodel
毫无疑问它还是一个
还是一个list还是一个列表
这里面包含了很多个组成部分
这些组成部分我们需要拿出来看一下
进行一个讲解
里面可能有些部分还是确实是需要
深入了解一下
它究竟是一个什么意思的
咱们先看第一部分
imodel的第一部分这个merge
这么一个组成部分
我们拿完之后取出来一看
这边总共有
1-2-3-4-5-6-7-8-9
有九行 有两列
那这边有些是负的有些正的
一眼看过去的时候
其实看不太懂它什么意思
当然假如我想知道
比如说我第一次接触这个函数的时候怎么办
我直接用问号问一下hclust
它究竟是表示一个什么含义
当然我们从字面上来讲
它是什么
它是一个合并的过程
将这个合并的过程怎么样给体现出来了
这时候我们可以这样
我们把整个这个十个同学我拿出来
同时把这个我们后面这个要
凝聚的图我们拿出来
看一看它究竟是如何凝聚的
我们前面选了十个同学
这十个同学在我们这个scores里面排名
分别是第一个同学叫于知平
后面就是这个总共有十个同学
那好 我们看看
第一行
这代表什么意思
-7 -8表示什么意思呢
首先第一次合并的是谁
是第七个和第八个同学
第七个第八个数据对象
我们看一下第七个 6 7 8
伊礼贤 鲁孟秋 也就是谁
这一部分先做了第一次合并
然后第二次我们看第二行是-6 -9
毫无疑问就是
焦金音和宁琦
这进行第二次合并
进行第二次合并
因为首先是它们这个两个簇
总共刚开始总有十个簇
对吧然后计算每个簇之间的距离
之间距离最近
合并 合并完之后剩下九个簇对不对
九个簇的话
一看这两个簇是最近的
就进行第二次合并
我们第三步的话
看这里面是有1和2
那好
它是不再是负的是不是
这个时候表示它不是两个簇进行合并而是
而是第一步合并的结果和
第二步合并的结果再进行合并
对不对
第三步这个时候是什么
这是第三步
所以大家注意了
这里面正负的含义就出来了
对不对
是第一步合并的结果和第二步合并结果
变成第三步进行合并
然后这个时候毫无疑问那个簇又减少了
对不对
簇又减少了
在这个簇和后面1 2 3 4 5 6总共七个簇里面
我再选看哪个簇离的最近
接下来
接下来合并的
第二个和第十个进行合并
对不对
这一步进行合并
这就是第四步
以此类推
逐渐
逐渐进行
总共最后
进行了九次合并
因为你十个数据对象的话
毫无疑问进行九次合并之后就变成了什么
就变成了一个整体的这么一个系统的树图了
或者说一个谱系图
所以这就是我们
imodel返回的结果里面
第一个组成部分
这个merge这个合并的过程
好 咱们再看下一个
第二个组成部分height
height什么意思
也就说我们旁边这个图
假如我们绘制出来的话
它有一个这个height的这么一个对象
这时候我们可以看一下
这个height的有
4
5.29
7.93
这分别代表什么意思
这个其实就是什么
就是我合并的时候
这两个簇合并的时候
这个两个簇的取值
就是它的距离
因为我们刚才说了
根据这个距离远近
根据它相似性也好
距离远近也好
我来不断进行合并对不对
合并的话那好
你当前这个在第一次进行合并的时候
这就是和我们前面合并的步骤应该是一致的
第一次进行合并的时候
它应该是4
也就说这两处之间的距离多少是4
对吧
其实我们毫无疑问我们可以发现
就是假如我采用的这个complete
这种方法的话
其实这里面4 5 7
一直到134
其实应该都是
都应该是我原始的点和点之间的距离
某一个取值
那这个4的话毫无疑问是
是原始的这个距离矩阵里面最小的一个取值
关于这一点其实我们可以验证一下
可以验证一下
比如说我们现在先将这个height先取出来
然后我将这个距离矩阵
dist(scores)我从小到大进行排列
毫无疑问
第一个是多少
第一个就是4
然后我们其实也可以这样
就是可以按照前面那个合并的过程
我们来对照一下
是不是不同的点群之间的最大的值
和我这上面的正好就是一致的
和我们上面这个height正好是一致的
就这个合并的过程
当然毫无疑问
你最后一个值应该是多少
应该就是我这个最大值
其实我们可以将它标出来
发现这还是比较明显的
这个时候其实看得出来
这个height所谓的height
就是在合并的时候这个簇之间的距离
当然你的所有采用的合并的方法不一样
那这个height所代表的含义也不一样
咱们来看下面这个
order什么意思
其实我们看得出来
7 8 6 9 4 1 5 3 20
其实就是什么
就是我刚才这个谱系图里面的什么
谱系图里面的那个顺序
第七个
第八个 第六条
第九条 第四 第一 第五 第三 第二 第十
分别这十个同学从左到右的排序的过程
当然假如我在绘图的过程中
它肯定是按照这个顺序来的
比如说我现在想把它左右调一下位置可不可以
比如把这个imodel$order改成
rev(imodel$order)
这个imodel$order可不可以
也可以
当然我们一般不推荐这样做
然后这个毫无疑问就是什么
imodel$labels
就是每一行的这个数据点的标签了
那下面这个是我们刚才看到的簇
簇和簇之间的距离是如何定义的
是一个complete最长的距离
这个是我们这个函数调用的方法
最后这个
这个距离计算方法采用的是欧式距离
欧式距离进行计算的
这是我们对这个建模结果一个最基本的解释
当然这个时候谱系图是已经有了
我们脑子里面已经能构建这个谱系图了
但是它究竟分成几类
我们来看一下相应的函数
假如我现在想将这个谱系图分成两类的话
调用什么函数
cutree
这么一个函数
cut 没有两个t
只有一个 只有一个t
就表示把这个树切分 切分一下
切分成两部分
这时候返回结果是什么
其实就是每一个数据对象它所属于哪一类
咱们看一下
咱们看看具体这个cut的过程
其实我们对这么十个数据对象来讲
你想cut成几类都可以
假如你不cut的话它就是一类
你现在有一条线自上而下往下走的时候
这时候剪了一剪
这变成两部分了
这边是一部分这边是一部分
所以这就是K等于2的过程
当假如你这个线再往下压的时候 留到这个位置
我又把它进行切分了
是不是
这边是一部分
然后这边变成了两部分
是不是
cut成三部分了
你再往下走的时候可以cut成四部分
五部分一直cut到最后可以
cut成十部分
所以这里面cut几部分的话
完全取决我们自己的
对这个问题情境本身的理解
当然我们后面也可以看
就是cut成几部分的时候
它轮廓系数它的平均值是最大的
可以通过一些定量的方法来进行计算
所以这是我们所谓一个cut的过程
是一条线
自上而下
看看它究竟能把哪些点给剪掉
把哪些线给剪断了
剪断之后分别成几部分
分成几部分
这里面K的取值不一样
我们整个这棵树
可以把它分成不同的
聚成计算不同类
不同的个数的类别
这里面有它的灵活性
当然这是一个最基本的方法
我们可以先将这个树先画出来
plot
后面这个参数设为-1表示什么意思
表示底端对齐的
否则的话就吊在上面
在画完之后
rect.hclust表示什么意思
我在上面cut完之后怎么样
我将这个结果用红框把它框出来
当然这种方式当然是可以的
基本上已经来满足我们最基本的需求了
就是一个谱系图
怎么把它分成不同的类别
当然我们也有更好的办法 更漂亮一点
同样我们还可以调用这个包
factoextra
这个包
这个包其实
在聚类包括其它一些无监督学习
比如主成分析等等很多方面都做得非常好
我们可以调用其中的这个函数叫hcut
调用其中函数叫hcut
当然里面也接触一些比如说距离
进行一个
作为一个参数
K设为2
cut成两部分
然后调用的函数
具体算法
还是这个hclust
我们连接方法也还是什么
按照最长距离来定义我两个簇之间的距离
这个具体的计算方法
这个距离计算方法还是欧式距离
欧式距离等等
设置相应的参数
设置完之后
这个结果交给谁
交给fviz一看又是什么
又是一个可视化的绘图函数
绘制成一个谱系图
绘制成一个谱系图
咱们看一下这个谱系图的过程
这个谱系图相对刚才那个比较简单的谱系图
就相对漂亮点
整个这个风格已经有点像那个ggplot2的风格
而且整个这个颜色
比如说这些分成两部分
整个这个从这个线条的颜色到这个叶子节点
这个颜色都非常漂亮
当然假如我们再给它设置更多参数的话
可以调出更漂亮一个图形出来
这个包其实还是值得我们多关注一下
在看完了这个直观看完这个谱系图之后
我们再看看如何来选择相应的K
如何来进行相应的模型的评估
其实模型评估的话
其实我们还是要做什么
还是可以调用这个cluster里面的
相应的函数来计算它的轮廓系数
计算方法还是跟我们前面讲的
这个kmeans里面是一样的
它计算轮廓系数的话至少包含两部分
第一部分我究竟是基于
哪个距离矩阵进行计算的
这不同点之间的距离
我得先算出来
这是第一部分
第二部分我要把每一个数据点
它属于哪一类给算出来
给明确出来
我们现在通过这个hclust来进行建模
所以我假如我要明确每一个点属于哪一类的话
我需要cutree()这个函数
它返回的结果就是我们刚才看到的每一个类别
将这两个参数
交给我们这个计算这个轮廓系数的函数
很自然就将每一个数据点的轮廓系数
都算出来了
然后同样可以调用这个
factoextra里面的
可视化轮廓系数的函数
进行可视化
我们看一下
这个时候总体的轮廓系数
它的平均值多少 0.25
也是把它分成两类
我们来看一看
当然我们可以在对应
将它看得成三部分 四部分的时候
做一个比较
当然最后结果应该还是我们K等于2的时候
它相对效果是比较好的
我们还是同样加载这个factoextra
这个包里面的fviz_nbclust
这么一个函数来绘制
我们K取不同的值的时候
它相应的轮廓系数的平均值
它的一个分布情况
这种枚举还是从2一直到多少 到20
显然这里面用的方法是什么
还是这个层次聚类方法
和我们前面用到的hclust稍微有点点区别
这是这个包自带的一个层次聚类方法
参数的设置稍微有点不一样
咱们看一下具体结果
可以看得出来
它其实也是这么一个形状
先往上走
然后再往下 往下走
这其实是我们最希望看到的形状
因为只有说我整个这个趋势是先往上走
再往下走的时候
你这个枚举 再往下枚举才没有必要了
这时候我们可以看得出来
其实K取2的时候
还是一个取得最大的值
轮廓系数还是最大
就证明什么
我们采用这个层次聚类法的话
其实同样是K分成两类是最合适的
当然因为我们前面讲了
这个它用的是hcut
这个factoextra自带的一个函数
里面参数设置有点不一样
所以这个轮廓系数的取值
和我们前面稍微有点点区别
既然我们K取2的时候也就是说分成两类
这个是效果最好
那和我们的文理分科实际的标签
是不是正好对应的
我们看一下
我们同样还是采用这个hclust
来进行我们这个聚类
聚完类之后把它分成两类
把这个树分成两类
我们看一下它和实际的我这个文理分科
来进行一个对比
对比结果我们看多少 0.28
这个结果就比较理想了
因为我们前面在用这个kmeans方法的时候是0.3
超过0.3
然后这个通过这个层次聚类的话
我们这个分类错误率已经迈进了多少
迈进了0.3以内了
就是0.28
或者说十之七八
我们这种方法所聚的结果
它是对的
这也进一步说明
我们通过这九门课确实能进行这个文理分科
在一定程度上能进行文理分科
这是我们这个和实际类标签一个对应的情况
我们前面简要的讲解了一下
机器学习领域一些经典的算法模型
下面我们再来谈另外一个问题
在我们学了一些算法模型之后
我们如何进行所谓的一个学术创新
这里面我引了几张图
一个是敬爱的袁隆平院士
杂交水稻之父
中间这个什么是一个果树嫁接的过程
最右侧这个谁
这是个混血儿
这边其实我把这三个图放在一起
表示什么意思
其实我想说的是什么
所谓的学术创新在很大程度上是什么
跟它们是一样的
是一个杂交 是一个嫁接
是一个混血 是一个跨界
是一个混搭 是一个交叉
是一个遇见 是一个结合的过程
当我们能把已有的算法
不同的理论模型结合在一起
当我们能把一个算法应用于一个新的情境的时候
往往我们就能做一些学术上的创新
咱们看一下
比如我们刚才讲的这个层次聚类法
当然我们可以作为聚类分析当然是可以的
但是其实这种方法里面
假如我们和另外一个结合起来一个应用情境
和这个什么情境这个异常点检测
或者异常侦测 离群点检测 结合起来的话
其实这里面就有一些新的思路了
而且我们后面给我们提供一些新的信息
毫无疑问
我们看这个层次聚类图
假如我要看
不仅仅是看这个合并关系距离远近的话
假如我想看哪些点是比较异常
那毫无疑问中间这一条是吧
中间这条红的我们是非常关注的
很显眼
为什么
从直觉上看
其它的都是一群一群的
唯有这个是什么
它相对是形单影只的
也就是说从这个聚类的合并的过程中
层次聚类合并的
自下而上进行合并过程中
其实能给我们一些启发
什么启发
就这个异常点的话
它基本上都是什么
是比较后
比较靠后才来
被结合在一起
才合并在一起的
而且一般来讲都是作为一个小的群 被合并
也不是我在一个大的群里面去合并别人
所以这种情况之下
一般来讲它就更加
更加趋向于这个所谓的离群
我们有这个直觉之后
我们后面就可以做相应的一些算法的创新了
其实所有的创新应该都是先有直觉
然后再有什么具体的理论推导
直觉是什么
就是离群值是不容易合并的
当它们被合并的时候
应该就一般属于在一个小群里面
被大群合并
这种点比较趋向于作为离群点
那这个时候我们得把它转化成数学语言
什么意思
若对象x参与第i次合并的时候
我们可以算这一次的
对x来讲
它的离群值是什么
就是
它自己所在这个群
它的所包含对象多少
或者说这个群的大小
还有一个就是把它合并的
跟它一起进行合并的
因为每次都是两两合并
就是另外一个群的大小
用另外那个情况大小减掉它
再除以什么
二者相加
当然后面这个属于规范化的过程
也就是说我在合并的时候
就是我是究竟是我是大的合并别人
还是别人是大的来合并我
尤其是这个差距越来越悬殊的时候
越悬殊的话
证明我这边什么
我这边的那个离群的可能性就越大
这是对
对象x来讲
它进行和参与第i次合并的话
那我就记一次得分
那最后这个对象x 它的离群值是什么
我就取这个所有前面那个若干次
被合并过程中
它离群值的最大值
这样说相对有点抽象
咱们还是看一个实际的例子
看一个实际例子
比如说现在有这么一些
总共有这么多同学
这么多同学我要进行一个合并
那好
我们可以看得出来这个总共是经过多少次合并
总共经过了十次合并
比如我现在先关注这个这个应上清这个同学
他其实参与了几次合并
两次
第一次是第九次合并的时候参与了
第二次第十次合并的时候它又参与了
第九次合并的时候我们看一下
是他合并别人还是别人合并他
应该是别人合并他对不对
1-2-3-4-5-6
另外那个群他不在
他是跟他一起合并了的另外一个群
他的大小是6
然后他自己大小只是1
那毫无疑问这个是多少
应该是6-1除以多少6+1
七分之五对吧 七分之五
那这个值应该多少
应该是0.7
0.7多一点对吧
然后第二次合并的话
毫无疑问这个是多少
1-2-3-4-5-6-7
7个是我自己的
然后1-2-3-4
4个是对方的
那我是大的合别人小的
那我毫无疑问他减我的时候变成负值
负值的话应该就是取零
那毫无疑问
他参与两次合并里面最大的一次就是多少
七分之五
那这时候我们可以把他的这个值算出来
应该就是0.71
同样我们可以算这个
比如说这个第一个同学
第一个同学他参与几次合并
第一次 第六次 还有第十次
还有第十次
第一次的时候他为多少
第一次的时候他是为零
对不对
因为对方减我的时候
对方也是1我也是1那为零
那第二次我所在的群是两个
对方也是两个 还是零
第三次
第三次就不一样了
1-2-3-4-5-6-7
七个对吧
我自己只有几个
只有四个
那相当于有多少
7-4除以多少
7+4
所以第十次合并的时候
给他的那个赋的这个离群系数应该是这个3/11
我们相应的取值可以算出来
0.27对吧
那我们其实可以把所有的这些对象
我们都算一下
它相应的离群值
按照这个方法可以得出来
分别是0.27 0.27
这个中间这个最大0.71
然后这个相对大一点点是0.33左右
也就是说
通过这么一个层次聚类的一个过程
我们可以看得出来
这里面我们认为最有可能什么
最有可能的这个离群的点
它确实离群系数是比较大的
那好
这是我们从这个算法逻辑上讲也好
从直觉上讲也好
它都是合理的
那我们看一看对我们
文理分科这份数据是不是适用
咱们看一下具体结果
在R里面我们可以调这个包
DMwR
就是《Data Mining with R》
这是专门一本书
当然它正好也有个配套的包
就是DMwR
这个包里面有一个outliers.ranking
有这么一个函数
就是基于我们刚才讲到的
基于层次聚类法进行离群系数的那个计算
这也比较简单
就是我们这个距离的矩阵交过来
交过来之后
后面相应的它的距离
它的算法hclust
以及当然这个连接的方法
是用了另外一种叫ward.D
它跟我们前面讲的complete啊single啊等等还有点区别
这个时候这个函数跟按照我们刚才的算法
把那个离群系数算出来
我们现在可以什么
将所有同学的离群系数算完之后
我进行一个排序
从高到低进行排序
看看哪些同学他最有可能离群
同时我可以和我们之前
在这个认识数据的时候所讲到的
通过这个箱线图也可以进行离群值的排名
就是boxplot
什么意思
就在我这个箱线图里面
假如我第三分位数
加上1.5倍的四分位距
我还罩不住这个数据
我都认为它是离群的
或者说第一分位数减掉1.5倍的四分
四分位距可能还罩不住
比这个数还小
我也认为是离群的
我们也可以通过这个boxplot这个方法
箱线图的方法
也来找这个离群点
我们来比较一下
两个得到不同的离群值的那个差别
有没有什么不一样的地方
同样
我们是调这个boxplot.stats
将其中的outliers取出来
并且进行展示
好 我们看一下结果
我们通过这个箱线图
总成绩箱线图分析异常值
当然我们在这个结果基础之上
我们又进行了一个排序
就根据这个成绩的高低
从低到高进行排序
可以看得出来
假如我们通过箱线图来进行这个异常值检测的话
它所检测的值都是什么
都是比较小的值
就是总成绩都比较低的
有为零分的
有500多分的
九门课只考了500多分
当然还有600多一点点的
这个时候都是成绩特别差的一些同学
我们都视为离群值
那我们再看看
假如我们通过刚才这个
所谓的基于层次聚类法的
这么一种异常值检测
这种方法计算出来的离群系数
比较高的那个记录
它有什么特点
我们看一下
成绩为零的同学
他的离群系数还是最高的
但是 我们排第二的大家注意到没有
排第二的这个离群值
他其实成绩并不是很低
他736
成绩并不低
为什么
这消息给我们一个很有意思的一个信息了
700多分为什么说他离群值居然还这么高
那我们看一下
看下记录
这个叫成朝龙的同学
语文84
数学外语
政治
注意了
历史为零分
历史为零分
后面其它科目都非常好
也就是说有一门为零分的时候
他还能考736分
这当然也是一个很特殊的情况
我们通过前面箱线图
那种离群值的检测方法是检测不出来的
像这种具有拐脚的科目的
再比如说这个同学553的
他确实有两个都比较差
都比较差
再比如这个779的
他其实也有些科目考得不好
也是这种拐脚的科目
所以我们通过基于这个层次聚类法
这么一个非常简单非常直接的
一种理念一种直觉
然后把它变成数学语言之后
进行计算 算法设计实现
发现这个通过这种算法
所检测出来的异常值确实是有意义的
他不只是分数低而已
不是简单的考虑一个总分高低的问题
而考虑到什么
这个成绩所构成的结构本身
我们也能考虑到其中一些异常因素
当然我们并不是说这个算法
本身是多么的优异多么的好
我们只是说在学习的过程中
不仅要掌握已有的算法模型
更需要什么
进一步的结合问题的情境
我们有一些相应的直觉
在嫁接 结合的过程中
我们有一些新的算法的创新
本次课到此结束
谢谢大家
-第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章 作业