当前课程知识点:R语言数据分析 >  下部:博术 >  第13章 方以类聚、物以群分 >  13.3 层次方法

返回《R语言数据分析》慕课在线视频课程列表

13.3 层次方法在线视频

下一节:第14章 庐山烟雨浙江潮

返回《R语言数据分析》慕课在线视频列表

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的

他其实也有些科目考得不好

也是这种拐脚的科目

所以我们通过基于这个层次聚类法

这么一个非常简单非常直接的

一种理念一种直觉

然后把它变成数学语言之后

进行计算 算法设计实现

发现这个通过这种算法

所检测出来的异常值确实是有意义的

他不只是分数低而已

不是简单的考虑一个总分高低的问题

而考虑到什么

这个成绩所构成的结构本身

我们也能考虑到其中一些异常因素

当然我们并不是说这个算法

本身是多么的优异多么的好

我们只是说在学习的过程中

不仅要掌握已有的算法模型

更需要什么

进一步的结合问题的情境

我们有一些相应的直觉

在嫁接 结合的过程中

我们有一些新的算法的创新

本次课到此结束

谢谢大家

R语言数据分析课程列表:

上部:问道

-第1章 气象万千、数以等观

--第1章 气象万千、数以等观

--第1章 作业

-第2章 所谓学习、归类而已

--2.1 所谓学习、归类而已(I)

--2.2 所谓学习、归类而已(II)

--2.3 所谓学习、归类而已(III)

--2.4 所谓学习、归类而已(IV)

--第2章 作业

-第3章 格言联璧话学习

--第3章 格言联璧话学习

--第3章 作业

-第4章 源于数学、归于工程

--第4章 源于数学、归于工程

--第4章 作业

-讨论题

--如何发挥人工智能的头雁效应

中部:执具

-第5章 工欲善其事、必先利其器

--第5章 工欲善其事、必先利其器

--第5章 作业

-第6章 基础编程——用别人的包和函数讲述自己的故事

--6.1 编程环境

--6.2Mini案例

--6.3 站在巨人的肩膀上

--6.4 控制流

--6.5 函数(I)

--6.6 函数(II)

--第6章 作业

-第7章 数据对象——面向数据对象学习R语言

--7.1 向量与因子(I)

--7.2 向量与因子(II)

--7.3 矩阵与数组(I)

--7.4 矩阵与数组(II)

--7.5 列表与数据框(I)

--7.6 列表与数据框(II)

--第7章 作业

-第8章 人人都爱tidyverse

--第8章 人人都爱tidyverse

--第8章 作业

-第9章 最美不过数据框

--第9章 最美不过数据框

--第9章 作业

下部:博术

-第10章 观数以形

--10.1 一维数据空间(I)

--10.2 一维数据空间(II)

--10.3 二维数据空间

--10.4 高维数据空间

--第10章 作业

-第11章 相随相伴、谓之关联

--11.1 导引

--11.2 关联规则(I)

--11.3 关联规则(II)

--11.4 关联规则(III)

--第11章 作业

-第12章 既是世间法、自当有分别

--12.1 导引

--12.2 近邻法(I)

--12.3 近邻法(II)

--12.4 决策树(I)

--12.5 决策树(II)

--12.6 随机森林

--12.7 朴素贝叶斯

--12.8 逻辑斯蒂回归

--12.9 人工神经网络(I)

--12.10 人工神经网络(II)

--12.11 支持向量机

--第12章 作业

-第13章 方以类聚、物以群分

--13.1 导引

--13.2 划分方法

--13.3 层次方法

--第13章 作业

-第14章 庐山烟雨浙江潮

--第14章 庐山烟雨浙江潮

--第14章 作业

13.3 层次方法笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。