ICA特征脸试验

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特征脸试验》
《ICA特征脸试验》

ICA特征脸和PCA的区别
1)ICA分析的是盲源独立信号
2)ICA是把每一幅图作为一个特征,把每个像素点作为一个观测值,即时间t。特征脸是所有图像中统计独立的脸,各个特征脸线性加权可以重构脸。
而PCA是把每一幅图作为一个观测值,而把像素点作为一个特征。特征脸是掩模系数,特征脸点乘原数据得到特征值。各特征脸之间没有重构关系。

点赞