function [eigvector, eigvalue, elapse] = PCA_2(data, options)
if (~exist('options','var'))
options = [];
end
ReducedDim = 0;
if isfield(options,'ReducedDim')
ReducedDim = options.ReducedDim;
end
[nSmp,nFea] = size(data);
if (ReducedDim > nFea) || (ReducedDim <=0)
ReducedDim = nFea;
end
tmp_T = cputime;
if issparse(data)
data = full(data);
end
sampleMean = mean(data,1);
data = (data - repmat(sampleMean,nSmp,1));
if nFea/nSmp > 1.0713
% This is an efficient method which computes the eigvectors of
% of A*A^T (instead of A^T*A) first, and then convert them back to
% the eigenvectors of A^T*A.
ddata = data*data';
ddata = max(ddata, ddata');
dimMatrix = size(ddata,2);
if dimMatrix > 1000 && ReducedDim < dimMatrix/10 % using eigs to speed up!
option = struct('disp',0);
[eigvector, eigvalue] = eigs(ddata,ReducedDim,'la',option);
eigvalue = diag(eigvalue);
else
[eigvector, eigvalue] = eig(ddata);
eigvalue = diag(eigvalue);
[junk, index] = sort(-eigvalue);
eigvalue = eigvalue(index);
eigvector = eigvector(:, index);
end
clear ddata;
maxEigValue = max(abs(eigvalue));
eigIdx = find(abs(eigvalue)/maxEigValue < 1e-12);
eigvalue (eigIdx) = [];
eigvector (:,eigIdx) = [];
eigvector = data'*eigvector; % Eigenvectors of A^T*A
eigvector = eigvector*diag(1./(sum(eigvector.^2).^0.5)); % Normalization
else
ddata = data'*data;
ddata = max(ddata, ddata');
dimMatrix = size(ddata,2);
if dimMatrix > 1000 & ReducedDim < dimMatrix/10 % using eigs to speed up!
option = struct('disp',0);
[eigvector, eigvalue] = eigs(ddata,ReducedDim,'la',option);
eigvalue = diag(eigvalue);
else
[eigvector, eigvalue] = eig(ddata);
eigvalue = diag(eigvalue);
[junk, index] = sort(-eigvalue);
eigvalue = eigvalue(index);
eigvector = eigvector(:, index);
end
clear ddata;
maxEigValue = max(abs(eigvalue));
eigIdx = find(abs(eigvalue)/maxEigValue < 1e-12);
eigvalue (eigIdx) = [];
eigvector (:,eigIdx) = [];
end
if ReducedDim < length(eigvalue)
eigvalue = eigvalue(1:ReducedDim);
eigvector = eigvector(:, 1:ReducedDim);
end
if isfield(options,'PCARatio')
sumEig = sum(eigvalue);
sumEig = sumEig*options.PCARatio;
sumNow = 0;
for idx = 1:length(eigvalue)
sumNow = sumNow + eigvalue(idx);
if sumNow >= sumEig
break;
end
end
eigvector = eigvector(:,1:idx);
end
elapse = cputime - tmp_T;
pca的matlab程序翻译成公式和汉字。
答案:2 悬赏:80
解决时间 2021-02-04 08:42
- 提问者网友:北故人
- 2021-02-04 01:14
最佳答案
- 二级知识专家网友:虚伪的现实
- 2021-02-04 02:50
1,对矩阵M的每一行求均值mu
2,M的每行减去对应行的均值,得到M1
3,对M1做SVD(奇异值分解)得到 U S V
4,在S里舍掉数字太小的部分得到S1。
5,用U S1 V还原回矩阵。
做好了
2,M的每行减去对应行的均值,得到M1
3,对M1做SVD(奇异值分解)得到 U S V
4,在S里舍掉数字太小的部分得到S1。
5,用U S1 V还原回矩阵。
做好了
全部回答
- 1楼网友:桃花别处起长歌
- 2021-02-04 03:36
虽然我很聪明,但这么说真的难到我了
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