ICA特征脸试验

版权声明:本文为博主原创文章,未经博主允许不得转载。 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是把每一幅图作为一个观测值,而把像素点作为一个特征。特征脸是掩模系数,特征脸点乘原数据得到特征值。各特征脸之间没有重构关系。

猜你喜欢

转载自blog.csdn.net/u011529752/article/details/78004162
今日推荐