Matlab - 多维数据的PCA分析与重构

2024-04-04

我有一个大型多维数据集(132 维)。

我是数据挖掘的初学者,我想使用 Matlab 来应用主成分分析。不过,我看到网上有很多功能解释,但我不明白它们应该如何应用。

基本上,我想应用 PCA 并从我的数据中获取特征向量及其相应的特征值。

在此步骤之后,我希望能够根据所获得的特征向量的选择来重建我的数据。

我可以手动执行此操作,但我想知道是否有任何预定义函数可以执行此操作,因为它们应该已经经过优化。

我的初始数据是这样的:size(x) = [33800 132]。所以基本上我有132特点(尺寸)和33800数据点。我想对这个数据集进行PCA。

任何帮助或提示都可以。


这是一个快速演练。首先,我们创建一个隐藏变量(或“因素”)的矩阵。它有 100 个观测值,有两个独立因素。

>> factors = randn(100, 2);

现在创建一个载荷矩阵。这会将隐藏变量映射到您观察到的变量上。假设您观察到的变量有四个特征。那么你的载荷矩阵需要是4 x 2

>> loadings = [
      1   0
      0   1
      1   1
      1  -1   ];

这告诉您第一个因子上的第一个观察到的变量负载,第二个因子上的第二个变量负载,因子之和上的第三个变量负载以及因子之差上的第四个变量负载。

现在创建您的观察结果:

>> observations = factors * loadings' + 0.1 * randn(100,4);

我添加了少量随机噪声来模拟实验误差。现在我们使用以下命令执行 PCApca统计工具箱中的函数:

>> [coeff, score, latent, tsquared, explained, mu] = pca(observations);

变量score是主成分分数的数组。这些将通过构造正交,您可以检查 -

>> corr(score)
ans =
    1.0000    0.0000    0.0000    0.0000
    0.0000    1.0000    0.0000    0.0000
    0.0000    0.0000    1.0000    0.0000
    0.0000    0.0000    0.0000    1.0000

组合score * coeff'将重现您的观察结果的中心版本。均值mu在执行 PCA 之前减去。要重现您的原始观察结果,您需要将其添加回来,

>> reconstructed = score * coeff' + repmat(mu, 100, 1);
>> sum((observations - reconstructed).^2)
ans =
   1.0e-27 *
    0.0311    0.0104    0.0440    0.3378

要获得原始数据的近似值,您可以开始从计算的主成分中删除列。为了了解要删除哪些列,我们检查explained多变的

>> explained
explained =
   58.0639
   41.6302
    0.1693
    0.1366

这些条目告诉您每个主成分解释了多少方差百分比。我们可以清楚地看到前两个分量比后两个分量更显着(它们解释了它们之间 99% 以上的方差)。使用前两个分量重建观测值给出了 2 阶近似值,

>> approximationRank2 = score(:,1:2) * coeff(:,1:2)' + repmat(mu, 100, 1);

我们现在可以尝试绘制:

>> for k = 1:4
       subplot(2, 2, k);
       hold on;
       grid on
       plot(approximationRank2(:, k), observations(:, k), 'x');
       plot([-4 4], [-4 4]);
       xlim([-4 4]);
       ylim([-4 4]);
       title(sprintf('Variable %d', k));
   end

我们几乎完美地再现了原始观察结果。如果我们想要更粗略的近似,我们可以只使用第一个主成分:

>> approximationRank1 = score(:,1) * coeff(:,1)' + repmat(mu, 100, 1);

并绘制它,

>> for k = 1:4
       subplot(2, 2, k);
       hold on;
       grid on
       plot(approximationRank1(:, k), observations(:, k), 'x');
       plot([-4 4], [-4 4]);
       xlim([-4 4]);
       ylim([-4 4]);
       title(sprintf('Variable %d', k));
   end

这次重建的情况不太好。这是因为我们故意将数据构建为具有两个因素,而我们只是根据其中之一来重建数据。

