如何可视化数据的真实维度?

机器算法验证 数据可视化 主成分分析 降维
2022-03-17 18:25:45

我有一个标称 16 维的数据集。我在一个案例中大约有 100 个样本,在另一个案例中大约有 20,000 个样本。根据我使用 PCA 和热图进行的各种探索性分析,我确信真正的维度(即捕获大部分“信号”所需的维度数)约为 4。我想创建一张幻灯片演示文稿的效果。我想要反驳的关于这些数据的“传统智慧”是真正的维度是一维或二维。

什么是显示数据集真实维度的良好、简单的可视化?最好是那些有统计学背景但不是“真正的”统计学家的人可以理解。

3个回答

一个标准的方法是做 PCA,然后显示一个碎石图,你应该能够从你可能选择的任何软件中得到它。稍加修改,如有必要,您可以使其对您的特定受众更具解释性。有时它们可​​以令人信服,但通常它们是模棱两可的,并且总是有空间来争论如何阅读它们,因此碎石情节可能(编辑:不是!)是理想的。不过值得一看。

一种可视化的方法如下:

  1. 对数据执行 PCA。
  2. 为前两个主成分向量所跨越的向量空间,令为补码。VV
  3. 将数据集中的分解中一个元素的总和加上一个余项(在中)。将其写为(这应该很容易使用 PCA 的结果。)xiVVxi=vi+ci
  4. 的散点图 .||ci||||vi||

如果数据确实是维的,则绘图应该看起来像一条平线。2

在 Matlab 中(躲避所有被抛出的鞋子):

lat_d = 2;   %the latent dimension of the generating process
vis_d = 16;  %manifest dimension
n = 10000;   %number of samples
x = randn(n,lat_d) * randn(lat_d,vis_d) + 0.1 * randn(n,vis_d); %add some noise
xmu = mean(x,1);
xc = bsxfun(@minus,x,xmu);    %Matlab syntax for element recycling: ugly, weird.
[U,S,V] = svd(xc);  %this will be slow;
prev = U(:,1:2) * S(1:2,1:2);
prec = U(:,3:end) * S(3:end,3:end);
normv = sqrt(sum(prev .^2,2));
normc = sqrt(sum(prec .^2,2));
scatter(normv,normc);
axis equal;  %to illlustrate the differences in scaling, make axis 'square'

这将生成以下散点图:

代码制作的散点图

如果更改lat_d为 4,则线条不那么平坦。

我在 SAS 中使用 PROC Varclus 做了类似的事情。基本思想是生成一个 4 集群解决方案,选择每个集群的最高相关变量,然后证明这个 4 集群解决方案比两个集群解决方案解释了更多的变化。对于 2 集群解决方案,您可以使用 Varclus 或前 2 个主组件,但我喜欢 Varclus,因为一切都是通过变量而不是组件来解释的。R中有一个varclus,但我不确定它是否做同样的事情。

——拉尔夫·温特斯