版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011529752/article/details/78004162
clc;
clear all;
close all;
Face=load('FERET_80_80_col.mat');
I=Face.FERET_80_80_col;
X=im2double(I); %6400*1400 r*c
X=X(:,1:1400)';
[r,c]=size(X);
% W=ICA(X);
%-----------去均值---------
[M,T] =size(X);%获取输入矩阵的行/列数,行数为观测数据的数目,列数为采样点数
mm=mean(X')';%均值
average=repmat(mm,1,c); %M 6400*1400 r*c
X=X-average;
%---------白化/球化------
Cx=cov(X');%计算协方差矩阵Cx
[eigvector,eigvalue]=eigs(Cx,r);%计算Cx的特征值和特征向量
eigvalue(find(eigvalue<0))=0;%有计算误差,会出现略微小于零的值
W=eigvalue^(-0.5)*eigvector';%白化矩阵
Z=W*X; %正交矩阵PCA降维
%----------迭代-------
Maxcount=10000;%最大迭代次数
Critical=0.00001;%判断是否收敛
m=25;%需要估计的分量的个数
W=rand(M,m);
for n=1:m
WP=W(:,n);%初始权矢量(任意)
count=0;
LastWP=zeros(M,1);
W(:,n)=W(:,n)/norm(W(:,n));
while abs(WP-LastWP)&abs(WP+LastWP)>Critical
n
count=count+1 %迭代次数
LastWP=WP;%上次迭代的值
WP=1/T*Z*((LastWP'*Z).^3)'-3*LastWP;
% for i=1:m
% WP(i)=mean(Z(i,:).*(tanh((LastWP)'*Z)))-(mean(1-(tanh((LastWP))'*Z).^2)).*LastWP(i);
% end
%规范正交基,使得本解和前面的所有解正交,即施密特正交化
WPP=zeros(M,1);
for j=1:n-1
WPP=WPP+(WP'*W(:,j))*W(:,j);
end
WP=WP-WPP;
WP=WP/(norm(WP));
if count==Maxcount
fprintf('未找到相应的信号');
return;
end
end
W(:,n)=WP;
end
%归一化
V=(W'*Z)';
Vmax=max(V);
Vmin=min(V);
Vmax=repmat(Vmax,c,1);
Vmin=repmat(Vmin,c,1);
Iv=(V-Vmin)./(Vmax-Vmin);
%显示
figure('Name','原图','NumberTitle','off');
for i=1:25
si=num2str(i);
subplot(5,5,i),imshow(reshape(I(:,i),80,80)),title(['脸' si]);
end
%显示特征脸
figure('Name','特征脸','NumberTitle','off');
for i=1:25
si=num2str(i);
subplot(5,5,i),imshow(reshape(Iv(:,i),80,80)),title(['特征脸ICA' si]);
end
ICA特征脸和PCA的区别
1)ICA分析的是盲源独立信号
2)ICA是把每一幅图作为一个特征,把每个像素点作为一个观测值,即时间t。特征脸是所有图像中统计独立的脸,各个特征脸线性加权可以重构脸。
而PCA是把每一幅图作为一个观测值,而把像素点作为一个特征。特征脸是掩模系数,特征脸点乘原数据得到特征值。各特征脸之间没有重构关系。