Matlab中的降维

Posted

技术标签:

【中文标题】Matlab中的降维【英文标题】:Dimensionality reduction in Matlab 【发布时间】:2015-08-01 22:08:31 【问题描述】:

我想在 MATLAB 中将数据的维度减少到 ndim 维度。我正在使用pcares 来减少维度,但结果(即残差,重构)与数据具有相同的维度,而不是ndim。如何仅将残差投影到 ndim 维度。

[residuals,reconstructed] = pcares(X,ndim)

示例代码

MU = [0 0];
SIGMA = [4/3 2/3; 2/3 4/3];
X = mvnrnd(MU,SIGMA,1000);
[residuals,reconstructed] = pcares(X,1)

现在我希望残差有 1 个维度,即数据 X 投影到主要分量,因为我将其指定为 pcares(X,1)。但是这里的残差和重构的都​​是2。

【问题讨论】:

您能否发布一个最低限度的工作示例,以便我们最终构建问题?用ndim 调用pcares 应该给你ndim 投影向量来重建你的数据。让它与原始数据的维度相同似乎很奇怪。 @rayryeng 请检查示例代码。我希望将数据沿主成分投影到一维。 【参考方案1】:

pcares 正在做它的工作。如果你读过documentation,你会这样调用函数:

[RESIDUALS,RECONSTRUCTED] = pcares(X,NDIM);

RESIDUALS 通过保留数据的第一个 NDIM 维度返回每个数据点的残差,RECONSTRUCTED 是使用第一个 NDIM 主成分重构的数据。

如果您想要 实际 投影矢量,则需要改用 pca。你可以这样称呼它:

[coeff,score] = pca(x);

事实上,这就是pcares 在幕后所做的,但它也使用上述输出为您重建数据。 coeff 返回数据的主要系数,而 score 返回实际投影向量本身。 score 使得每个 column 都是一个单一的投影向量。应该注意的是,这些是按照您对 PCA 所期望的优势排序的......所以第一列是最主要的方向,第二列是第二主要方向,等等。

一旦您调用上述方法,您只需索引coeffscore 即可保留您想要的任何组件。在你的情况下,你只需要第一个组件,所以这样做:

c = coeff(1);
s = score(:,1);

如果你想在给定投影向量的情况下重建数据,参考倒数第二行代码,很简单:

[coeff,score] = pca(x);
n = size(X,1);
ndim = 1; %// For your case
reconstructed = repmat(mean(X,1),n,1) + score(:,1:ndim)*coeff(:,1:ndim)';

以上内容基本上是pcares 在幕后所做的。

【讨论】:

【参考方案2】:

尝试使用squeeze 命令 - 请参阅此处的参考:http://uk.mathworks.com/help/matlab/ref/squeeze.html

【讨论】:

100% 错误。这个问题要求对数据进行降维。 squeeze 消除了数据中的单一维度。不是一回事。 很公平。但是,如果问题一开始就明确表达出来,那么你只能是 100% 错误...... 这个问题措辞明确。我为听起来刺耳而道歉,但这个答案具有潜在的危险性和误导性。 squeeze 绝不会在数据方面进行降维。它减少了单例维度。我上面的评论并不是要告诉你你错了,而是警告那些在这种情况下尝试使用squeeze 的人。

以上是关于Matlab中的降维的主要内容,如果未能解决你的问题,请参考以下文章

机器学习实战基础(二十七):sklearn中的降维算法PCA和SVDPCA对手写数字数据集的降维

机器学习实战基础(二十七):sklearn中的降维算法PCA和SVDPCA对手写数字数据集的降维

PCA (主成分分析)详解 (写给初学者) 结合matlab(转载)

sklearn中的降维算法PCA和SVD

根据字符串中的降序数值排列列表中的项目

如何按数字向量的降序显示ggplot2中的条形?