模式识别学习初感悟

学习模式识别已经快一个月了,从开始的混沌迷茫到现在的小有感觉,不能说自己进步了很多,只能说自己没有虚度这一个月的时光。下面相对自己这一个月的学习做一个总结,希望各位老师同学能多提宝贵意见,毕竟学术要在交流中才能发展。

考研的生活结束后,顺利进入了理想的大学。然学习的紧张度却有增无减。刚拿到导师给的tutorials,感觉就像是天书一般,没有任何过渡就直接让我们接触算法和编程,诸如PCA,LDA,贝叶斯估计,MRF,Graphical Cut,Adaboost,SVM......这些东西以前根本没听,更别说让编程实现了。虽然自己是4月份拿到的tutorials,但真正开始看到现在只有一个月时间,因为刚开始是自己回家学习,没留校,所以有问题也没法解决。现在至少有同学们一块讨论(虽然都不太懂),多少能有所进步。自己每天都从早学到晚(虽然这是暑假),可能是自己智商有限,问题总是很多。学习模式识别,我感觉不应该只是学习算法,会编程就行了,因为如果你对理论不是特别清楚,怎么能写出高质量的论文?但也许是我太急功近利了,我看每一讲,不只看算法和编程,我还会上网查资料并且找一些详细的有数学推导过程的书籍,比如模式分类(这可谓经典之作),但学习过程中我发现,往往单纯学某一节会涉及到很多其他章节的内容,比如学到学贝叶斯理论,会有贝叶斯决策,贝叶斯估计,贝叶斯网络......学习MRF,会有马尔科夫网络,HMM,以及一系列满足马尔科夫性的过程(空间和时间两方面),而这每一方面的内容都是一个系统的理论,不是一朝一夕就能掌握,所以刚开始自己收获并不多,但经过看了这么多内容后我多少也有了一些自己的感悟。

一、首先我接触到的是最小二乘,这个还好理解,因为毕竟初中就有所耳闻,我记得最早接触的最小二乘的应用是在线性规划中,要求根据观测的数据拟合出最优直线,这方面的东西因为有理论基础了,所以学起来也较为顺手。但需要注意的一点是最小二乘对于那些outliers不鲁棒,所以这也算是它的缺点,另外针对这一问题有一些鲁棒的误差函数可以应用,还有一个重要的算法也可以解决,就是Ransac(Random sample consensus,随机采样一致性),基本思想是针对一堆数据,每次随机采n个进行拟合,迭代N次找出inliers个数最多的那条直线就可以了。但这一缺点不能阻止最小二乘应用广泛。以下是我用MATLAB编写的圆拟合程序。

function r=ransac_cycle()
clear
clc
R=5;
t=0.5;
theta=0:(2*pi/200):2*pi;
inlier=zeros(1,200);
for m=1:200
    k=rand(1);
xdata(m)=(R+k)*cos(theta(m));
ydata(m)=(R+k)*sin(theta(m));
end
XY=[xdata' ydata'];
scatter(xdata,ydata,'filled');grid on;hold on;
for i=1:200
    j=ceil(199*rand(1)+1);
    x1=XY(j,1);
    y1=XY(j,2);
    k=ceil(199*rand(1)+1);
    x2=XY(k,1);
    y2=XY(k,2);
    l=ceil(199*rand(1)+1);
    x3=XY(l,:);
    y3=XY(l,2);
    x12=(x1+x2)/2;
    y12=(y1+y2)/2;
    x13=(x1+x3)/2;
    y13=(y1+y3)/2;
    a12=-(x1-x2)/(y1-y2);
    a13=-(x1-x3)/(y1-y3);
    if a12==a13
        break
    end
    x0=(y13-y12-a13.*x13+a12.*x12)/(a12-a13);
    y0=y12+a12.*(x0-x12);
    r1=normest([x0-x1,y0-y1]);
    r2=normest([x0-x2,y0-y2]);
    r3=normest([x0-x3,y0-y3]);
    r=(r1+r2+r3)/3;
    x=r*cos(theta)+x0;
    y=r*sin(theta)+y0;
    for n=1:200
        if abs(sqrt((xdata(n)-x0)^2+(ydata(n)-y0)^2)-r)160
        xm=[x0 y0];
       xd=r*cos(theta)+x0;
       yd=r*sin(theta)+y0;
       plot(xd,yd,'LineWidth',2);
       return
    end
end


二、PCA(principal component analysis)算法。由于我现在主要了解到的是人脸识别,所以主要介绍其在人脸识别方面的应用。主成分分析的主要思想是:将采集到的人脸库表示成训练矩阵,然后利用协方差矩阵的特征向量来表示特征脸,任意一副人脸都能表示为特征脸与平均脸的线性组合。其实就是将人脸空间投影到另一个更低维的空间中。一般只选取特征脸的前几个作为主成分就可以表示任一副人脸,这样的一个过程对原矩阵实现了降维,所以在需要降维的场合里PCA得到了广泛应用。需要注意的是,在求协方差矩阵的时候,因为图像矩阵特别大,所以计算较为复杂,有时会用SVD分解计算,这样可以提高计算的准确性,利用SVD分解也可以实现降维的作用。