请注意,尽管我们构建原始数据及其再现的方式之间存在暗示性相似性,

>> observations  = factors * loadings'  +  0.1 * randn(100,4);
>> reconstructed = score   * coeff'     +  repmat(mu, 100, 1);

之间并不一定存在对应关系factors and score,或之间loadings and coeff。 PCA 算法对数据的构建方式一无所知 - 它只是尝试尽可能多地解释每个连续分量的总方差。


用户@Mari 在评论中询问她如何将重建误差绘制为主成分数量的函数。使用变量explained上面这个就很简单了。我将生成一些具有更有趣的因子结构的数据来说明效果 -

>> factors = randn(100, 20);
>> loadings = chol(corr(factors * triu(ones(20))))';
>> observations = factors * loadings' + 0.1 * randn(100, 20);

现在,所有观察结果都集中在一个显着的公因子上,而其他因素的重要性逐渐降低。我们可以像之前一样得到PCA分解

>> [coeff, score, latent, tsquared, explained, mu] = pca(observations);

并绘制解释方差的百分比如下,

>> cumexplained = cumsum(explained);
   cumunexplained = 100 - cumexplained;
   plot(1:20, cumunexplained, 'x-');
   grid on;
   xlabel('Number of factors');
   ylabel('Unexplained variance')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Matlab - 多维数据的PCA分析与重构 的相关文章

  • 在Matlab中将矩阵中的元素i,j设置为i*j

    我想生成一个矩阵 其中 i j 元素等于 i j 其中 i j e g 0 2 3 2 0 6 3 6 0 到目前为止 我已经发现我可以使用这个索引矩阵访问非对角线元素 idx 1 eye 3 但我还没有弄清楚如何将矩阵单元的索引合并到计算
  • 带插入符的主成分分析

    我正在使用 Caret 的 PCI 预处理 multinomFit lt train LoanStatus train method multinom std TRUE family binomial metric ROC thresh 0
  • Matlab 中 interp2 的类似 OpenCV Api

    有没有类似的功能 其工作原理与 interp2 x y frame z xd yd linear 0 在 OpenCV 中 功能cv remap 几乎可以满足您的要求 请参阅文档here http docs opencv org modul
  • 如何检测图像中对象的实例?

    我有一张包含几个特定对象的图像 我想检测这些物体在该图像中的位置 为此 我有一些模型图像 其中包含我想要检测的对象 这些图像在我想要检测的对象实例周围得到了很好的裁剪 这是一个例子 在这张大图里 我想检测此模型图像中表示的对象 自从你最初发
  • 将 Matlab MEX 文件中的函数直接嵌入到 Python 中

    我正在使用专有的 Matlab MEX 文件在 Matlab 中导入一些仿真结果 当然没有可用的源代码 Matlab 的接口实际上非常简单 因为只有一个函数 返回一个 Matlab 结构体 我想知道是否有任何方法可以直接从Python调用M
  • 增加 .fig 文件中的散点标记大小

    我有一个图形文件 scatter fig 该图有许多使用 scatter 的散点绘图仪 现在我只有这个无花果文件 我需要增加所有散点的标记大小 手动尝试过 但非常困难 有没有办法我可以做类似的事情 H 图形句柄 s 点 h 设置 s 标记大
  • 如何在 k 均值中使用欧氏距离以外的不同距离公式

    我正在处理纬度经度数据 我必须根据两点之间的距离进行聚类 现在两个不同点之间的距离是 ACOS SIN lat1 SIN lat2 COS lat1 COS lat2 COS lon2 lon1 6371 我想在 R 中使用 k 均值 有什
  • 将输出从符号数学 (sym) 转换为浮点型

    我的问题类似于这个问题 https stackoverflow com questions 11114101 how to convert mupad symbol i sqrt 1 to i in matlab 11114959 1111
  • 如何将Matlab代码库与Android集成?

    我有一个算法和 MATLAB 中的一些其他代码 我想在我的 Android 应用程序中使用它 我怎样才能做到这一点 我可以从 MATLAB 制作 jar 文件以便与 Android 一起使用吗 我必须做点别的事吗 如果您还有其他产品 适用于
  • 使用 python 在网络上部署 matlab 应用程序

    您好 我想使用 python 在网络上部署 matlab 应用程序 有没有办法做到这一点 我已按照数学工作网站上的文档将我的应用程序转换为 jar 文件 java 类 有人能指出我前进的正确方向吗 事实上 您的 Matlab 代码打包为 J
  • 使用 java 执行 Matlab 函数

    我正在编写一个应用程序 它使用 matlab 进行图像处理 然后使用 Java 接口显示结果 由于某些原因 我必须同时使用 Java 和 Matlab 如何在java中使用matlab函数 如何创建和访问界面 MATLAB控制 http m
  • 这是 `min` 和 `nanmin` 之间的区别; Matlab 中的“max”和“nanmax”?

    Matlab描述nanmin and nanmax像这样 NANMIN最小值 忽略NaNs NANMAX最大值 忽略NaNs 但实际上 min and max ignore NaNs too 那我应该使用哪个 根据我的测试 nanmin a
  • 在 Matlab 中快速加载大块二进制文件

    我有一些相当大的 int16 格式的数据文件 256 个通道 大约 75 1 亿个样本 每个文件约 40 50 GB 左右 它以平面二进制格式编写 因此结构类似于 CH1S1 CH2S1 CH3S1 CH256S1 CH1S2 CH2S2
  • 通过傅里叶空间填充进行插值

    我最近尝试在 matlab 上实现一个在傅立叶域中使用零填充的插值方法的简单示例 但我无法正常工作 我总是有一个小的频移 在傅里叶空间中几乎不可见 但它在时空上产生了巨大的误差 由于傅里叶空间中的零填充似乎是一种常见 且快速 的插值方法 因
  • 频域和空间域的汉明滤波器

    我想通过在 MATLAB 中应用汉明滤波器来消除一维信号中的吉布斯伪影 我所拥有的是k1这是频域中的信号 我可以通过应用 DFT 来获取时域信号k1 s1 ifft ifftshift k1 该信号具有吉布斯伪影 现在 我想通过 A 乘以汉
  • 优化 MATLAB 代码(嵌套 for 循环计算相似度矩阵)

    我正在 MATLAB 中基于欧几里德距离计算相似度矩阵 我的代码如下 for i 1 N M N is the size of the matrix x for whose elements I am computing similarit
  • 为什么 MATLAB 本机函数 cov(协方差矩阵计算)使用与我预期不同的除数?

    给定一个 M 维和 N 个样本的数据矩阵数据 例如 data randn N M 我可以计算协方差矩阵 data mu data ones N 1 mean data cov matrix data mu data mu N 如果我使用原生
  • 定义自定义 Mupad 程序的一般相对搜索路径

    假设我有一个 mupad 笔记本myMupadNotebook mn在路径上 C projectFolder ABC abc 它调用程序MyMupadProcedure mu它位于 C DEF GHI 现在我有一个 Matlab 脚本mai
  • 非模态 questdlg.m 提示

    我的代码绘制了一个图 然后提示用户是否想使用不同的参数绘制另一个图 问题是 当 questdlg m 打开时 用户无法查看绘图的详细信息 这是代码 while strcmp Cont Yes 1 Some code modifying da
  • 在Matlab中选择图像上的像素时,索引指的是什么?

    当在Matlab中查看图像的单个像素时 该索引指的是什么 X Y 指的是像素的坐标 RGB 指的是颜色 但是关于索引是什么有什么想法吗 为了澄清一下 当我在 Matlab 中查看图形并使用数据光标选择一个点时 显示的三行是 X Y 指数 R

随机推荐