ica人脸识别 matlab,ICA算法和人脸识别程序
1.
ICA算法扩展描述
《Independent Component Analysis:Algorithms and Applications》(Aapo
Hyvärinen and Erkki Oja)文章里提到的一些内容(有些我也没看明白)。
首先里面提到了一个与“独立”相似的概念“不相关(uncorrelated)”。Uncorrelated属于部分独立,而不是完全独立,怎么刻画呢?
如果随机变量和是独立的,当且仅当。
如果随机变量和是不相关的,当且仅当
第二个不相关的条件要比第一个独立的条件“松”一些。因为独立能推出不相关,不相关推不出独立。
证明如下:
反过来不能推出。
比如,和的联合分布如下(0,1),(0,-1),(1,0),(-1,0)。
因此和不相关,但是
因此和不满足上面的积分公式,和不是独立的。
上面提到过,如果是高斯分布的,A是正交的,那么也是高斯分布的,且与之间是独立的。那么无法确定A,因为任何正交变换都可以让达到同分布的效果。但是如果中只有一个分量是高斯分布的,仍然可以使用ICA。
那么ICA要解决的问题变为:如何从x中推出s,使得s最不可能满足高斯分布?
中心极限定理告诉我们:大量独立同分布随机变量之和满足高斯分布。
我们一直假设的是是由独立同分布的主元经过混合矩阵A生成。那么为了求,我们需要计算的每个分量。定义,那么,之所以这么麻烦再定义z是想说明一个关系,我们想通过整出一个来对进行线性组合,得出y。而我们不知道得出的y是否是真正的s的分量,但我们知道y是s的真正分量的线性组合。由于我们不能使s的分量成为高斯分布,因此我们的目标求是让y(也就是)最不可能是高斯分布时的w。
那么问题递归到如何度量y是否是高斯分布的了。
一种度量方法是kurtosis方法,公式如下:
如果y是高斯分布,那么该函数值为0,否则绝大多数情况下值不为0。
但这种度量方法不怎么好,有很多问题。看下一种方法:
负熵(Negentropy)度量方法。
我们在信息论里面知道对于离散的随机变量Y,其熵是
连续值时是
在信息论里有一个强有力的结论是:高斯分布的随机变量是同方差分布中熵最大的。也就是说对于一个随机变量来说,满足高斯分布时,最随机。
定义负熵的计算公式如下:
也就是随机变量y相对于高斯分布时的熵差,这个公式的问题就是直接计算时较为复杂,一般采用逼近策略。
这种逼近策略不够好,作者提出了基于最大熵的更优的公式:
之后的FastICA就基于这个公式。
另外一种度量方法是最小互信息方法:
这个公式可以这样解释,前一个H是的编码长度(以信息编码的方式理解),第二个H是y成为随机变量时的平均编码长度。之后的内容包括FastICA就不再介绍了,我也没看懂。
8.
ICA的投影追踪解释(Projection Pursuit)
投影追踪在统计学中的意思是去寻找多维数据的“interesting”投影。这些投影可用在数据可视化、密度估计和回归中。比如在一维的投影追踪中,我们寻找一条直线,使得所有的数据点投影到直线上后,能够反映出数据的分布。然而我们最不想要的是高斯分布,最不像高斯分布的数据点最interesting。这个与我们的ICA思想是一直的,寻找独立的最不可能是高斯分布的s。
在下图中,主元是纵轴,拥有最大的方差,但最interesting的是横轴,因为它可以将两个类分开(信号分离)。
9.
ICA算法的前处理步骤
1、中心化:也就是求x均值,然后让所有x减去均值,这一步与PCA一致。
2、漂白:目的是将x乘以一个矩阵变成,使得的协方差矩阵是。解释一下吧,原始的向量是x。转换后的是。
的协方差矩阵是,即
我们只需用下面的变换,就可以从x得到想要的。
其中使用特征值分解来得到E(特征向量矩阵)和D(特征值对角矩阵),计算公式为
下面用个图来直观描述一下:
假设信号源s1和s2是独立的,比如下图横轴是s1,纵轴是s2,根据s1得不到s2。
我们只知道他们合成后的信号x,如下
此时x1和x2不是独立的(比如看最上面的尖角,知道了x1就知道了x2)。那么直接代入我们之前的极大似然概率估计会有问题,因为我们假定x是独立的。
因此,漂白这一步为了让x独立。漂白结果如下:
可以看到数据变成了方阵,在的维度上已经达到了独立。
然而这时x分布很好的情况下能够这样转换,当有噪音时怎么办呢?可以先使用前面提到的PCA方法来对数据进行降维,滤去噪声信号,得到k维的正交向量,然后再使用ICA。
10.
小结
ICA的盲信号分析领域的一个强有力方法,也是求非高斯分布数据隐含因子的方法。从之前我们熟悉的样本-特征角度看,我们使用ICA的前提条件是,认为样本数据由独立非高斯分布的隐含因子产生,隐含因子个数等于特征数,我们要求的是隐含因子。
而PCA认为特征是由k个正交的特征(也可看作是隐含因子)生成的,我们要求的是数据在新特征上的投影。同是因子分析,一个用来更适合用来还原信号(因为信号比较有规律,经常不是高斯分布的),一个更适合用来降维(用那么多特征干嘛,k个正交的即可)。有时候也需要组合两者一起使用。这段是我的个人理解,仅供参考。
% 这是一个ICA人脸识别算法实例,百度文库中的,作为第一次学习ICA算法
%---初始化--------------------------------
clc;
clear all;
close all;
% -----读入原始图像,混合,并输出混合图像---------------------------
% 读入混合前的袁术图像图片并显示
t = 0:1/100:9
T1 = sin(t);
T2 = randn(1,901);
T3 = square(4*t);
subplot(4,3,1),plot(T1);title('输入信号1');
subplot(4,3,2),plot(T2);title('输入信号2');
subplot(4,3,3),plot(T3);title('输入信号3');
%将其组成矩阵
S = [T1;T2;T3];% 图片个数即为变量数,图片的像素数即为采样数
% 因此 S_all 是一个变量个数 * 采样个数的矩阵
a = size(S,1); % 得到S 的行数
Sweight = randn(size(S,1)); % 只有一个数的时候,默认产生 一个方阵
% 上边是 去一个随机矩阵,作为信号混合的权矩阵
MixedS = Sweight * S; % 得到三个混合信号矩阵
% 将 混合矩阵重新排列并输出
subplot(4,3,4),plot(MixedS(1,:)),title('混合信号1');
subplot(4,3,5),plot(MixedS(2,:)),title('混合信号2');
subplot(4,3,6),plot(MixedS(3,:)),title('混合信号3');
MixedS_bak = MixedS; % 将混合后的数据备份,以便在恢复时直接调用
% -------标准化----------------------------------------
MixedS_mean = zeros(3,1);
for i = 1:3
MixedS_mean(i) = mean(MixedS(i,:));
end
% 上边是计算MixedS 的均值
for i = 1:3
for j = 1:
size(MixedS,2)
MixedS(i,j) = MixedS(i,j) - MixedS_mean(i);
end
end
%
---------白化----------------------------------------------
MixedS_cov = cov(MixedS'); % cov为求协方差的函数
[E,D] = eig(MixedS_cov); % 对图片矩阵的协方差函数进行特征值分解
Q = inv(sqrt(D))*(E)'; % Q为白化矩阵
MixedS_white = Q*MixedS; % MixedS_white为白化后的图片矩阵
IsI = cov(MixedS_white'); % IsI 应为单位阵
% ---------FASTICA算法---------------------------------
X = MixedS_white; % 这也是编程的小技巧,下边是对X进行操作, 不会改变MixedS_whiteD的值
[VariableNum,SampleNum] = size(X);
numofIC = VariableNum; %在此 应用中,独立元个数 等于变量的个数
B = zeros(numofIC,VariableNum);
for r = 1:numofIC % 迭代求取每一个独立元
i =
1; maxIterationsNum = 100; % 设置最大迭代次数(即对于每个独立分量而言迭代均不超过此次数)
IterationsNum = 0;
b =
rand(numofIC,1) - 0.5; % 随机设置b 初值
b =
b/norm(b); % 对b标准化
while i
<= maxIterationsNum + 1
if i == maxIterationsNum % 循环结束处理
fprintf('\n第%d分量在%d次迭代内并不收敛。',r,maxIterationsNum);
break;
end
bOld = b;
a2 = 1;
u = 1;
t = X'*b;
g = (exp(2.*t) - 1)./(exp(2.*t) +1);
dg = 4*exp(2.*t)./(exp(2.*t) + 1).^2;
b = ((1 -u)*t'*g*b + u*X*g)/ SampleNum - mean(dg)*b;
b = b - B*B'*b; % 对b进行正交化
b = b/norm(b);
if abs(abs(b'*bOld)-1) < 1e-9 % 如果收敛,则保存b
B(:,r) = b;
break;
end
i = i +1;
end
end
% --------------数据复原并构图---------------------------
ICAedS = B'*Q*MixedS_bak;
% 将混合矩阵重新排列并输出
subplot(437),plot(ICAedS(1,:)),title('ICA输出信号1');
subplot(438),plot(ICAedS(2,:)),title('ICA输出信号2');
subplot(439),plot(ICAedS(3,:)),title('ICA输出信号3');
%
----------------PCA计算并构图----------------------------------------------
[V,D] = eig(MixedS_cov);
Vtmp = zeros(size(V,1),1);
for j = 1:2
for i =
1:2
if D(i,i)
ica人脸识别 matlab,ICA算法和人脸识别程序相关推荐
- 《人脸识别原理及算法——动态人脸识别系统研究》—1章1.2节人脸识别相关学科的进展...
本节书摘来自异步社区<人脸识别原理及算法--动态人脸识别系统研究>一书中的1章1.2节人脸识别相关学科的进展,作者 沈理 , 刘翼光 , 熊志勇,更多章节内容可以访问云栖社区"异 ...
- 人脸识别三大经典算法_人脸识别系列四 | DeepID1算法
前言 这是人脸识别系列的第5篇文章,前4篇文章可以在公众号的人脸识别栏里找到,这篇文章主要是解析CVPR 2014年的经典人脸识别论文DeepID1算法.论文的地址如下:http://mmlab.ie ...
- 《人脸识别原理及算法——动态人脸识别系统研究》—第5章5.2节 主成分分析方法在人脸图像识别中的应用...
本节书摘来自异步社区<人脸识别原理及算法--动态人脸识别系统研究>一书中的第5章5.2节 主成分分析方法在人脸图像识别中的应用,作者 沈理 , 刘翼光 , 熊志勇,更多章节内容可以访问云栖 ...
- 《人脸识别原理及算法——动态人脸识别系统研究》—第5章5.5节小结
本节书摘来自异步社区<人脸识别原理及算法--动态人脸识别系统研究>一书中的第5章5.5节小结,作者 沈理 , 刘翼光 , 熊志勇,更多章节内容可以访问云栖社区"异步社区" ...
- 机器学习算法之PCA(主成分分析)人脸识别,最小重构误差和最大化散度证明,PCA主成分分析原理剖析,PCA人脸识别matlab实现,PCA人脸识别python实现
目录 PCA介绍 PCA大致思路 PCA人脸识别(特征脸法) matlab代码实现 Python代码实现 PCA几何解释 PCA证明最小重构误差和最大散度等价 实验结果 PCA介绍 主成分分析(Pri ...
- 计算机识别人脸原理,《人脸识别原理及算法 ——动态人脸识别系统研究》第一章 概论...
1. 作为人类特征识别的一种,人脸识别和其他人类特征识别相比,具有自然性和不被被测个体察觉的特点,这也是其优点.自然性指该识别方式同人类(甚至其他生物)进行个体识别时所利用的生物特征相同. 2. 人脸 ...
- 路标识别 matlab 聚类算法,基于卷积神经网络的交通路标检测v1.doc
摘 要 交通管理及交通安全问题正受到人们越来越多的关注.在此背景下,智能交通系统的概念应运而生.作为智能交通系统的一部分,交通标志检测系统在驾驶辅助.交通标志维护.自动驾驶等多方面具有重要作用.然而, ...
- bp神经网络车牌识别matlab源代码,BP神经网络车牌识别
[实例简介]利用GUI搭建车牌识别 [实例截图] [核心代码] bp神经网络车牌识别 ├── bp.m ├── bpnet.mat ├── getword.m ├── lpr.m ├── lpr_GU ...
- lenet5手写数字识别 matlab,LeNet5实现手写体数字识别(基于PyTorch实现)
import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from ...
最新文章
- win32的一个售票程序,收获有非常的多
- 针对《评人工智能如何走向新阶段》一文,继续发布国内外的跟贴留言第二部552-556条
- Linux-Raid0、Raid1、Raid5、Raid10初探
- java 最大子数组_求一个数组中子数组的最大和算法(Java实现)
- c语言注释换颜色,C语言实现注释转换
- java structs hibernate php_eclipse+hibernate+structs 环境搭建
- Ubuntu 安装 Clang 编译器
- 昔日最有前途的 Java 最终还是败给了晚辈 Python
- 《软件评测师教程》学习笔记-第一章:软件测试概述
- 十步一拆:iPhone4S拆机十步曲
- 【华为OD机试真题 JS】叠积木
- 服务器2008r2启动修复,Windows Server 2008 R2原生启动试用
- 针对VMware安装Win10需要安装.NET Framework 3.5常见的0x800F0906、0x800F081F错误解决办法
- Android 面部识别之二(调用开源面部识别算法seetaface检测)
- 诸葛亮司马懿大战房市
- 「Fail-Fast与Fail-Safe机制」
- 免费开题报告|基于SpringBoot+Vue的校内跑腿平台
- 10个WordPress电商产品页面扩展功能
- python量化实战_Python量化交易实战
- HP打印机M1216nfh无法在win10安装驱动的解决方法
热门文章
- phpcms v9 邀请用户注册自动获取积分奖励
- 每天笑一笑2012年8月28日
- Rust 2018 调查报告发布;微软超越苹果成为全球市值最大公司
- project子项目之间任务关联_任务关联的类型(Project)
- 基于 R 的结构方程模型在生态学中的应用
- 英语Kutnahorite金田黄kutnahorite单词
- TypeError: can‘t convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to
- 三次蝉联!Stratifyd在G2 2021秋季报告中再获“高成长者”荣誉
- 常见拉丁文读法,肯定用得着~
- 会计 金融管理 计算机网络技术,天津海运职业学院专业排名,招生专业目录(10篇)...