当前课程知识点:R语言数据分析 > 下部:博术 > 第13章 方以类聚、物以群分 > 13.1 导引
大家好
欢迎来到《R语言数据分析》课程
在前面课程里面我们简单讲解了一下
以分类为代表的有监督学习
从今天开始咱们简单交流一下
以聚类为代表的无监督学习相关的内容
我们通常有句话叫物以类聚
人以群分
假如我们再把这句话再往上追溯一下的话
在这个《易传》里面有一个类似的话叫
方以类聚 物以群分
当然在我们日常生活中说到
物以类聚人以群分的时候
绝大部分都是什么
都是一种定性的判断
他是不是跟我同一类的
非我族类 其心必异
类似这样的
它都是定性的判断
假如是通过定量的判断的话
那我们就是要引入这个聚类的分析
什么是聚类分析
我们先看几张图
先看这个左侧这个图
这是姚明和曾志伟
这个图是在网上流传很广
毫无疑问
假如我是说性别的话
他们是同一类的
都是男人对吧
但假如说身高的话
毫无疑问它们不是一类人
也就说从这个单一的维度来讲
单一的维度
从身高来讲
有些人是一类
另外一些人是另外一类
但是绝大部分情况之下我们在
对某个观测对象
进行判断进行分类的时候
我们不仅仅关注一个维度的信息
而且关注多个维度的信息
比如说我们下面这张图
这是年轻时的姚明
过渡过渡过渡一下过渡到什么
曾经的超女李宇春
假如我们从图像识别的角度来讲
这两张图像毫无疑问是非常非常相似
也就是说从图像本身来讲
他们应该归为同一类
那这种归为一类的话
毫无疑问
我考虑好多因素
它不仅仅说
像我们前面这个身高这一块单一的维度了
这里面可能图像里面很多特征我都得同时考虑
然后我再来判断
他们俩是同一类的 是比较相似的
也就是说 假如说我从定量角度来考虑的话
我需要考虑多个维度
比如说头发 鼻子 眼等等
就在这个张成的数据空间里面
假如我能拿到数据
有几个变量
有几个属性 有几个特征
它就相应的张成了几维的数据空间
那好
它在这个几维的数据空间里面
每一行都是相应的是一个点
也就是说每一个观测对象都是什么
表现为这个数据空间的一个点
那好
在这个数据空间里面
离得比较近的是一簇
离得比较远的是另外一簇
这就形成了一个自然的结构
这其实就是我们接下来要讲的什么
聚类分析
通过聚类来判断
哪一些是物以类聚 人以群分
哪些是人是一群
哪些物 哪些观测对象是一类
当然说到我们这个聚类分析
毫无疑问它还是类
它最终结果还是类 还是类别
因为一旦没有类别的概念的话
很多事情我们是没有办法认识的
我们刚才讲到了
比如说非我族类
其心必异
对吧
类同类似 或者不伦不类等等
都涉及到很多关于类的概念
那聚类分析的话
其实是找到类的一种定量的手段
就是数据分析里面找到类的一种定量手段
它的名字叫cluster analysis
简称聚类
也就说把我的数据对象划分成不同的群
不同的簇 不同的子集的过程
每一个子集是一个簇
大家注意了这个念簇不念族
就是一个cluster就是一个簇
我们聚类的目的是什么
就是使得簇里面的对象彼此相似
不同的簇的对象
彼此相异
就差别比较大
同一个簇比较相近
不同的簇离得比较远
我们说聚类分析是什么
虽然也是得到最终结果也是一类一簇一群
也是一个类别的划分
但它和有监督学习的分类是不一样的
什么意思
我的聚类分析
事先它是不知道我应该分成几类的
它也没有类标签
所以它是一个无监督的学习
不像这个分类
你即便划成数据空间
然后这个数据点还是可以贴上标签的
或者训练集里面已经贴好标签了
像我们这个无监督学习的话
就是只能根据什么这个数据空间
这么一个数据点
在数据空间里面本身距离的远近
它所形成的自然的结构
也就说我们具体分析目的就是什么
捕获这个数据空间本身所呈现的结构
有哪些结构
我们看一下
典型的
比如说有明显分离的簇
有基于中心的簇
有基于邻近的簇
有基于密度的簇等等
当然不仅仅是这些
还有其它一些
这四种是比较典型的
明显分离的簇什么意思
比如说假如我们以这个二维数据空间为例的话
毫无疑问左边是一簇
右边是另外一簇
对吧
这个时候我们可以发现
同一簇里面任意两点之间的距离
都比这个簇一个点到另外一个簇之间的
任何一点
它的距离要近
这个时候说是明显分离的簇
这是第一种
第二种是基于中心的簇
这个簇毫无疑问和左侧这个簇是不一样的
什么意思
毫无疑问
这里面比如说这个这是一个点
这边是另外一个点
那这个它和这个圈毫无疑问它离的其实是
并不是说
这个差
和同一群里面任何一个差相比较
它的距离都会比这个差和这个圈近 那不可能
对吧
但是我们还是认为这两个簇是有意义的
为什么呢
比如这里面一个簇中心 这里面一个簇中心
对吧
然后我这个所有的这个同一个簇里面
到我这个簇中心最近
或者说这个差离这个簇中心比较近
所以我归为这一簇
这个圈离另外这个簇中心比较近
所以归为另外这一簇
这是所谓的基于中心的簇
好 我们再看下面这一种
基于邻近的簇
我们这边一个S
有一个C
还有一个哑铃
我们都认为它是三簇
我们认为它是三簇
为什么这样认为是有意义的
我们看得出来它是联通的
对吧
这是联通的
这也是联通的
这个也是联通的
什么意思
就我的同一簇里面
我总能找到一个最近邻
我在同一簇里面总能找个小伙伴作为最近邻
然后他和他最近邻之间的距离
比到任何其他簇之间的距离都要近(和最近邻在同一簇)
是吧
所以我们是所谓的什么基于邻接的一个簇
也是个联通的一个片
这也是有意义的
再看这一种
我们毫无疑问可以看得出来
这里面一个S
这里面一个O 对不对
毫无疑问
这个时候我们一看
S也好
O也好
它都相对比较密
也就是说它衬托在这个其他的点之间
比较疏散
比较稀疏的点
作为背景
然后我这个S和这个O都是相对比较密集的
也说基于这个密度的簇
这其实我们通过这个二维的一个数据空间里面
一些那个典型的例子
看了一下
所谓的发现我们数据空间里面有意义的簇
它其实有好多类型
当然要发现这些不同的簇的话
需要有不同的方法
对聚类分析而言
它至少有这么一些
比如说划分的方法
层次聚类方法
基于密度的方法
基于网格的 基于模型的等等
因为无监督学习
应该说是未来的一个大的一个趋势
是一个非常有潜力的一个领域
所以它肯定不仅仅限于这么几种
但这几种是相对比较典型的
在咱们这门课里面只能讲
基于划分的方法
基于层次的方法
这两种比较经典的方法
无论是哪种方法
包括这个基于密度的方法
它其实最终都得换成
换算成关于点和点之间的距离关系
或者类和类之间的距离关系
所以我们先在讲具体算法模型之前
我们先讨论一下这个距离的计算的问题
假如我现在拿到的属性特征
它都是数值型变量的话
我们可以采用这个闵可夫斯基距离
我们看一下它怎么计算的
这时候拿到两个向量
Xi和Xj
相当于第i行和第j行
当我们开始学这个数据分析之后
尤其是通过R语言的话
那我们就把它具体想定
具体化一下
特征(向量)其实就是什么 就是行
是不是
就是数据框里面第i行第j行
那好
它具体是怎么算这个距离
大家看k的话就相当于第k列
对吧
第一列之间的差别
P次方
第二列之间的差别
P次方
然后再括符加起来
加起来括符 再求P分之一次方
这个时候就是闵可夫斯基距离
就是不同的分量上的差别
然后再综合这么一个过程
这个闵可夫斯基距离其实是一组
它是一组距离
当我这个P取2的时候
毫无疑问是欧式距离
当我的P取1就是曼哈顿距离
或者街区距离
出租车距离是吧
这个数值型变量的这么一个情况
假如我们对于文本的数据的话
我们一般采用余弦相似性
余弦相似性
这个相似和这个距离是正好对应的
正好是一个相对的关系
相对的关系
我们看这个相似性怎么求
大家看一下
相似性的话
一看这个公式其实就很熟了
上面是什么
上面是个内积
下面是一个规范化的过程
一个标准化的过程
对吧
毫无疑问
当我把这个X第i行和第j行这个内积换一下
比如Xi换成Xi减它的平均值 Xi-mean(Xi)
Xj也减它的平均值的话 Xj-mean(Xj)
毫无疑问这变成什么了
这个时候就变成什么
变成了这个所谓的相关性 Pearson相关系数
同样它和什么协方差等等都结合起来了
毫无疑问这个余弦相似性和我们前面讲到了
这个相关性
这个内积
和这个协方差等等
都是相通的
具体来讲
在R里面要实现这个距离计算的话
前面这个闵可夫斯基距离等等
都可以通过dist()来计算
当然也有可能是一种混合型的
比如说我这个特征里面既有这个数值向量
也有这个有序因子
还有无序因子
这时候怎么办
这时候就需要采用这个混合类型的
这么一种计算方法在这个cluster这个包里面
我们说到这个是R里面
如何实现这个一些最基本的距离的计算
但是在计算这个距离的时候
我们需要注意一点
就是不同的特征它可能量纲不一样
我们需要去量纲
什么意思
我们举个例子
比如说这个丈母娘要选女婿
她既要考虑这个是不是高大英俊
比如考虑这个身高
同时要考虑他工作好不好
比如说看这个年收入
那这个时候 比如说
我这个身高作为一列
然后这个年收入作为另外一列的话
假如我这个年薪用比如说二十万 五十万
这个单位用万来表示的话是20 50
然后这个身高的话是比如一米七一米八
对吧
一点七一点八
那毫无疑问
谁发挥作用大
年薪发挥作用大
假如你把他年薪他单位不用万元用元的话
那毫无疑问这个身高几乎就不发挥作用
正是针对这种所谓的这个量纲的影响
要去除它的话
我们就必须做一个标准化
标准化有哪些方法
标准化的话
就消除不同单位或者量纲的影响
标准化有这么典型有这么三种方法
第一种是最大最小化
这么种方法
我们看一下它怎么求的
每一个值减最小值
然后再除以极差
毫无疑问
变换完之后
这个数据最小值 它相应的取值变成零
最大值相应的取值变成1
这么一个线性的一个映射的过程
就把它放到[0, 1]区间里面去了
这是一种用得比较多的一个方法
另外一种方法是z-score
就这个标准得分
毫无疑问
我们一看
假如我这原始数据是服从正态分布的话
这个数据减掉一个均值
再除一个标准差
就变成标准正态分布了
假如我们那个数据都是正数的话
可以怎么办
可以用这个数除以所有的Xi之和
毫无疑问
这个时候我把所有的这个标准化之后的
这个Xi'加起来
它应该结果应该就是1了
这是不同标准化的方法
有不同的特点
但是它们也有共同点是什么
我们可以用
古代的一个数学的一个术语来表达它
一个说法叫什么
乘以散之 约以聚之
然后齐同以通之
当然以前的齐同跟我们这里面讲的齐同
还有点区别
但我们借用它一下
就我除掉某一个数之后就怎么样
结果这个数据进行缩放了
减掉某个数的话表示
表示这个数据的平移
然后除以某个数表示数据的缩放
然后平移和缩放的目的去除这个所谓的
单位和量纲的影响
在R里面实现这些标准化的过程
其实可以用同一个函数是什么
是scale()这个函数
大家可以看一下这个scale()函数的帮助文档
看如何设置这个
平移以及这个缩放的具体的参数
当然我们可以补充一下
就是在后面一些算法建模的过程中
除了标准化之后还是做一个反变换的过程
先标准化
然后再变回原来的数据
其实变回原来的数据
我们并没有一个什么函数叫unscale()
但是其实这unscale可以通过
可以通过这个scale这个函数来实现的
这个反变换也可以通过这个函数来实现
咱们下去之后可以自己考虑一下
如何实现它
只是参数设置不一样而已
这也讲到了我们那个在不同的聚类方法里面
它数据距离的计算
以及在计算之前
一般要做标准化
在讲正式的这个聚类分析算法之前
我想再补充一下
就是我们所有的数据分析
我得先看看
他有没有这个做这个数据分析的必要和可能
也就是说对这个聚类分析来讲要做
先看看我这个数据是否适合聚类
比如说一个均匀分布的数据的话
毫无疑问它是没必要做聚类的
这里面没有任何的模式
你即便套用某个算法得到一个模式
那其实那个模式也是没有意义的
那这个时候我们可以算
我们可以来算一下这个霍普金斯统计量
我们在前面课程里面已经讲了
咱们就不再做过多的重复
其实就是什么
其实就是从数据空间里面选取N个点
以及我人为的生成N个点
分别计算最近邻的距离
分别作为Y和X
来看看它的取值 霍普金斯统计量
对我们这个成绩表这份数据来讲
我们重复执行一百次之后发现这个数据
它(霍普金斯统计量)的平均值是0.15左右
也就是它没有趋近于0.5
还不怎么均匀
也说这个数据相对还是比较倾斜的
做聚类是有可能的
好
分析完这个可行性之后
我们还得做什么
就像我们在前面讲分类的算法一样
所有的模型你必须经过评估
大家注意一下
就我们所谓的模型评估
不仅仅针对这个所谓的
准确率正确率这个预测问题而言
针对这个分类问题而言
其实对这个无监督学习
聚类一样
也是需要进行评估的
评估的目的是什么
因为我们前面讲了
所有模型算法都是错的
但有些模型是有用
所以我必须有一个评估的手段
来看看我的模型是否有用
就聚类而言
要做模型评估
其实可以有这么一个理念
就是强内聚松耦合
同一个簇之间它点相互之间
应该离得比较近一点
然后不同簇之间相对比较远一点
基于这么一个思想
我们可以通过什么
通过计算这个轮廓系数
来评估我们这个聚类的效果
它具体来讲是这么一个步骤
我们计算轮廓系数的时候是针对每一个数据点
也就是每一行记录
因为我们刚才说到聚类分析的时候
我们把它想象成一个数据空间
然后每一个行一个数据点
从这个数据点的角度来考虑这个问题
就对于每一个数据点
我都要计算一个轮廓系数
怎么计算第一步
我对某一个数据点
比如说第i个对象
第i个数据点我计算
它到它所属簇的
其他所有数据点之间的平均距离
记为ai
假如说我们这个整个这个数据空间
现在目前被分成了K簇
经过某个聚类算法之后分成了K簇
那毫无疑问
除了它自身所在这一簇之外
还有K-1个簇
是不是
那这个时候我要计算什么
第i个对象到另外K-1个簇里面
每一个对象每个数据点之间的距离
然后计算一下
每个簇到每个簇的所有数据对象
它的平均距离
这是毫无疑问
有多少个有K-1个这个平均值
然后我们将
那个K-1个平均值里面最小的一个
记为bi
记为bi
那所谓的第i个数据点
也就第i行记录 它的轮廓系数多少
是bi减掉ai 然后后面再有一个标准化的过程
再有一个标准化的过程
也就是说我们希望什么
希望这个ai尽量小 bi尽量大
强内聚松耦合吗
或者说
同一个簇里面要凝聚
不同的簇相互之间要分离
是不是
所以我们希望这个轮廓系数尽量大一点
尽量大一点
这是对于每一个数据点来讲
我都可以计算一个轮廓系数
然后对整个这个模型算法来讲
它综合性能怎么评价呢
我就是计算所有对象的轮廓系数的平均值
同样我们是希望
我们希望这个平均值是尽量大一点
具体计算这个轮廓系数的话
在这个cluster包里面有相应的函数
直接可以计算
毫无疑问
假如我要调这个函数进行轮廓系数计算的话
至少我得有两个参数
首先是知道不同对象之间相互之间的距离
或者有一个距离矩阵
同时我都知道每一个数据点它属于哪一类
只要有了这两方面的信息之后
其实就可以计算什么
每一个点的轮廓系数
同时也可以计算什么
整个一个综合的轮廓系数
一个平均值
当然这是个轮廓系数
是聚类分析里面
用得比较多的一种评估的一个指标
在我们R里面其它包里面
比如fpc
或者NbClust
在这些包里面有很多其他一些
计算我们相应的聚类效果的一些指标
尤其是这个NbClust
这个就是强烈推荐的
它里面有30多个指标
来计算我们聚类的效果
以上我们就对聚类分析的一个
最基本的概念
以及一些那个评估的方法
进行了简要的一个介绍
具体的模型算法
我们在后续课程再展开讲
本次课到此结束
谢谢大家
-第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章 作业