三、LDA(linear disciminant analysis)算法与正则化。线性鉴别分析的主要思想是:找到这样一个投影空间,使得原数据集投影到它的时候,能让同类数据更加紧密,不同类数据更加远离,理论推导主要就是找到这样一个函数S=(W'*SB*W)/(W'*SW*W),使得它的大小能用来衡量同类数据紧密与不同类数据远离的程度,其中SB是不同类数据的离散程度,SW是同类数据的离散程度,易见S越大越好,W就是我们要找的投影矩阵。正则化是在判别函数的数据项中引入正则化项,从而使解具有某种属性,这样的一个作用是能够避免过拟合,至于其他的作用我还尚不明确。以下是我用MATLAB编的PCA\LDA投影线。

function PCA_LDA()
clear
clc
x1=9*rand(20,1);
y1=x1+2*rand(20,1);
x2=9*rand(20,1);
y2=x2-2*rand(20,1);
XY1=[x1 y1];
XY2=[x2 y2];
XY=[x1 y1;x2 y2];
m=1/40*sum(XY);
m1=1/20*sum(XY1);
m2=1/20*sum(XY2);
for t=1:40
    sm(t,:)=XY(t,:)-m;
end
axis([-10 10 -10 10]);
scatter(x1,y1,'r','filled');grid on;hold on;
scatter(x2,y2,'g','filled');hold on;
%PCA主成分分析
u=sm'*sm;
[s,d,v]=svd(u);
x=-10:10;
y=s(2,1)/s(1,1)*x;
axis([-10 10 -10 10]);
plot(x,y,'--');hold on;
%LDA线性鉴别分析
sw=[0 0;0 0];
for i=1:20
     sw=((XY1(i,:))-m1)'*(XY1(i,:)-m1)+((XY2(i,:))-m2)'*(XY2(i,:)-m2);
end
sb=(m1-m2)'*(m1-m2);
w=inv(sw)*(m1-m2)';
xx=-10:10;
yy=w(2)/w(1)*xx;
axis([-10 10 -10 10]);
plot(xx,yy);


四、贝叶斯与朴素贝叶斯。关于贝叶斯理论的研究相当多,在看模式分类的时候,第二章贝叶斯决策理论还相对能够理解,但到第三章贝叶斯估计的时候我遇到了很多问题,问题部分我以后会在我的博客文章分类的‘问题思考’部分详细论述,希望能与大家讨论。我所理解的贝叶斯估计是:我们要想判断将xk分为哪一类最好,需要判断后验概率p(wi|xk)中哪个wi能令它取最大值,用贝叶斯公式可转化为判断似然函数p(xk|wi)的最大值。这里假设了似然函数形式已知但参数theta未知,还假设参数theta的分布已知,这样就可以令p(xk|wi)=,将问题转化为求p(theta|wi)这个关于theta的后验概率。关于朴素贝叶斯分类我也用MATLAB编了一个程序。

function naive_bayes(x)
clc
y1=cell2mat(x(1));
y2=cell2mat(x(2));
y3=cell2mat(x(3));
y4=cell2mat(x(4));
if strcmp(x(1),'sunny')
    y1=1;
else if strcmp(x(1),'overcast')
       y1=2;
    else
        y1=3;
    end
end
if strcmp(x(2),'hot')
    y2=1;
else if strcmp(x(2),'mild')
        y2=2;
    else
        y2=3;
    end
end
if strcmp(x(3),'high')
    y3=1;
else
    y3=2;
end
if strcmp(x(4),'strong')
    y4=1;
else
    y4=2;
end
p=zeros(3,2,4);
p(1,1,1)=2/9;
p(2,1,1)=4/9;
p(3,1,1)=3/9;
p(1,2,1)=3/5;
p(2,2,1)=0;
p(3,2,1)=2/5;
p(1,1,2)=2/9;
p(2,1,2)=4/9;
p(3,1,2)=3/9;
p(1,2,2)=2/5;
p(2,2,2)=2/5;
p(3,2,2)=1/5;
p(1,1,3)=3/9;
p(2,1,3)=6/9;
p(1,2,3)=4/5;
p(2,2,3)=1/5;
p(1,1,4)=3/9;
p(2,1,4)=6/9;
p(1,2,4)=3/5;
p(2,2,4)=2/5;
pyes=9/14;
pno=5/14;
p1=p(y1,1,1)*p(y2,1,2)*p(y3,1,3)*p(y4,1,4)*pyes;
p2=p(y1,2,1)*p(y2,2,2)*p(y3,2,3)*p(y4,2,4)*pno;
if p1>p2
    disp('yes,i play tennis');
else
    disp('no,i donnot play tennis');
end

五、其他未清楚认识的内容。除了上面我已经学习过的知识外,还有一些我这段时间会好好学的,有MRF,HMM,Graphical cut,EM算法,Adaboost算法,SVM,K-means,GMM,这些知识我还没有看,这段时间主要对这些知识进行研究学习,不过貌似每一个内容都。。。

在学习模式识别的时候,我发现很多数学知识都用上了,比如统计学和矩阵理论,还要未接触过的如图论(比如DAG),集合论等等,所以学习这门课需要很强的数学运算与思考能力,而自己在这方面还有所欠缺,希望各位老师同学前辈不吝赐教,能在学习方法上提些宝贵意见,另外上面如果哪里不正确,还望各位指正。

 

 

你可能感兴趣的:(学习心得)