Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

可视化多元数据

此示例说明如何使用各种统计图可视化多元数据。许多统计分析只涉及两个变量:预测变量和响应变量。利用二维散点图、二元直方图、箱线图等可以轻松地可视化这些数据。还可以利用三维散点图或带有第三个变量(比如采用颜色编码)的二维散点图来可视化三元数据。但是,许多数据集涉及大量变量,使直接可视化变得更加困难。此示例将探讨在 MATLAB® 中使用 Statistics and Machine Learning Toolbox™ 可视化高维数据的一些方法。

在此示例中,我们将使用 carbig 数据集,该数据集包含 20 世纪 70 和 80 年代约 400 辆汽车的各种测量变量。我们将使用燃油效率(每加仑汽油可行驶的英里数,以 MPG 为单位)、加速度(从 0MPH 到 60MPH 需要的时间,以秒为单位)、发动机排量(以立方英寸为单位)、重量和马力等值来说明多元可视化。我们将按照气缸数量对观测值进行分组。

load carbig
X = [MPG,Acceleration,Displacement,Weight,Horsepower];
varNames = {'MPG'; 'Acceleration'; 'Displacement'; 'Weight'; 'Horsepower'};

散点图矩阵

通过低维子空间查看切片是从一定程度上解决二维或三维限制的一种方法。例如,我们可以使用 gplotmatrix 函数显示一个阵列,其中包含五个变量两两之间的二元散点图,以及表示每个变量自身的一元直方图。

figure
gplotmatrix(X,[],Cylinders,['c' 'b' 'm' 'g' 'r'],[],[],false);
text([.08 .24 .43 .66 .83], repmat(-.1,1,5), varNames, 'FontSize',8);
text(repmat(-.12,1,5), [.86 .62 .41 .25 .02], varNames, 'FontSize',8, 'Rotation',90);

每个散点图中用不同颜色表示不同的气缸数量:蓝色表示 4 缸、绿色表示 6 缸、红色表示 8 缸。还有少数 5 缸汽车,以及视为 3 缸的转子发动机汽车。从这组图中可以轻松找出变量对之间的关系模式。但是,可能有一些重要的高维模式在此图中不容易看出。

平行坐标图

散点图矩阵仅显示二元关系。但是,也可以通过其他替代方法将所有变量显示在一起,便于您研究变量之间的高维关系。最简单的多元图就是平行坐标图。在此图中,坐标轴全部水平排列,而不是像通常的笛卡尔图那样使用正交坐标轴。每个观测项在图中表示为一条由几个线段连接起来的连接线。例如,我们可以绘制所有 4 缸、6 缸或 8 缸汽车的图,然后按组对观测项着色。

Cyl468 = ismember(Cylinders,[4 6 8]);
parallelcoords(X(Cyl468,:), 'group',Cylinders(Cyl468), ...
               'standardize','on', 'labels',varNames)

在此图中,水平方向表示坐标轴,垂直方向表示数据。每个观测项由五个变量的测量值组成,每个测量值由对应的线条在每个坐标轴上的高度表示。由于五个变量的范围相差很大,所以此图使用标准化值进行绘制,每个变量都标准化为具有零均值和零单位方差。通过着色,可以从图中看到 8 缸汽车通常具有较低的 MPG 和加速度值,以及较高的排量、重量和马力值。

即使按组着色,在查看包含大量观测值的平行坐标图时,依然不够清晰直观。我们还可以绘制只显示每个组的中位数和四分位数(25% 个点和 75% 个点)的平行坐标图。这样可使组之间的典型差异和相似性更容易区分。另一方面,最有趣的可能是每个组的离群值,而此图中根本未显示。

parallelcoords(X(Cyl468,:), 'group',Cylinders(Cyl468), ...
               'standardize','on', 'labels',varNames, 'quantile',.25)

安德鲁斯图

另一种类似的多元可视化是安德鲁斯图。此图将每个观测值表示为区间 [0,1] 内的平滑函数。

andrewsplot(X(Cyl468,:), 'group',Cylinders(Cyl468), 'standardize','on')

