Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB中的主成分分析_Matlab_Machine Learning_Computer Vision_Octave_Pca - Fatal编程技术网

MATLAB中的主成分分析

MATLAB中的主成分分析,matlab,machine-learning,computer-vision,octave,pca,Matlab,Machine Learning,Computer Vision,Octave,Pca,我正在使用稀疏数据的特征值分解实现PCA。我知道matlab已经实现了PCA,但它可以帮助我理解编写代码时的所有技术细节。 我一直遵循来自的指导,但与内置函数princomp相比,我得到了不同的结果 谁能看一下,给我指个方向吗 代码如下: function [mu, Ev, Val ] = pca(data) % mu - mean image % Ev - matrix whose columns are the eigenvectors corresponding to the eigen

我正在使用稀疏数据的特征值分解实现PCA。我知道matlab已经实现了PCA,但它可以帮助我理解编写代码时的所有技术细节。 我一直遵循来自的指导,但与内置函数princomp相比,我得到了不同的结果

谁能看一下,给我指个方向吗

代码如下:

function [mu, Ev, Val ] = pca(data)

% mu - mean image
% Ev - matrix whose columns are the eigenvectors corresponding to the eigen
% values Val 
% Val - eigenvalues

if nargin ~= 1
 error ('usage: [mu,E,Values] = pca_q1(data)');
end

mu = mean(data)';

nimages = size(data,2);

for i = 1:nimages
 data(:,i) = data(:,i)-mu(i);
end

L = data'*data;
[Ev, Vals]  = eig(L);    
[Ev,Vals] = sort(Ev,Vals);

% computing eigenvector of the real covariance matrix
Ev = data * Ev;

Val = diag(Vals);
Vals = Vals / (nimages - 1);

% normalize Ev to unit length
proper = 0;
for i = 1:nimages
 Ev(:,i) = Ev(:,1)/norm(Ev(:,i));
 if Vals(i) < 0.00001
  Ev(:,i) = zeros(size(Ev,1),1);
 else
  proper = proper+1;
 end;
end;

Ev = Ev(:,1:nimages);
函数[mu,Ev,Val]=pca(数据)
%mu-均值图像
%Ev-矩阵,其列为对应于特征向量的特征向量
%价值观
%Val-特征值
如果nargin~=1
错误('用法:[mu,E,Values]=pca_q1(数据)';
结束
mu=平均值(数据);
nimages=大小(数据,2);
对于i=1:nimages
数据(:,i)=数据(:,i)-mu(i);
结束
L=数据'*数据;
[Ev,VAL]=eig(L);
[Ev,VAL]=排序(Ev,VAL);
%实协方差矩阵特征向量的计算
Ev=数据*Ev;
Val=诊断值(Val);
VAL=VAL/(尼美日-1);
%将Ev标准化为单位长度
适当=0;
对于i=1:nimages
Ev(:,i)=Ev(:,1)/标准值(Ev(:,i));
如果VAL(i)<0.00001
Ev(:,i)=零(大小(Ev,1),1);
其他的
正确=正确+1;
结束;
结束;
Ev=Ev(:,1:nimages);

以下是我的做法:

function [V newX D] = myPCA(X)
    X = bsxfun(@minus, X, mean(X,1));           %# zero-center
    C = (X'*X)./(size(X,1)-1);                  %'# cov(X)

    [V D] = eig(C);
    [D order] = sort(diag(D), 'descend');       %# sort cols high to low
    V = V(:,order);

    newX = X*V(:,1:end);
end
以及一个与统计工具箱中的PRINCOMP函数进行比较的示例:

load fisheriris

[V newX D] = myPCA(meas);
[PC newData Var] = princomp(meas);


你可能也对这篇关于表演的相关文章感兴趣。

我想问一个问题,Is
princomp
默认情况下按
潜在
COEFF
的数据进行排序(参考:)?您的函数与
princomp
之间有什么区别?我想使用
coeff
潜伏期
,其中
coeff
潜伏期进行排序。我可以使用内置函数
princomp
或您的
myPCA
?@AhsanAli:显然,正如上面的示例所示,两个函数产生相同的输出(达到一定精度);
COEFF
(主成分)的列按照成分方差
潜在
按降序排序。另外,请检查上面提到的关于使用SVD而不是EIG执行PCA的最后一个链接。。注意,在最近的版本中,它被函数所取代(事实上,检查源代码以查看对
princomp
的调用在内部被路由到
pca
)。好的,b/w
pca
princomp
以及SVD在函数
myPCA
pca中的区别是什么?我无法区分它们?我的问题是,我想计算
n
pca
矩阵
[500x3]
其中
coeff
是用
最新值排序的
@AhsanAli:pca毕竟是一种正交变换,它将数据转换成一个新的坐标系(这样数据沿新方向的方差按降序最大)。主成分(系数矩阵的列)是描述新系统方向的向量。现在,如果
(I,J,K)
是向量空间的基集,那么
(a*I,b*J,c*K)也是
,具有相应变化的数据坐标(
分数
矩阵)。因此特征向量不是唯一的(可以独立缩放/乘以常数),只要它们跨越相同的子空间。