基于等距算法模式识别的学习与研究一、Isomap 算法实现的基本步骤1.等距离映射(Isomap)该算法是一种全局非线性优化算法Isomap算法以多维尺度变换( fmult mensional scaling,简称MDS)为基础,利用数据点间的测地线距离来替代MDS中的欧氏距离,力求保持数据的内在流形结构,最大限度的保持数据点问在低维空间中的欧氏距离误差最小,最终实现数据点的低维空间的表示Isomap算法的目的是将高维空间 中的数据集合映射到低维流形空间中,得到低维嵌人数据集合:2.具体算法步骤如下:步骤1:计算样本点的邻域点集(取欧氏距离最近的个近邻点),构造邻域图步骤2:计算测地线距离根据邻域图,使用计算样本点间的最短距离,近似看作为两点间的测地线距离步骤3:使用MDS对最短距离矩阵重构维嵌入令是矩阵的前个最大的特征值,为对应的个特征向量,则维嵌入坐标为: Isomap算法作为常用的流形学习算法,在低维空间中可以有效保持高维空间数据的非线性结构,但在小样本情况时,当每类样本数小于构造邻域图数值尼时,计算得出的各个点的最短距离就不能正确得出测地线距离了本文使用Gabor’s波对预处理后的图像进行5个中心频率、8个方向的滤波,输出40副滤波图像。
但在增加了样本数量的同时,也对系统的硬件要求提出了更高的要求为了进一步降低计算量,本文提出使用Gabor特征融合方法,很好地解决了这一问题将每个中心频率的不同方向滤波结果进行相加,得到一个该中心频率的滤波图像图l给出对ORL数据库中的人脸经过Gabor~,波后相同中心频率的8个不同方向的滤波结果相加后的图像通过实验结果的比较表明,使用该方法对一副图像计算得出的5副图像和将一副图像的40副Gabor滤波图像作为Isomap算法的输入集合,其识别率相同,但输入量是原方法的,减小TIsomap算法的计算量,提高了算法的识别性能对人脸进行预处理后,进行Gabor特征融合,再采用Isomap算法对数据进行维数约减,低维空间中保持各个样本点的非线性结构;支持向量机在处理小样本问题有较好的识别性能,因此使用支持向量机作为分类器进一步提高算法识别率二.独立分量分析ICA算法的研究可分为基于信息论准则的迭代估计方法和基于统计学的代数方法两大类,从原理上来说,它们都是利用了源信号的独立性和非高斯性基于信息论的方法研究中,各国学者从最大熵、最小互信息、最大似然和负熵最大化等角度提出了一系列估计算法如FastICA算法, Infomax算法,最大似然估计算法等。
基于统计学的方法主要有二阶累积量、四阶累积量等高阶累积量方法本实验主要讨论FastICA算法一般情况下,所获得的数据都具有相关性,所以通常都要求对数据进行初步的白化或球化处理,因为白化处理可去除各观测信号之间的相关性,从而简化了后续独立分量的提取过程,而且,通常情况下,数据进行白化处理与不对数据进行白化处理相比,算法的收敛性较好 若一零均值的随机向量满足,其中:为单位矩阵,我们称这个向量为白化向量白化的本质在于去相关,这同主分量分析的目标是一样的在ICA中,对于为零均值的独立源信号,有:,且协方差矩阵是单位阵,因此,源信号是白色的对观测信号,我们应该寻找一个线性变换,使投影到新的子空间后变成白化向量,即: 其中,为白化矩阵,为白化向量利用主分量分析,我们通过计算样本向量得到一个变换其中和分别代表协方差矩阵的特征向量矩阵和特征值矩阵可以证明,线性变换满足白化变换的要求通过正交变换,可以保证因此,协方差矩阵: 再将式代入,且令,有 由于线性变换连接的是两个白色随机矢量和,可以得出一定是一个正交变换。
如果把上式中的看作新的观测信号,那么可以说,白化使原来的混合矩阵简化成一个新的正交矩阵证明也是简单的: 其实正交变换相当于对多维矢量所在的坐标系进行一个旋转 在多维情况下,混合矩阵是的,白化后新的混合矩阵由于是正交矩阵,其自由度降为,所以说白化使得ICA问题的工作量几乎减少了一半 白化这种常规的方法作为ICA的预处理可以有效地降低问题的复杂度,而且算法简单,用传统的PCA就可完成用PCA对观测信号进行白化的预处理使得原来所求的解混合矩阵退化成一个正交阵,减少了ICA的工作量此外,PCA本身具有降维功能,当观测信号的个数大于源信号个数时,经过白化可以自动将观测信号数目降到与源信号维数相同FastICA算法,又称固定点(Fixed-Point)算法,是由芬兰赫尔辛基大学Hyvärinen等人提出来的是一种快速寻优迭代算法,与普通的神经网络算法不同的是这种算法采用了批处理的方式,即在每一步迭代中有大量的样本数据参与运算但是从分布式并行处理的观点看该算法仍可称之为是一种神经网络算法FastICA算法有基于峭度、基于似然最大、基于负熵最大等形式,这里,我们介绍基于负熵最大的FastICA算法。
它以负熵最大作为一个搜寻方向,可以实现顺序地提取独立源,充分体现了投影追踪(Projection Pursuit)这种传统线性变换的思想此外,该算法采用了定点迭代的优化算法,使得收敛更加快速、稳健因为FastICA算法以负熵最大作为一个搜寻方向,因此先讨论一下负熵判决准则由信息论理论可知:在所有等方差的随机变量中,高斯变量的熵最大,因而我们可以利用熵来度量非高斯性,常用熵的修正形式,即负熵根据中心极限定理,若一随机变量由许多相互独立的随机变量之和组成,只要具有有限的均值和方差,则不论其为何种分布,随机变量较更接近高斯分布换言之,较的非高斯性更强因此,在分离过程中,可通过对分离结果的非高斯性度量来表示分离结果间的相互独立性,当非高斯性度量达到最大时,则表明已完成对各独立分量的分离负熵的定义: 式中,是一与具有相同方差的高斯随机变量,为随机变量的微分熵 根据信息理论,在具有相同方差的随机变量中,高斯分布的随机变量具有最大的微分熵。
当具有高斯分布时,;的非高斯性越强,其微分熵越小,值越大,所以可以作为随机变量非高斯性的测度由于根据式(3.6)计算微分熵需要知道的概率密度分布函数,这显然不切实际,于是采用如下近似公式: 其中,为均值运算;为非线性函数,可取,或或等非线性函数,这里,,通常我们取快速ICA学习规则是找一个方向以便具有最大的非高斯性这里,非高斯性用式(3.7)给出的负熵的近似值来度量,的方差约束为1,对于白化数据而言,这等于约束的范数为1FastICA算法的推导如下首先,的负熵的最大近似值能通过对进行优化来获得根据Kuhn-Tucker条件,在的约束下,的最优值能在满足下式的点上获得 这里,是一个恒定值, ,是优化后的值下面我们利用牛顿迭代法解方程(3.8)用表示式(3.8)左边的函数,可得的雅可比矩阵如下: 为了简化矩阵的求逆,可以近似为(3.9)式的第一项。
由于数据被球化,,所以,因而雅可比矩阵变成了对角阵,并且能比较容易地求逆因而可以得到下面的近似牛顿迭代公式:这里,是的新值,,规格化能提高解的稳定性简化后就可以得到FastICA算法的迭代公式:实践中,FastICA算法中用的期望必须用它们的估计值代替当然最好的估计是相应的样本平均理想情况下,所有的有效数据都应该参与计算,但这会降低计算速度所以通常用一部分样本的平均来估计,样本数目的多少对最后估计的精确度有很大影响迭代中的样本点应该分别选取,假如收敛不理想的话,可以增加样本的数量 FastICA算法的基本步骤:1. 对观测数据进行中心化,使它的均值为0;2. 对数据进行白化,3. 选择需要估计的分量的个数,设迭代次数4. 选择一个初始权矢量(随机的)5. 令,非线性函数的选取见前文7. 令8. 假如不收敛的话,返回第5步9.令,如果,返回第4步2.MATLAB源程序及说明:%下程序为ICA的调用函数,输入为观察的信号,输出为解混后的信号function Z=ICA(X)%-----------去均值---------[M,T] = size(X); %获取输入矩阵的行/列数,行数为观测数据的数目,列数为采样点数 average= mean(X')'; %均值for i=1:M X(i,:)=X(i,:)-average(i)*ones(1,T); end%---------白化/球化------Cx = cov(X',1); %计算协方差矩阵Cx[eigvector,eigvalue] = eig(Cx); %计算Cx的特征值和特征向量W=eigvalue^(-1/2)*eigvector'; %白化矩阵Z=W*X; %正交矩阵 %----------迭代-------Maxcount=10000; %最大迭代次数Critical=0.00001; %判断是否收敛m=M; %需要估计的分量的个数W=rand(m);for n=1:m WP=W(:,n); %初始权矢量(任意)% Y=WP'*Z;% G=Y.^3;%G为非线性函数,可取y^3等% GG=3*Y.^2; %G的导数 count=0; LastWP=zeros(m,1); W(:,n)=W(:,n)/norm(W(:,n)); while abs(WP-LastWP)&abs(WP+LastWP)>Critical 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('未找到相。