每个函数均为一个傅里叶级数,系数等于对应的观测值。在此示例中,级数有五个项:一个常项、两个正弦项(周期为 1 和 1/2)和两个与之相似的余弦项。在安德鲁斯图中,前三个项对函数形状的影响是最明显的,因此前三个变量的模式往往是最容易识别的。

当 t = 0 时,各组之间存在明显差异,这表明第一个变量 MPG 是 4 缸、6 缸和 8 缸汽车之间的区别特征之一。更有趣的是大约在 t = 1/3 时三个组之间的差异。将此值插入到安德鲁斯图函数公式中,我们得到一组系数,这些系数定义区分各组的变量的线性组合。

t1 = 1/3;
[1/sqrt(2) sin(2*pi*t1) cos(2*pi*t1) sin(4*pi*t1) cos(4*pi*t1)]
ans =

    0.7071    0.8660   -0.5000   -0.8660   -0.5000

从这些系数中我们可以看出,区分 4 缸汽车与 8 缸汽车的一个方法是前者具有较高的 MPG 和加速度值,以及较低的排量、马力,特别是重量值,而后者正好相反。这与我们从平行坐标图中得出的结论相同。

图形符号图

可视化多元数据的另一种方法是使用“图形符号”来表示维度。函数 glyphplot 支持两种图形符号:星座图和切尔诺夫脸谱图。例如,下面是汽车数据中前 9 个型号的星座图。星座的每一条边代表一个变量,边长与代表观测值的变量值成正比。

h = glyphplot(X(1:9,:), 'glyph','star', 'varLabels',varNames, 'obslabels',Model(1:9,:));
set(h(:,3),'FontSize',8);

在实时 MATLAB 图窗窗口中,此图允许使用数据游标交互式探查数据值。例如,点击代表 Ford Torino 的星座中右侧的点,将显示其 MPG 值为 17。

图形符号图和多维尺度分析

在网格上无序绘制星座所得的图可能令人困惑,因为相邻的星座可能看起来完全不同。因此,您可能难以从图中看出明显的模式。将多维尺度分析 (MDS) 与图形符号图结合起来通常很有用。举例说明,我们首先选择 1977 年的所有汽车,然后使用 zscore 函数将五个变量都标准化为具有零均值和零单位方差。然后我们计算这些标准化观测值中的欧几里德距离作为相异度的测度。此选择在实际应用中可能过于简单化,但此处只是为了方便说明。

models77 = find((Model_Year==77));
dissimilarity = pdist(zscore(X(models77,:)));

最后,我们使用 mdscale 创建一组二维位置(点间距近似于原始高维数据之间的相异度),并使用这些位置绘制图形符号图。此二维图中的距离或许只能粗略地重现数据,但对于这类图而言已经够用。

Y = mdscale(dissimilarity,2);
glyphplot(X(models77,:), 'glyph','star', 'centers',Y, ...
          'varLabels',varNames, 'obslabels',Model(models77,:), 'radius',.5);
title('1977 Model Year');

在此图中,我们使用了 MDS 作为降维方法来创建二维图。这通常可能导致信息丢失,但通过绘制图形符号图,我们已经融入了数据中的所有高维信息。使用 MDS 是为了使数据的变化呈现某种规律性,从而更容易看到图形符号中的模式。

与前面的图一样,此图也可以在实时图窗窗口中进行交互式探查。

另一种图形符号是切尔诺夫脸谱图。此图形符号将每个观测值的数据值编码为面部特征,例如面孔的大小、面孔的形状、眼睛的位置等。

glyphplot(X(models77,:), 'glyph','face', 'centers',Y, ...
          'varLabels',varNames, 'obslabels',Model(models77,:));
title('1977 Model Year');

此处,面孔大小和前额/下巴相对大小这两个最为明显的特征对应 MPG 和加速度,前额形状和下巴形状则分别对应排量和重量。两眼间距对应马力。值得注意的是,前额宽下巴窄的面孔很少,前额窄下巴宽的面孔也很少,这表明排量和重量这两个变量正线性相关。这也是我们在散点图矩阵中所看到的。

何种关系最为明显取决于特征与变量的对应关系,而在 glyphplot 中,您可以很方便地更改所选的对应关系。

close