当前课程知识点:R语言数据分析 > 下部:博术 > 第10章 观数以形 > 10.4 高维数据空间
大家好
欢迎来到《R语言数据分析》课程
今天和大家交流一下
如何刻画高维数据空间的形态
其实我们身体所能感知到的
应该都只是一个三维的世界
虽然我们也有说法是
宇宙是11维的
应该说正常人
脑子里所能想象的
应该还是一个三维的空间
所以我们在说到
高维数据空间形态的时候
也并不是说我们要突破三维
然后去构想一个更高维的空间
而是通过一些具体的方式方法
将它直观的表达出来
然后来帮助我们
更加直观的认识
这些不同维度相互之间的关系
具体高维数据空间的一个展示方式
有很多种
我们这个课讲三种
第一种是三维散点图
第二种是脸谱图
第三种是我们的平行坐标图
平行坐标图
好咱们先看第一种
三维散点图
三维散点图它的大概结构
是我们右侧这个图
这个时候我们可以看得出来
至少这里面可以有三个维度可以被映射
X轴 Y轴 Z轴
我们可以分别映射成三个变量
将这三个变量的取值
映射成这三个维度
这三个维度映射完之后
那相应的每一个数据点
在这个数据空间的位置就确定了
除了这个数据点确定之外
其实我们还可以怎么样
进一步的将这个每个点
它的颜色 形状 大小
进一步进行映射
所以我们说
虽然它只是一个三维的一个图形
但其实它所表达的信息
可以突破三维
可以是四维甚至是五维
或者是更高维的
咱们看一下
咱们看一下它在R里是怎么实现的
在R里边实现这个三维散点图的话有很多包
咱们这边用到的是rgl这个包
我们主要是想
通过一个动态的可交互的方式
来展示这个三维散点图
这个时候
调用这个包里的plot3d
毫无疑问它是一个三维的图形
一个绘制的方法
我们可以将sx映射成X
将wl映射成Y
将sw映射成Z轴
这三列进行映射同时
我们还将颜色
将这个颜色映射成文理分科
就是文理分科不一样的话
那好我映射成这个点不同的颜色
通过这个三维的这么一个散点图
我来找一下看看
文理分科
是否和我什么
和我这个数学 物理 生物
是不是有关系
映射完之后
我们可以看到是这么一个图形
当然这个图我是做了一个动画
其实我们要是通过这个R代码实现的话
这个图是可以怎么样
你通过这个鼠标的拖拽
可以不同的角度来旋转
通过不同角度来透视它
它一个分布的情况
通过现在这个动画其实也可以看的出来
红色的
这个部分是什么
是我们相应的理科对不对
那理科相应的
比较集中在哪
在我们这个右上角这个部分
在这个顶角部分
也就是说
理科生的什么
数学 物理 生物成绩
相对文科生来讲
是更加密集的分布在
比较高的分数线这一段的
这就是我们通过三维散点图
来直观展示
我们的这四个维度信息
相互之间的关系
这是三维散点图在R里面的一个实现
相对比较简单比较直接
咱们再看第二种
脸谱图
脸谱图是什么呢
就是在对我们观测对象
进行一个画像
也就是什么呢
我现在有不同的行
也有不同的列
对不对
一个行的话就相当于一个观测对象
比如说我们先拿到数据
一行数据就是一个同学的各科的成绩
然后每一列就相应的是它的特征
有比如说物理化学
比如说我们这边有物理
有化学
有生物的成绩
我们将这三列三个特征的拿过来
我们来表征一下
对脸谱图来讲我们可以调用这个包
这个aplpack这个包
调用这个包里的faces
这个函数
来进行绘制
它绘制的什么呢
我们观测的对象我先选出来
先选出某一些行出来
总共选了8行
也就是8个同学我来绘制一下
根据什么来绘制
根据他的物理wl 化学hx 生物sw成绩
这三门课的成绩
好我们来看看
它有什么特点
这个时候
我就将相应的cjb
相应的这些行这些列我都选出来
这个子集交给faces就可以了
当然后面也有相应的一些参数
包括比如说脸谱的类型
咱们看看具体这个函数它得到的结果是什么
我们刚刚讲了
其实脸谱图就是将什么
观测对象的不同取值不同特征
映射成我们相应的脸部的特征
这其实是非常形象的
我们说认识数据
就是看一看数据的长相
除了通过前面的那种
类似于比如说概率密度图
看它的高矮胖瘦对不对
这个脸谱图也更加直观更加形象一点
我直接看看这个数据长什么样子
我们看一下左侧的
它一个映射的过程
比如说这个物理
映射成什么呢
映射成我这个脸部的高度
化学呢 映射成这个脸部的宽度
哪怕是这两个特征我们也看的出来
这8个同学
它其实差别是挺大的
就在物理 化学 生物这三个科目上面
对三个科目的表现差别是比较大的
好我们看一下上面这四个同学毫无疑问
有点像什么有点像男生是不是
这个脸都比较大
相对比较宽是不是
那下面这个的话也相对
这四个同学也相对秀气一点
恰恰我们上面这四个同学
当然也是我是有意选择的
他恰恰就是什么就是理科生
下面这四个呢恰恰就是文科生
这其实也就是什么一个观测对象
他的特征方面的画像
通过这个脸谱图
来怎么表征
看看这个数据长什么样子
当然我们看这个脸谱图的话
其实发现它有个局限是什么呢
这些脸不能太多了
假如我这个屏幕上有5000张脸
或者甚至更多5万张脸的话
那肯定看不过来
看不出任何特征任何模式出来
也看不出差别出来
所以一般来讲
这个脸谱图
维度的话可能多达多少
可能甚至可以达到几维或者十几维
但是这个数据的观测点的个数
不能太多
它是有一定的限制的
这时候我们就可以引入第三种图形
平行坐标图
平行坐标图来解决这个问题
在我们看那个平行坐标图之前
我们先看看R里面怎么实现的
要绘制平行坐标图的话
比如说我现在想知道
整个我们这文理分科
和我们前面的九门课
究竟有没有什么关系
就这九门课
哪些课对文理分科是有区分度的
这时候我可以绘制一个平行坐标图
来表达这个相应的关系
在绘图之前我先怎么样呢
我先将数据进行一个处理
去进行一个处理
也就是什么
我基于这个成绩表这个数据
我先选出来文科的所有的同学记录
然后呢
根据总成绩进行排序
选出其中的4到13列
这是什么呢
我们这个数据
从第四列开始就是语文成绩了
一直数学 外语 等等等等
12列一直到12列是什么
是生物成绩
这是九门课的成绩
然后第13列就是文理分科了
是将文理分科以及前九门课的成绩
总共10列取出来
将语文一直到生物这九门课
这个成绩进行什么进行一个抖动
因为后面我们在绘制平行坐标的时候
好多同学的成绩比如都是82分的
有好几个同学都取82分
这个时候怎么样 他可能叠在一起了
变成一个点
这时我们抖动一下 让它们不要重叠
好 做完这些操作之后
我选出其中的前50个
也就是文科排前50的
总成绩排前50的同学
同样我也可以怎么样
也可以按照同样的方法
选出理科生排前50的同学
这时候套代码几乎一样
只是这里面的什么文科变成了理科
文科变成理科
一旦我们将文理分科
文科和理科的前50名都取出来之后
我们该怎么样呢将它rbind
也是我们前面讲到的
将这两个数据框怎么样
叠罗汉一样叠起来
变成一个包含一百条记录的什么
同学的成绩
总共也是包含10列
一百行十列的那个数据框
这个数据预处理完之后怎么样呢
我调用这个ggpar一看是什么[gg = ggplot]
就是平行的意思 [par = parallel]
coord一看就是什么 [coord = coordinates]
就是我们的坐标的意思
这也就是说
基于这个ggparcoord的一个绘图系统
一个平行坐标
在这个包里面
将这个数据交给它之后
我的坐标是谁呢
坐标是1到9
然后我的分组变量是谁呢
就是第10列
前9列是我的成绩
第10列是我的什么
文理分科
我们看一下具体结果是什么样的
我们所谓的平行坐标图
就是绘制完之后有这么一个图形
不要望文生义
我们一旦说到高维数据空间
然后又说到平行
说什么平行宇宙等等
没有任何关系
所谓平行坐标图
它其实很简单
很容易理解
这边每一条线是什么呢
就是一条记录
就是我们刚才不说
是100×10的一个数据框吗
那100行的话在这里面有多少条线
有100条线
然后1列的话代表什么呢
每1列的话就是什么啊
就是一个坐标
大家看这是不是每个坐标都是平行的
才称之为平行坐标
每一个每一行记录的话其实是什么
就是这么一条线
在不同的属性上不同的特征上
不同的坐标上它取值不一样
我们从而看出来
它的数据究竟是如何分布的
我们刚才看了设了一个什么
除了这九门课成绩作为这个坐标之外
我们设一个什么
设一个分组变量
将文理分科作为一个分组变量
那这时候可以看得出来
其实像这个化学
这些科目就相对比较有区分度了
这个红线和这个蓝线是区分比较开的
像前面的语文外语这个相对来说
它区分度就差一点
这也是通过平行坐标图
我们来看
我们整个这个数据的分布情况
这也是我们高维数据空间
一个比较有效的一个可视化手段
在讲完了我们这个三维散点图
脸谱图以及平行坐标图之外
我们对数据空间的话
在直观上展示已经有一些手段了
然后呢我们就想介绍
想引入几项具体指标
来表征我们数据空间的形态
当然这个形态既可以表征
我们高维空间的
也可以表征这个一维和二维的
咱们看一下
首先引入第一个指标是什么呢
密度
我们说密度的话
我们就想到什么呢
想到以前物理里面学到什么
所谓密度就是什么
就是物质每单位体积内的质量
它的公式是什么呢
就是m除以v
但是
密度虽然说作为数据空间的形态之一
毫无疑问我们数据是没有质量的
所以我们在数据科学里面
所提到的密度都是指什么呢
它都是指密集程度而已
是密集程度而已
而不是说我这个什么质量除以这个体积
不是这个概念
包括我们以前学过的
比如说概率密度也好
包括后面可能会接触到的
基于密度的聚类等等
这里面密度都是指什么
都是指数据点的一个密集程度而已
当然这里面有很多计算方法
我们一个比较简单
计算方法是什么
就单位面积和单位体积内数据点的个数
这也是用来表达一个密集程度的一个指标
我们接下来看看
如何在R里面通过这么一个简单计算方法
来表征我们数据空间的一个密集程度的情况
或者是这个密度的一个情况
首先
我们针对这个物理和数学
所张成的二维数据空间
以这个为对象
我们要表征它密集程度的话
我们要对每一个格子进行计算
因为它是一个二维的数据空间的话
那我将这个二维数据空间
像棋盘一样分成不同的格子
然后看看落入每一个棋盘格子里面
它的点有多少个
这个时候我首先怎么样
我先定义一下一个breaks
就是所谓不同端点怎么来切分
怎么将这个数据分箱切成不同的格子
好 也是同样
针对这个成绩表这个数据
我选择了select
wl sx这两列
然后怎么样呢
对数据进行一个处理
就针对这个wl和sx
我怎么样
我cut一下
这两列我都cut一下
将它在这个
0 50
再之后这个seq就是50到100
我把它切分成了多少
切分成了11段
切完之后
这个时候就相当于做了什么
wl和sx分别做了离散化了
就分成了格子了
再之后怎么样
我对wl和sx切分完之后
我进行分组统计
然后怎么样
summarise
统计它里面落入点的个数
好 我们看看具体结果是什么
我们对wl和sx怎么样
都进行了切分
都进行离散化
然后当我summarise的时候怎么样
我得到的是落入
就是说原始记录的个数
其实也是落入点落在这个区间的点的个数
那好
这个时候我其实我有什么不同的组合
就是物理在0到50
数学也在0到50里面
这里面有多个点
有多少个同学呢 有一个同学
当然这种组合也有可能是缺失的
在原始记录里面
可能比如说物理是0到50
但是数学处以50到55这个区间
没有任何一个同学是这么一种情况
那这个时候我需要怎么样
加一个complete
这么一个函数来补齐它
确保每一种组合都是存在的
我们一旦得到这个处理好的数据之后
我们可以怎么样
可以将它映射成我们二维数据空间里面
一个密度的一个ggplot2的图
通过图形的方式
来直观展示这个密集程度的分布
具体要展示的话
我们是调用这个ggplot这个函数
就是我们刚才得到这个结果
将X映射成wl
Y映射成sx
它的填充映射成什么 freq
就是刚才我们统计的
落入每一个格子的它的点的个数
具体的映射的图形什么geom_tile
还是我们前面用到的
在相关系数图里面
也用到这个类似这个函数
咱们来看一下具体的得到结果
左侧的话是我们原始的散点图
就是这个sx-wl的一个原始散点图
右侧的话就是什么
就是我们相应的一个密度图了
一个密度分布图
毫无疑问
咱们这700多个同学里面
绝大部分分布在哪
它的物理和数学成绩都是相对偏高的
并且怎么样
尤其是数学成绩更加高一点
这时候我们可以看得出来
整个在我们这个数据空间里面
哪些区域
它分布的同学是相对比较密集的
哪些区域也是相对什么稀疏一点
这就是我们数据空间形态的
其中一个指标叫密度
除了这个表征密度之外呢
我们在后续做建模的时候
其实还需要考虑什么
这个数据空间的均匀程度
比如说我们做聚类分析的话
我们是想找这个数据空间自然的结构
不同的点 有些点是形成一个点群
一簇一簇的
同一簇的点
它相互之间离得近一点
不同的簇的点
它相互之间什么
离得远一点
那这个时候其实就相当于什么
空间里面自然存在的一个距离结构
假如我们这个空间本身是比较均匀的话
那毫无疑问我们做这种聚类是没有意义的
好的 接下来我们看一看
如何表征数据空间的均匀形态
便于我们展示
我们以这个二维的数据空间为例
目前我们看到的
这是一个二维数据空间里面
有若干个数据点
也就是我们观察到数据记录
毫无疑问
假如我们的数据记录
在二维数据空间里面呈现这么一个分布的话
它是相对比较均匀的
也就是说在这么一个数据空间里面
我们所看到的这个点
它没有呈现一个自然的结构
我们看不到这里面有集中的趋势
也没有所谓一些分离的模式
假如对于这么一份数据的话
无论我们是做这个有监督的学习
还是进行无监督的聚类 进行分析
其实都没什么意义
那如何来表征我们一个数据
是否是趋近于这么一种均匀的形态
还是说它本身是有结构的有规律的
我们可以引入一个新的变量
一个新的指标叫什么呢
叫霍普金斯Hopkins统计量
霍普金斯Hopkins统计量
它是告诉我们
我们所拿到的数据
在多大程度上
接近于这个均匀的一个散布的形态
我们注意这个话
是多大程度上接近于这个均匀散布的形态
毫无疑问
其实它是什么
是和这个均匀散布进行一个比较
进行一个比较
这是我们直观上的一个认识
咱们看看具体是如何来实现的
它分那么三个步骤
首先是均匀的从D所在的
这个空间里面抽取N个点
p1 p2 ... pn
也就是说我们拿到了一个给定的数据集
然后这个数据集
比如不同的维度
它张成一个相应的数据空间
那我现在从这个数据空间里面
随机的人为的抽取N个点
这N个点并不是在我这个D的这个数据集里面
而是什么呢
而是我所在的数据空间里面
我人为生成的
所服从的一个相对比较均匀的一个分布的
对这里面每一个点
我都怎么样呢
在这个D里面找一个最近邻
对这里面每个点Pi
我都在D里面找一个最近邻
找到之后怎么办
我计算一下
这个点和最近邻之间的距离
我设它为什么设为Xi
好这是第一步
第二步呢
我从这个D本身就这个数据集本身里面
抽取N个点
比如q1 q2 … qn
这相当于什么呢
相当于我们这个数据集里面抽取的N行
那好 对于每一个点q
每个点qi 我都怎么样
我都在这个数据集里面
找一个最近邻
这个最近邻毫无疑问
只要不是qi本身就可以
假如你qi本身的话毫无疑问
那距离为0了
就除它之外的
D-{qi}
对这个qi来讲
只要不是它自己
那好我找一个最近邻
我同样也是什么
也是计算出来它们之间的距离
也计算这个距离 设为yi
这是第二步
第三步
我们就可以计算这个霍普金斯统计量了
怎么算的呢
大家看一下
分子其实就是什么
所有的yi相加
分母Xi的和加上Yi的和
所以这就是
我们一个霍普金斯统计量
一个最基本的计算过程
相对是比较简单的
那这里面其实我们可以看
回到原来这个
给我们一个直觉是什么呢
直观的理解
是多大程度上也接近于这个均匀散布的形态
毫无疑问
假如我是均匀散布的话
那我这里面两个指标
X和Y它相对应该是比较接近的
也就是说这个值应该是接近于0.5
假如我这个数据本身不是均匀分布的
它有自己的规律有自己的模式
有集中的趋势
这个时候yi呢相对来说
它就趋近于什么
相对比较小
那这个相应的霍普金斯统计量
就会接近于0左右
也就说通过这个霍普金斯统计量
我们也看得出来
它究竟看它的取值
可以看得出来
究竟有多大程度上
接近我们均匀的分布这么一种形态
这样说可能相对比较抽象
咱们看一个具体的例子
比如说我们现在
还是那个二维的数据空间
我们已经拿到了相应的数据
这个是我们拿到数据这个D
它在我们这个数据空间的一个散布的形态
毫无疑问这是有模式的
那这个霍普金斯统计量怎么算呢
我先在这个数据空间里面
随机的生成人工的生成数据
就生成人工数据
比如说我生成四个点
这是相对均匀分布的
对于每个点怎么样
我都找到D里面的最近邻
并且计算这个距离
X1 X2 X3 X4
然后我在这个D本身
这个方框是我们什么
是我们自己关注的数据数据集D
我在这个数据集里面我在找什么
我再找这个四个点
再找四个点
也找什么
也找它相应的最近邻
计算它的距离
Y1 Y2 Y3 Y4
那我们所谓的霍普金是统计量怎么算
所有的Y相加
再除以什么X相加
以及Y相加它们的和
这就是霍普金斯统计量一个计算方法
毫无疑问
我们这个时候一看
因为我们这个数据有这个集中的趋势的话
那这个时候Y相对来说比较偏小的
那这个X呢相对偏大
所以这个值应该会趋近于什么
接近于0左右
往0那个方向靠
所以它也能在一定程度上表明什么
我们这个数据它是有模式
有规律可循的
在具体实践过程中
假如我们在要计算这个
霍普金斯统计量的时候
我们得选择N个点对不对
把它先生成N个人工数据点
然后在我们自己实际数据集里面也选取N个点
这个N怎么取
一般来讲
这个N要比我们实际的数据记录的
记录数要小得多
一种推荐的做法是什么
就N等于0.05乘以这个数据记录数
比如说我们目前拿到数据是700多条
那这时候可能就取30几条数据就足够
也当然也可以说是比如说取0.1左右
就是其它1/10左右的数
比如说700多条数据里面
取70条左右也可以
这里面没有一个说理论上
一个非常非常严格的一个说法
只是有大概符合这么一条规则就可以
咱们看一看在R里面 如何实现
如何计算这个霍普金斯统计量
这个时候我们需要
引入一个新的包叫clustertend
豪无疑问这是什么呢
这聚类的tendency
clustertend = Clustering Tendency
就是我这个它聚类的一个趋势
聚类的趋势
这行代码毫无疑问也是什么
也是为了我们后面的可复现性
加了一个随机数种子
接下来比如说我对这个成绩表
我选择其中的所有九门课
就是yw sx一直到sw这九门课
把这九列选出来
我们放到一个新的变量里面
叫scores
然后我们看一看目前我们的记录是有多少
比如说先把这个行数取出来
乘以 0.05
这个时候就是我想得到的
想要取的N这个点
因为我要从这个数据里面
选择N个点
同时要在这个数据空间里面生成N个点
那这个N的取值我们目前为取为0.05
然后floor毫无疑问是什么
向下取整
地板的意思向下取整
这个时候我们可以算
通过这个clustertend
这个包里面的霍普金斯
这么一个函数进行计算
计算
将这个数据交给它就可以了
相应的N设定好
有这个数据有这个N
这个霍普金斯统计量基本就算出来了
就可以算出来
但是因为每一次随机生成的时候
它可能取的点都不一样
随机生成的那个人工的点数据点也不一样
我们一般是推荐
多做几次
然后再看看它的大致水平怎么样
取个平均值
当然我们也可以从统计上
来做一个假设检验也可以
比如说我那个原假设
就是它等于0.5左右
我看看我的数据实际情况
是不是可以拒绝这个原假设
在R里面要执行多次某个操作的话
可以用这个replicate
这个函数
可以执行这个replicate这个函数
执行100次
然后执行100次这个后面这个函数
执行这个操作
那相应的我们就生成多少
生成了100个霍普金斯统计量
当然我们后面为了便于计算
我们它返回的结果是一个什么
是一个列表
那我unlist
将这个列表的所有数据拉平了
变成一个长度为100的一个数值向量
我们求一下平均值
应该是0.15左右 0.157
也就是说这个数据还是相对比较什么
相对比较有规律可行的
是比较倾斜的
并没有接近于0.5左右
当然对这100个数据
我们也可以看一看这个箱线图
看一下这个趋势的分布
看看这个趋势的分布
这就是我们在R里面通过这个
clustertend这么一个包
来计算这个霍普金斯统计量
来看到我们数据分布的一个形态
以上我们将通过一些
可视化的方法来观察我们的数据的分布
同时也介绍了一些具体指标
不管分散程度也好
离散程度也好
包括我们最近讲的这些
比如说这个密度的形态
这个均匀程度的形态
等等
其实所有这些认识数据的手段
都是为了什么呢
都是为了让我们和这个数据更加熟悉
对这个数据更加亲切
你真正要发现数据背后的规律的话
其实我们就需要什么
先认识这个数据
先拉近这个数据的距离
熟悉这个数据之后
我们后面才采用相应的模型
相应的算法挖掘数据背后的规律
这其实也是我们认识数据主要目的所在
本次课到此结束
谢谢大家
-第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章 作业