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 所期望的优势排序的......所以第一列是最主要的方向,第二列是第二主要方向,等等。
一旦您调用上述方法,您只需索引coeff
和score
即可保留您想要的任何组件。在你的情况下,你只需要第一个组件,所以这样做:
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对手写数字数据集的降维