我想了解 Matlab 中的主成分分析,
似乎至少有 3 个不同的功能可以做到这一点。
我对下面的代码有一些疑问:
x
值?我认同?? PC
和 V
都意味着 (x'x) 的加载不同?列顺序是相反的,因为 eig 不会首先对具有最大值的特征值进行排序,但为什么它们彼此互为负数? eig
值没有与第一列中最大特征值对应的特征向量排序? x
和 svd
时回到输入矩阵 eig
,但是 princomp 的结果似乎完全不同?那么我必须做什么才能使 princomp 匹配其他两个函数? 代码:
x=[1 2;3 4;5 6;7 8 ]
econFlag=0;
[U,sigma,V] = svd(x,econFlag);%[U,sigma,coeff] = svd(z,econFlag);
U1=U(:,1);
V1=V(:,1);
sigma_partial=sigma(1,1);
score1=U*sigma;
test1=score1*V';
score_partial=U1*sigma_partial;
test1_partial=score_partial*V1';
[PC, D] = eig(x'*x)
score2=x*PC;
test2=score2*PC';
PC1=PC(:,2);
score2_partial=x*PC1;
test2_partial=score2_partial*PC1';
[o1 o2 o3]=princomp(x);
最佳答案
svd
的文档,输出 S
的对角线元素按降序排列。但是,D
的输出 eig
没有这样的保证。 a
是特征向量,那么 -a
也是。 princomp
在计算主成分之前将输入数据居中。这是有道理的,因为通常 PCA 是相对于协方差矩阵计算的,如果 x' * x
是无均值,那么 x
的特征向量仅与协方差矩阵的特征向量相同。 我将通过转换到协方差矩阵(居中数据)的特征向量的基础来计算 PCA,但将此转换应用于原始(未居中)数据。这允许使用尽可能少的主成分捕获最大的方差,但仍然可以从所有主成分中恢复原始数据:
[V, D] = eig(cov(x));
score = x * V;
test = score * V';
test
与 x
相同,直到数字错误。为了轻松选择差异最大的组件,让我们自己解决缺乏排序的问题:
[V, D] = eig(cov(x));
[D, ind] = sort(diag(D), 'descend');
V = V(:, ind);
score = x * V;
test = score * V';
仅使用最强的主成分重建信号:
test_partial = score(:, 1) * V(:, 1)';
回应Amro的评论:当然也可以先从输入数据中去除均值,对这些“居中”的数据进行变换。在这种情况下,为了完美重建原始数据,需要再次添加均值。上面给出的计算 PCA 的方法是 Neil H. Timm,Applied Multivariate Analysis,Springer 2002,第 446 页描述的方法:
Timm 后来将“标准化成分”定义为从中心数据计算出来的成分,然后除以特征值(即方差)的平方根,即“标准化主成分”的均值为 0,方差为 1。
关于matlab - 在 Matlab 中使用不同函数计算的主成分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21242542/