我想在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。
答案 0 :(得分:2)
pcares
正在履行其职责。如果您阅读documentation,则以这种方式调用函数:
[RESIDUALS,RECONSTRUCTED] = pcares(X,NDIM);
RESIDUALS
通过保留数据的第一个NDIM
维度返回每个数据点的残差,RECONSTRUCTED
是使用第一个NDIM
主成分的重建数据。< / p>
如果您想要实际投影向量,则需要使用pca
。你这样称呼它:
[coeff,score] = pca(x);
实际上,这就是pcares
在幕后所做的事情,但它也使用上述输出为您重建数据。 coeff
返回数据的主系数,score
返回实际投影向量本身。 score
是每个列是单个投影向量。应该注意的是,这些是关于优势的排序,因为你期望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
的内幕。
答案 1 :(得分:-3)
尝试使用squeeze
命令 - 请参阅参考资料:http://uk.mathworks.com/help/matlab/ref/squeeze.html