• 模式识别及其在图像处理中的应用》 1、模式识别基本框架 一般认为,模式识别是通过具体的事物进行观测所得到的具有时间、空间分布的信息,模式所属的类别或同一类中模式的总体成为模式类,其中个别具体的模式...

    《模式识别及其在图像处理中的应用》

    1、模式识别基本框架

    一般认为,模式识别是通过具体的事物进行观测所得到的具有时间、空间分布的信息,模式所属的类别或同一类中模式的总体成为模式类,其中个别具体的模式往往成为样本。

    样本——预处理——特征选择和提取——分类器设计&&分类结果

    【由上述分析可知,模式识别本身就是将特征空间映射为选择空间,将多维特征降维以减小复杂度,增加鲁棒性】

    2、特征提取和选择

    特征提取是指通过映射的方法用低维空间来表示样本的过程,特征提取后样本的可分性应该更好。常用方法:主元分析(PCA)、线性判别分析、核函数主元分析(Kernel PCA)、独立主元分析(ICA)、自组织映射(SOM)

    特征提取后的各个特征的物理意义有时不是很明确,往往很难看出各个特征对分类器的影响,有的甚至有副作用。因此要在这些特征中选择一部分,这就是特征选择。

    为了判断提取和选择的特征对分类的有效性,人们提出各种衡量特征分类性能的判据。最直接最有效的盘踞是计算分类器错误概率,但很难实现。最简单的判据是用于可用性判据的类内类间距离判据。

    【由上述分析可知,提取和选择对算法性能有决定性的作用,具体操作上既可以通过有监督学习、也可以无监督的聚类分析;除此之外,判断标准很重要,只有有了判断标准,才能够对选择的算法进行衡量和改进,这是反馈】

    3、模式识别的主要方法及其在图像处理中的应用

    1)     统计决策法

    以概率论和数理统计为基础,包括参数法和非参数法。参数法以Bayes决策准则为指导,其中最小错误率和最小风险贝叶斯决策是最常用的决策方法。参数估计方法在样本数据趋于无穷大时渐进理论,然而实际条件往往达不到。在样本数量有限的时候,往往根据样本直接设计分类器,这就是非参数方法。这类方法物理意义直观,但所得的结果和错误率往往没有直接联系。所设计的分类器不能保证最优。比较典型的有线性分类器、最近邻方法、K均值聚类发。

    缺点:缺少结构信息。

    2)     结构模式分析

    利用模式的结构描述与句法描述之间的相似性对模式进行分类,每个模式由它的各个子部分(称为子模式或者模式基元)的组合来表示。对模式的识别常以句法分析的方式进行,即依据给定的一组句法规则来剖析模式的结构。当模式中的每一个基元被分辨出来后,识别过程就可通过执行语法分析来实现。

    3)     模糊模式识别

    将非此即彼的0,1判断更改为隶属度函数。模糊模式识别的关键在隶属度函数的建立,目前的主要方法有模糊统计、模糊分布法、二元对比排序法、相对比较法和专家评分法。

    4)     人工神经网络模式识别

    定义:用软件或者硬件的方法,建立许多以大量处理单元为结点,处理单元实现(加权值的)互联的拓扑网络,进行模拟。

    主要特点:信息处理的并行性、自组织和自适应性、具有很强的学习能力和联想功能以及容错性能。

    4、模式识别的新进展及其在图像处理中的应用

    1)     支持向量机

    2)     仿生模式识别

    【这是篇2004年的论文,并且文章是综述,所以对SVM和仿生模式讲得不是很清楚,接下来找些SVM的论文研究研究】

     

    《模式识别方法概论》

    【这是篇2012年的文章,讲的内容很多与上面的文章有重复,所以不再每小节摘录,只摘录感觉写得好的地方】

    1、为提高识别结果的可靠性,往往需要加入知识库(规则)以对可能产生的错误进行修正,或者引入限制条件大大缩小待识别特征在模型库的搜索空间。

    2、SVM基本思想:先在样本空间或特征空间,构造出最优超平面,使得超平面与不同类样本之间的距离最大,从而达到最大的泛化能力。



    展开全文
  • 模式识别是一种从大量信息和数据出发,在专家经验和已有认识的基础上,利用计算机和数学推理的方法对形状、模式、曲线、数字、字符格式和图形自动完成识别 的过程。模式识别包括相互关联的两个阶段,即学习阶段和...
     
    

    模式识别是一种从大量信息和数据出发,在专家经验和已有认识的基础上,利用计算机和数学推理的方法对形状、模式、曲线、数字、字符格式和图形自动完成识别 的过程。模式识别包括相互关联的两个阶段,即学习阶段和实现阶段,前者是对样本进行特征选择,寻找分类的规律,后者是根据分类规律对未知样本集进行分类和 识别。广义的模式识别属计算机科学中智能模拟的研究范畴,内容非常广泛,包括声音和语言识别、文字识别、指纹识别、声纳信号和地震信号分析、照片图片分 析、化学模式识别等等。计算机模式识别实现了部分脑力劳动自动化。

    模式识别--对表征事物或现象的各种形式的(数值的,文字的和逻辑关系的)信息进行处理和分析,以对事物或现象进行描述、辨认、分类和解释的过程,是信息科学和人工智能的重要组成部分。

    模式还可分成抽象的和具体的两种形式。前者如意识、思想、议论等,属于概念识别研究的范畴,是人工智能的另一研究分支。我们所指的模式识别主要是对语音波 形、地震波、心电图、脑电图、图片、文字、符号、三位物体和景物以及各种可以用物理的、化学的、生物的传感器对对象进行测量的具体模式进行分类和辨识。

    模式识别问题指的是对一系列过程或事件的分类与描述,具有某些相类似的性质的过程或事件就分为一类。模式识别问题一般可以应用以下4种方法进行分析处理。

    统计模式识别方法:统计模式识别方法是受数学中的决策理论的启发而产生的一种识别方法,它一般假定被识别的对象或经过特征提取向量是符合一定分布规律的随 机变量。其基本思想是将特征提取阶段得到的特征向量定义在一个特征空间中,这个空间包含了所有的特征向量,不同的特征向量,或者说不同类别的对象都对应于 空间中的一点。在分类阶段,则利用统计决策的原理对特征空间进行划分,从而达到识别不同特征的对象的目的。统计模式识别中个应用的统计决策分类理论相对比 较成熟,研究的重点是特征提取。

    人工神经网络模式识别:人工神经网络的研究起源于对生物神经系统的研究。人工神经网络区别于其他识别方法的最大特点是它对待识别的对象不要求有太多的分析与了解,具有一定的智能化处理的特点。

    句法结构模式识别:句法结构模式识别着眼于对待识别对象的结构特征的描述。

    在上述4种算法中,统计模式识别是最经典的分类识别方法,在图像模式识别中有着非常广泛的应用。

     

    模式识别研究方向
         
    模 式识别研究主要集中在两方面,即研究生物体(包括人)是如何感知对象的,属于认知科学的范畴,以及在给定的任务下,如何用计算机实现模式识别的理论和方 法。前者是生理学家、心理学家、生物学家和神经生理学家的研究内容,后者通过数学家、信息学专家和计算机科学工作着近几十年来的努力,已经取得了系统的研 究成果。

    一个计算机模式识别系统基本上事有三部分组成的,即数据采集、数据处理和分类决策或模型匹配。任何一种模式识别方法都首先要通过各种传感器把被研究对象的 各种物理变量转换为计算机可以接受的数值或符号(串)集合。习惯上,称这种数值或符号(串)所组成的空间为模式空间。为了从这些数字或符号(串)中抽取出 对识别有效的信息,必须对它进行处理,其中包括消除噪声,排除不相干的信号以及与对象的性质和采用的识别方法密切相关的特征的计算(如表征物体的形状、周 长、面积等等)以及必要的变换(如为得到信号功率谱所进行的快速傅里叶变换)等。然后通过特征选择和提取或基元选择形成模式的特征空间。以后的模式分类或 模型匹配就在特征空间的基础上进行。系统的输出或者是对象所属的类型或者是模型数据库中与对象最相似的模型编号。针对不同应用目的,这三部分的内容可以有 很大的差别,特别是在数据处理和识别这两部分,为了提高识别结果的可靠性往往需要加入知识库(规则)以对可能产生的错误进行修正,或通过引入限制条件大大 缩小待识别模式在模型库中的搜索空间,以减少匹配计算量。在某些具体应用中,如机器视觉,除了要给出被识别对象是什么物体外,还要求出该物体所处的位置和姿态以引导机器人的工作。

     

    模式识别在实际中的应用

    模式识别已经在天气预报、卫星航空图片解释、工业产品检测、字符识别、语音识别、指纹识别、医学图像分析等许多方面得到了成功的应用。所有这些应用都是和 问题的性质密切不可分的,至今还没有发展成统一的、有效的可应用于所有的模式识别的理论。当前的一种普遍看法是不存在对所有的模式识别问题都使用的单一模 型和解决识别问题的单一技术,我们现在拥有的是一个工具袋,我们所要做的是结合具体问题把统计的和句法(结构)的识别方法结合起来,把统计模式识别或句法 模式识别与人工智能中的启发式搜索结合起来,把人工神经元网络与各种以有技术以及人工智能中的专家系统,不确定方法结合起来,深入掌握各种工具的效能和应 用的可能性,互相取长补短,开创模式识别应用的新局面。

    展开全文
  • 人工智能与模式识别的研究已有多年,但似乎公认的观点认为它仍然非常困难。试 对你所熟悉的任一方向(如指纹识别、人像识别、语音识别、字符识别、自然语言理解等 )的发展状况进行描述。并设想如果你将从事该方向的...

    汉王高级研究人员(模式识别、图像处理类)招聘试题 
      原文链接:http://www.cnblogs.com/dongsheng/articles/2793142.html

    说明: 
      可能您的专业并不完全符合本试题所涉及的领域。因此,并非所有的问题都需要回答 ,您可以只回答你所熟悉和能够回答的问题。允许参考任意的资料,但请独立完成此试题 ,我们更欣赏您独立的思考和创新的精神。本试题并非我们录用或者不录用您的惟一依据 。应聘高级研究人员者请回答这部分问题。 
      1.人工智能与模式识别的研究已有多年,但似乎公认的观点认为它仍然非常困难。试 对你所熟悉的任一方向(如指纹识别、人像识别、语音识别、字符识别、自然语言理解等 )的发展状况进行描述。并设想如果你将从事该方向的研究,你打算如何着手,以建立有 效的识别理论和方法;或者你认为现在的理论和方法有何缺陷,有什么办法来进行改进? (500字以内即可,不要太长) 
      2.简述下面任一主题的主要理论框架或主要观点(500字以内即可,不要太长) 
      (1)David Marr的视觉计算理论框架 
      (2)格式塔(Gestalt)心理学派的主要观点 
      (3)Bayes决策理论 
      (4)人工神经网络中的BP网络、自组织网络和联想记忆网络的主要内容 
      (5)基因算法 
      (6)小波分析 
      (7)目前流行的有损静态图像压缩方法 
      3.设想你要设计一个算法,检测给定的图像中是否有矩形结构。所要检测的矩形可能 有多种形态,试提出你的算法框架。要求你的算法至少能检测出样本中的矩形,而拒绝其 他的任意非矩形结构。矩形的大小、位置和方向未知,要求你的算法能确定这些参数。 
      如果你认为这个问题太难而不能解决,请说明理由。 


    高级软件开发人员招聘试题 
      
      应聘高级软件开发人员者请回答这部分问题。 
      1.数据的逻辑存储结构(如数组,队列,树等)对于软件开发具有十分重要的影响, 试对你所了解的各种存储结构从运行速度、存储效率和适用场合等方面进行简要地分析。 

      2.数据库技术是计算机系统中一个非常重要的领域,几乎所有的计算机应用中都或多 或少地用到了数据库。试简要地谈谈数据库设计中应当注意哪些问题,以及如何解决?给 出两种你所熟悉的DBMS,要求一种适用于小型应用,另一种适用于大型应用,给出你做出 选择的理由。 
      3.某公司的主要业务是提供WWW和E-mail服务,出于安全考虑,该公司要求我公司提 供一套网络指纹登录系统,该系统要求能够利用指纹替代E-mail中常用的密码,并对所提 供的部分网页通过指纹认证后才能访问,请利用你所学过的知识对该系统进行分析设计, 你可以指定网络的配置(包括协议),但必须保证邮件用户既可通过网页(http方式)收 取信件,也可通过Outlook收取信件。请分析该系统的可行性,可行时给出系统结构和主要 的存储结构,指出系统中的难点和解决方法。(假设指纹识别的问题已经解决) 


    汉王高级研究人员(模式识别、图像处理类)招聘笔试题

    原文链接:http://www.lwlm.com/BiShiTiMu/201305/694443.htm

      说明:
      可能您的专业并不完全符合本试题所涉及的领域。因此,并非所有的问题都需要回答,您可以只回答你所熟悉和能够回答的问题。允许参考任意的资料,但请独立完成此试题,我们更欣赏您独立的思考和创新的精神。本试题并非我们录用或者不录用您的惟一依据。应聘高级研究人员者请回答这部分问题。
      1.人工智能与模式识别的研究已有多年,但似乎公认的观点认为它仍然非常困难。试对你所熟悉的任一方向(如指纹识别、人像识别、语音识别、字符识别、自然语言理解等)的发展状况进行描述。并设想如果你将从事该方向的研究,你打算如何着手,以建立有效的识别理论和方法;或者你认为现在的理论和方法有何缺陷,有什么办法来进行改进?(500字以内即可,不要太长)
      2.简述下面任一主题的主要本文由论文联盟http://www.LWlm.cOm收集整理理论框架或主要观点(500字以内即可,不要太长)
      (1)David Marr的视觉计算理论框架
      (2)格式塔(Gestalt)心理学派的主要观点
      (3)Bayes决策理论
      (4)人工神经网络中的BP网络、自组织网络和联想记忆网络的主要内容
      (5)基因算法
      (6)小波分析
      (7)目前流行的有损静态图像压缩方法
      3.设想你要设计一个算法,检测给定的图像中是否有矩形结构。所要检测的矩形可能有多种形态,试提出你的算法框架。要求你的算法至少能检测出样本中的矩形,而拒绝其他的任意非矩形结构。矩形的大小、位置和方向未知,要求你的算法能确定这些参数。
      如果你认为这个问题太难而不能解决,请说明理由。


    图像处理职位面试题汇总(6)

    原始链接:http://blog.csdn.net/songzitea/article/details/26163745?utm_source=tuicool

    基础知识

    1.为了提高算法运行速度,可以有哪些方法?(写你了解的、用过的)

    2.什么是内存碎片?对系统能有何影响?如何在开发中尽量避免内存碎片

    图像处理

    1. 圆形靶子,在其上面随机标记一点,求点距圆心距离的概率密度函数和概率分布函数?

    2.我们的算法研究主要分为应用算法研究和基础研究,在图像处理、模式识别方向,你觉得用算未予研究可以用到哪些场合?(比如:车辆识别,人脸识别)

    3.简述hough变换的原理。请列举一些你认为可以用HOUGHT变换提取的形状,理由是什么?

    4.图像特征:了解哪些图像像相关的特征(特征描述,特征算子),并举例用什么地方?

    5.摄像机拍摄图像与现实世界是什么 变换?在这种变换中有哪些量不变的?请写出这种变换的代数表达式?

    6.Deep Learning 听说过多少,并举出目前哪些领域应用到Deep learning技术?

    7.图像增强与图像恢复是否是同一个概念?如果是,请解释什么是图像增强(图像恢复);如果不是,请说明其各自特点和应用领域,以及差异?

    综合

    如果在一段视频中,找寻穿上身蓝白条纹,下身黑色裤子的人,你能想到哪些方法?并给出大致的处理流程.

    ================

    C/C++基础知识题目

    1、 请问sizeof(char), sizeof(short), sizeof(int), sizeof(long*), sizeof(longlong)分别是多少?不同平台时哪些会有变化。

     2、 程序的局部变量存在于(       )中,全局变量存在于(         )中,     

    • 代码存在于(               )中      
    • 常量存与(    )中,
    •  动态申请数据存在于(          ) 

     3、  请指出下面程序的错误

    void GetBuffer(char *p){  
        p=(char *)malloc(100);  
    }  
    void Test(void){  
        char *str=NULL;  
        GetBuffer(str);  
        strcpy(str,"hello world");  
        printf(str);  
    }    
    

    4. 以下代码的输出是

        int main()  {  
            int a[10]={0, 1, 2, 3, 5, 4, 6, 7, 9, 8};  
            int *ptr=(int*)(&a+1);  
            printf("%d,%d,%d,%d\n", *(a+1), *(ptr-1), (a+1)[5], sizeof(a) );  
        }  

    嵌入式系统开发

    1、 相对于PC软件开发,嵌入式软件开发有什么不同?

    2、 常见设备接口中,串口、USB、SPI通常需要几根线,分别是什么线。使用时,典型速度是多少?有哪些差异?

    3、 嵌入式系统中,驱动是什么?请说明其作用。

    4、 嵌入式Linux系统中,有哪些同步机制?这些同步机制的优缺点是什么?

    算法优化

    1、给一个int型递增数组Data,写一个二分查找函数,并设计对该函数进行单元测试的测试用例。

    2、嵌入式软件中,某代码if( sqrt( x*x + y*y ) < R ) { //后续耗时计算 } ,该语句需执行1920*1080次判断,发现其中浮点sqrt比较慢,需要优化:

         a)  x,y,R均为浮点数。怎么使用预先判断的优化方法?

         b)  x,y为BYTE类型数据,R为浮点数,有什么优化方法?


    3、某识别比对系统,一次比对产生1百万条比对分值,分值为0~1000的float浮点数,请选出分值最大的前 1万条数据,同分按原顺序从前往后取,取满为止。请写出算法概要流程,要求尽量低的复杂度。

    4、情况同上,分值改为整数,取值范围 0~4000,请写出算法概要流程,要求尽量低的复杂度。


    图像处理算法工程师(索贝公司)

    原文链接:http://blog.csdn.net/ningyaliuhebei/article/details/20122259

    一、填空:
    1、常用的插值方法有:最近邻插值、双线性插值、立方卷积插值。
    2、常用的边缘检测算子有:一阶: Roberts Cross算子, Prewitt算子, Sobel算子, Canny算子, 罗盘算子
    二阶: Marr-Hildreth。
    3、能够表征一副图像的基本特征有:灰度值、纹理、形状
    4、FIR滤波器设计中常用的窗函数:三角形(Bartlett)窗、汉宁(Hanning)窗、汉明(Hamming)窗、

    布莱克曼(Blackman)窗
    5、视频流处理单元是:音频流处理单元是:
    6、(2006)10转换成16进制:7d6
    7、X86体系中,常用寄存器中经常用来存储数据的是:
    8、C++类中三种存取权限类型:private、public和protected。
    9、视频帧播放速度的单位是:PAL制式是——25fps,NTSC是——30fps。
    10、mfc中,CFile类最大支持读写——字节,Windows下动态加载一个动态函数名————

    展开全文
  • 北邮模式识别与智能系统实验室,提供了大量的电子书籍、源代码、资源下载。 朱虹图像处理研究室,提供了图像处理的讲义下载,并且有许多资源下载。 Fast Artificial Nerual Network Library,C语言实现的多层人工...

    下面收藏了计算机图像处理领域里面一些比较好的站点和资源,主要目的是为了个人备忘,这个列表将会不断地更新。

    1. 北邮模式识别与智能系统实验室,提供了大量的电子书籍、源代码、资源下载。
    2. 朱虹图像处理研究室,提供了图像处理的讲义下载,并且有许多资源下载。
    3. Fast Artificial Nerual Network Library,C语言实现的多层人工神经网络,正如名字所指示的一样,速度很快。
    4. Hidden Markov Model Toolkit,隐马尔可夫模型工具包,可用于语音识别,由剑桥大学开发。
    5. Torch Machine-Learning Library,实现了SVM,隐马尔可夫模型等算法,是目前机器学习社区使用比较广泛的一个开发包。
    6. Software Lists for Pattern Recognition and Image Processing,模式识别与图像处理方面的软件资源,大部分是Open Source的,不过维护者可能以后要取消这个页面了。






    展开全文
  • 在谈R-CNN之前,应该要先总结一下模式识别模式识别主要是对已知数据样本的特征发现和提取,比如人脸识别、...模式识别处理问题的性质和解决问题的方法角度,可以分为有监督(分类)无监督(聚类)两种。二...

    在谈R-CNN之前,应该要先总结一下模式识别。
    模式识别主要是对已知数据样本的特征发现和提取,比如人脸识别、雷达信号识别等,强调从原始信息中提取有价值的特征,在机器学习里面,好的特征所带来的贡献有时候远远大于算法本身的贡献。在番外篇中,我们使用过opencv中已经训练好的分类器,这也是模式识别的一种。
    模式识别从处理问题的性质和解决问题的方法角度,可以分为有监督(分类)与无监督(聚类)两种。二者的主要差别在于,样本是否有labels。一般说来,有监督的分类往往需要提供大量带有labels的样本,但在实际问题中,这是比较困难的,因此研究无监督的分类十分重要。(当然,模式识别已经是比较老的技术,当有监督的分类有用武之地时,更有效的神经网络已经出现了,生不逢时呀)

    1.1 分类

    1.1.1 K-Nearest Neighbour

    首先就是K最近邻(K-NN),是一种比较简单,直观的分类算法,也是计算量很大的一种算法。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。特别的,当k = 1时,该对象被分到离它最近的邻居所在的类中。不过这种算法有个缺点是,它对数据的局部结构敏感,容易过度拟合数据。作为简单的防止过拟合的方法一般都是赋给更近的邻居更大的权重,比如距离的倒数。
    参数k的选择很依赖数据,k越大,越容易忽视噪声,但边界也会更模糊。一般可以用不同的k值来训练k-NN分类器,然后验证哪个效果最好。
    如果是分两类,k最好选择一个奇数,这样不容易产生某一个点模棱两可的情况。
    还有,这个分类器对输入特征值域敏感,如果引入无关的特征会降低分类的准确性。可以将数据归一化到[0, 1]或[-1, 1]的区间内来防止。

    1.1.2 决策树算法

    决策树算法的核心,是根据先验条件构造一颗最好的决策树,来预测类别。
    举一个例子,一个公司评判员工有两个标准,一个是听话程度,一个是聪明程度;
    我们靠这两个参数来区分是否是好员工;

    聪明 听话 好员工
    8 2 no
    4 8 yes
    8 5 yes
    2 6 no

    我们有几种方法来做区分。以一种为例:用听话程度来区分:
    听话>=5 是树的左子树,听话<4是树的右叶子节点,右叶子节点均为坏员工;
    再对左子树进行区分,聪明>3为左子树,聪明<=为右子树,左子树均为好员工,右子树均为坏员工;这样就完成了一种决策树。那如何判断决策树的好坏呢?
    这种判断好坏的参数就是,信息熵增益。如果经过某个属性,划分后的数据信息熵下降最多,那么这种划分为最优。
    如我现在用的方法,第一次划分前熵为:
    -(2/4*log2(2/4)+2/4*log2(2/4)) = 1;
    划分后右子节点熵为0,左子节点熵:
    -(2/3*log2(2/3)+1/3*log2(1/3))= 0.39+0.526 = 0.916;这个熵下降就是0.084。
    第二次划分后,区分完毕,熵为0。(举的例子太弟弟了,不太明显,不过还算容易懂啦)
    经过决策属性的划分后,数据的无序度越来越低,也就是信息熵越来越小。
    具体就不细说啦 我们这可以说图像处理的,有点跑偏了。。顺便说一下,基于规则的分类器和这个大致相同,有兴趣的可以自己搜,就不在这里占用版面了。

    1.1.3 贝叶斯分类

    说贝叶斯,首先要说朴素贝叶斯。朴素贝叶斯如其名,非常朴素。核心思想就是对于待分类项,求解各个类别出现的概率,然后哪个概率最大,这个分类项就是那个类别。
    当然,这个概率获得才是NB的核心。一般我们需要一个训练样本集,统计一下条件概率估计,然后如果每个条件对概率的影响互相不相关,我们就可以算出测试集中某一个样本的各类别概率,从而顺利分类了。朴素贝叶斯一个很重要的点就是每个条件对概率的影响互相不相关。然而这个在现实中几乎不可能,所以贝叶斯分类又有了新的成员:贝叶斯网络。类似决策树(不过这个树是事先确定而不是训练),贝叶斯在每个子叶片上(全部特征区分后的)计算概率,然后用这个概率作为测试集中某一个样本按照条件走下来之后的概率。 贝叶斯网络比朴素贝叶斯更复杂,而想构造和训练出一个好的贝叶斯网络更是异常艰难。但是贝叶斯网络是模拟人的认知思维推理模式,用一组条件概率函数以及有向无环图对不确定性的因果推理关系建模,因此其具有更高的实用价值。
    贝叶斯网络要首先确定随机变量之间的拓扑结构。这也是一个容易出问题的环节。

    1.1.4 支持向量机(SVM)

    这才是重头戏嘛!偷别人一张图说明下:
    这里写图片描述
    c1,c2分别是两个类,如何把这两个类区分开呢?就是在中间画条线(废话)
    不过这个线其实很有讲究,画在哪里,角度如何呢?
    这就是svm算法所研究的核心,核心思想是:让最近的样本点距离这个超平面最远(有点小绕)。那么,我们就有了目标函数:min(样本点i到超平面的距离)。
    然后我们改变超平面的参数(这图上是线性的,就只有k,b两个),创造很多超平面,得到max(min(样本点i到超平面j的距离))。
    这是一个凸二次规划问题,用拉格朗日对偶法可以解得。网上很多求解过程,看着都累,就不搬上来了,自己搜搜看。当这种方法可以区分的比较好,但是有异常点怎么办呢?svm算法引入了松弛变量的概念,给这个线性超平面一个可以改变的偏置,下面的点只要在这个偏置最大的时候被分类就可以,上面同理。当然,在计算超平面的时候,也要保证这个松弛变量尽量小。(SMO算法)
    当样本完全线性不可分的时候怎么办呢?SVM又引入了一个概念:核函数。在我的理解例,核函数就是一个映射,把线性不可分的样本映射到一个线性可分的坐标系中,然后再用线性可分的方法来区分。核函数一般有多项式核和高斯核,除了特殊情况,一般高斯核被使用的最多,因为比较灵活啦。。
    感觉也没啥好说的,不过好像蛮重要的诶,说一下python实现的思路:

    from numpy import * 
    
    def loadDataSet(filename): #读取数据
        dataMat=[]
        labelMat=[]
        fr=open(filename)
        for line in fr.readlines():
            lineArr=line.strip().split(' ')
            dataMat.append([float(lineArr[0]),float(lineArr[1])])
            labelMat.append(float(lineArr[2]))
        return dataMat,labelMat #返回数据特征和数据类别
    
    def selectJrand(i,m): #在0-m中随机选择一个不是i的整数
        j=i
        while (j==i):
            j=int(random.uniform(0,m))
        return j
    
    def clipAlpha(aj,H,L):  #保证a在L和H范围内(L <= a <= H)
        if aj>H:
            aj=H
        if L>aj:
            aj=L
        return aj
    
    def kernel(X, A, kTup): #核函数,输入参数,X:支持向量的特征树;A:某一行特征数据;kTup:('lin',k1)核函数的类型和参数
        m,n = shape(X)
        K = mat(zeros((m,1)))
        if kTup[0]=='lin': #线性函数
            K = X * A.T
        elif kTup[0]=='rbf': # 径向基函数(radial bias function)
            for j in range(m):
                deltaRow = X[j,:] - A
                K[j] = deltaRow*deltaRow.T
            K = exp(K/(-1*kTup[1]**2)) #返回生成的结果
        return K
    
    
    #定义类,方便存储数据
    class optStruct:
        def __init__(self,dataMatIn, classLabels, C, toler, kTup):  # 存储各类参数
            self.X = dataMatIn  #数据特征
            self.labelMat = classLabels #数据类别
            self.C = C #软间隔参数C,参数越大,非线性拟合能力越强
            self.tol = toler #停止阀值
            self.m = shape(dataMatIn)[0] #数据行数
            self.alphas = mat(zeros((self.m,1)))
            self.b = 0 #初始设为0
            self.eCache = mat(zeros((self.m,2))) #缓存
            self.K = mat(zeros((self.m,self.m))) #核函数的计算结果
            for i in range(self.m):
                self.K[:,i] = kernel(self.X, self.X[i,:], kTup)
    
    
    def calcEk(oS, k): #计算Ek
        fXk = float(multiply(oS.alphas,oS.labelMat).T*oS.K[:,k] + oS.b)
        Ek = fXk - float(oS.labelMat[k])
        return Ek
    
    #随机选取aj,并返回其E值
    def selectJ(i, oS, Ei):
        maxK = -1
        maxDeltaE = 0
        Ej = 0
        oS.eCache[i] = [1,Ei]
        validEcacheList = nonzero(oS.eCache[:,0].A)[0]  #返回矩阵中的非零位置的行数
        if (len(validEcacheList)) > 1:
            for k in validEcacheList:
                if k == i:
                    continue
                Ek = calcEk(oS, k)
                deltaE = abs(Ei - Ek)
                if (deltaE > maxDeltaE): #返回步长最大的aj
                    maxK = k
                    maxDeltaE = deltaE
                    Ej = Ek
            return maxK, Ej
        else:
            j = selectJrand(i, oS.m)
            Ej = calcEk(oS, j)
        return j, Ej
    
    
    def updateEk(oS, k): #更新os数据
        Ek = calcEk(oS, k)
        oS.eCache[k] = [1,Ek]
    
    #首先检验ai是否满足KKT条件,如果不满足,随机选择aj进行优化,更新ai,aj,b值
    def innerL(i, oS): #输入参数i和所有参数数据
        Ei = calcEk(oS, i) #计算E值
        if ((oS.labelMat[i]*Ei < -oS.tol) and (oS.alphas[i] < oS.C)) or ((oS.labelMat[i]*Ei > oS.tol) and (oS.alphas[i] > 0)): #检验这行数据是否符合KKT条件 参考《统计学习方法》p128公式7.111-113
            j,Ej = selectJ(i, oS, Ei) #随机选取aj,并返回其E值
            alphaIold = oS.alphas[i].copy()
            alphaJold = oS.alphas[j].copy()
            if (oS.labelMat[i] != oS.labelMat[j]): 
                L = max(0, oS.alphas[j] - oS.alphas[i])
                H = min(oS.C, oS.C + oS.alphas[j] - oS.alphas[i])
            else:
                L = max(0, oS.alphas[j] + oS.alphas[i] - oS.C)
                H = min(oS.C, oS.alphas[j] + oS.alphas[i])
            if L==H:
                print("L==H")
                return 0
            eta = 2.0 * oS.K[i,j] - oS.K[i,i] - oS.K[j,j] 
            if eta >= 0:
                print("eta>=0")
                return 0
            oS.alphas[j] -= oS.labelMat[j]*(Ei - Ej)/eta 
            oS.alphas[j] = clipAlpha(oS.alphas[j],H,L) 
            updateEk(oS, j)
            if (abs(oS.alphas[j] - alphaJold) < oS.tol): 
                print("j not moving enough")
                return 0
            oS.alphas[i] += oS.labelMat[j]*oS.labelMat[i]*(alphaJold - oS.alphas[j])
            updateEk(oS, i) #更新数据
            b1 = oS.b - Ei- oS.labelMat[i]*(oS.alphas[i]-alphaIold)*oS.K[i,i] - oS.labelMat[j]*(oS.alphas[j]-alphaJold)*oS.K[i,j]
            b2 = oS.b - Ej- oS.labelMat[i]*(oS.alphas[i]-alphaIold)*oS.K[i,j]- oS.labelMat[j]*(oS.alphas[j]-alphaJold)*oS.K[j,j]
            if (0 < oS.alphas[i]<oS.C):
                oS.b = b1
            elif (0 < oS.alphas[j]<oS.C):
                oS.b = b2
            else:
                oS.b = (b1 + b2)/2.0
            return 1
        else:
            return 0
    
    
    #SMO函数,用于快速求解出alpha
    def smoP(dataMatIn, classLabels, C, toler, maxIter,kTup=('lin', 0)): #输入参数:数据特征,数据类别,参数C,阀值toler,最大迭代次数,核函数(默认线性核)
        oS = optStruct(mat(dataMatIn),mat(classLabels).transpose(),C,toler, kTup)
        iter = 0
        entireSet = True
        alphaPairsChanged = 0
        while (iter < maxIter) and ((alphaPairsChanged > 0) or (entireSet)):
            alphaPairsChanged = 0
            if entireSet:
                for i in range(oS.m): #遍历所有数据
                    alphaPairsChanged += innerL(i,oS)
                    print("fullSet, iter: %d i:%d, pairs changed %d" % (iter,i,alphaPairsChanged)) #显示第多少次迭代,那行特征数据使alpha发生了改变,这次改变了多少次alpha
                iter += 1
            else:
                nonBoundIs = nonzero((oS.alphas.A > 0) * (oS.alphas.A < C))[0]
                for i in nonBoundIs: #遍历非边界的数据
                    alphaPairsChanged += innerL(i,oS)
                    print("non-bound, iter: %d i:%d, pairs changed %d" % (iter,i,alphaPairsChanged))
                iter += 1
            if entireSet:
                entireSet = False
            elif (alphaPairsChanged == 0):
                entireSet = True
            print("iteration number: %d" % iter)
        return oS.b,oS.alphas
    
    def testRbf(data_train,data_test):
        dataArr,labelArr = loadDataSet(data_train) #读取训练数据
        b,alphas = smoP(dataArr, labelArr, 200, 0.0001, 10000, ('rbf', 1.3)) #通过SMO算法得到b和alpha
        datMat=mat(dataArr)
        labelMat = mat(labelArr).transpose()
        svInd=nonzero(alphas)[0]  #选取不为0数据的行数(也就是支持向量)
        sVs=datMat[svInd] #支持向量的特征数据
        labelSV = labelMat[svInd] #支持向量的类别(1或-1)
        print("there are %d Support Vectors" % shape(sVs)[0]) #打印出共有多少的支持向量
        m,n = shape(datMat) #训练数据的行列数
        errorCount = 0
        for i in range(m):
            kernelEval = kernel(sVs,datMat[i,:],('rbf', 1.3)) #将支持向量转化为核函数
            predict=kernelEval.T * multiply(labelSV,alphas[svInd]) + b  #这一行的预测结果,注意最后确定的分离平面只有那些支持向量决定。
            if sign(predict)!=sign(labelArr[i]): #sign函数 -1 if x < 0, 0 if x==0, 1 if x > 0
                errorCount += 1
        print("the training error rate is: %f" % (float(errorCount)/m)) #打印出错误率
        dataArr_test,labelArr_test = loadDataSet(data_test) #读取测试数据
        errorCount_test = 0
        datMat_test=mat(dataArr_test)
        labelMat = mat(labelArr_test).transpose()
        m,n = shape(datMat_test)
        for i in range(m): #在测试数据上检验错误率
            kernelEval = kernel(sVs,datMat_test[i,:],('rbf', 1.3))
            predict=kernelEval.T * multiply(labelSV,alphas[svInd]) + b
            if sign(predict)!=sign(labelArr_test[i]):
                errorCount_test += 1
        print("the test error rate is: %f" % (float(errorCount_test)/m))
    
    #主程序
    def demo1():
        filename_traindata='C:\\Users\\Administrator\\Desktop\\data\\traindata.txt'
        filename_testdata='C:\\Users\\Administrator\\Desktop\\data\\testdata.txt'
        testRbf(filename_traindata,filename_testdata)
    
    if __name__=='__main__':
        demo1()

    代码来源:https://blog.csdn.net/csqazwsxedc/article/details/71513197(代码比较容易看懂)
    总觉得要买一本《统计学习方法》呀,等找完工作再处理这些事情(希望能找到)

    1.2 聚类

    接下来说无监督的模式识别,也就是聚类。
    聚类最著名,经典的应该就是k-means了,其他还有DBSCAN(基于密度)、CLIQUE(基于网络)、FCM(模糊c均值)等等等等,太多了,先说k-means,其他后面看心情吧,反正又不搞数据挖掘(目前),再说再说

    1.2.1 k-means算法

    k-means是一种基于距离聚类的算法。
    k-means的算法核心思想是:
    1.先选择k个点作为质心;
    2.再把每个点指派到距离最近的质心,每进行一次,都重新计算一次每个簇的质心;
    一直到簇的质心不发生变化或者达到最大迭代次数为止。
    这个算法有一个很重要的问题,就是k值怎么定,k个质心选在哪里。
    k值的话,对于可以确定K值不会太大但不明确精确的K值的场景,可以进行迭代运算,然后找出代价函数最小时所对应的K值,这个值往往能较好的描述有多少个簇类。 (不过,也不是最小的时候对应的k值最好,当代价函数下降的不明显时,就可以选择那个k值(肘部法则))
    此外,还有用层次聚类方法预估计k值的,用canopy算法进行初始划分的,在这里先不仔细提。(简单说一下,canopy算法是先将相似的对象放到一个子集中,canopy可以互相重叠;对每个canopy可以使用传统的聚类。)
    还有的方法是选取小样本(比如10000个中选取1000个)来预估计k值和质心的位置,目的都是一样,减少聚类时的计算量并优化结果(Mini Batch k-Means)。
    对于初始质心的选取,最常见的就是随机,多次取,找到最好的值。这种策略简单,但计算量大,取决于数据集和簇的个数。
    还有就是在取小样本的时候,可以用随机选一个点,然后选离重心最远的点作为下一个质点;然后再重复到合适位置。
    还有一个方法,就是用层次聚类的方法提取几个簇,作为初始质心。当样本较小,且k值相对较小的时候才合适。
    当然,用canopy算法也可以。。
    k-means算法的优点在于,原理简单,超参只有一个k值,调节简单;扩展性强。速度还可以。
    缺点在于,对k值太敏感,对初始质心位置敏感,对离群点敏感;当样本量大,时间开销非常大;不能处理所有类型的簇。
    改进型有各种,比如bisecting K-means(二分k均值); K-modes;K-prototype等。。这里就不列举了。。

    1.2.2 DBSCAN

    1.首先确定半径r和minPoints. 从一个没有被访问过的任意数据点开始,以这个点为中心,r为半径的圆内包含的点的数量是否大于或等于minPoints,如果大于或等于minPoints则改点被标记为central point,反之则会被标记为noise point。
    2.重复1的步骤,如果一个noise point存在于某个central point为半径的圆内,则这个点被标记为边缘点,反之仍为noise point。重复步骤1,知道所有的点都被访问过。
    优点:不需要知道簇的数量;可以发现任何形状的簇;可以找出异常点。
    缺点:需要确定距离r和minPoints,调参较为复杂;如果簇间密度不同,不合适;样本集太大时,收敛时间较长。

    1.2.3 CLIQUE

    CLIQUE是基于网格的聚类算法。首先先以一个步长(参数1)分割整个域,然后扫描每个网格内的样本数目,判断是否是密集网格(阈值:参数2)。
    然后就把聚类问题化简为类似空间内求01连通域问题,每一个联通域就是一个簇。
    优点:高效;单遍数据扫描就可以完成目的。
    缺点;两个参数,调参较为复杂;对不同密度的簇不合适;对于高维空间,效果会很不好。

    1.2.4 基于GMM的EM聚类

    GMM首先假设了数据点是呈高斯分布的,就像K-means假定数据点是圆分布。高斯分布是椭圆的,所以要更灵活一些。
    要做聚类就要找到样本的均值和标准差,这时采用EM算法,过程是:
    1. 首先选择簇的数量并随机初始化每个簇的高斯分布参数(期望和方差)。也可以先观察数据给出一个相对精确的均值和方差。
    2. 给定每个簇的高斯分布,计算每个数据点属于每个簇的概率。一个点越靠近高斯分布的中心就越可能属于该簇。
    3. 基于这些概率我们计算高斯分布参数使得数据点的概率最大化,可以使用数据点概率的加权来计算这些新的参数,权重就是数据点属于该簇的概率。
    4. 重复迭代2和3直到在迭代中的变化不大。
    GMMs的优点:GMMs使用均值和标准差,簇可以呈现出椭圆形而不是仅仅限制于圆形;GMMs是使用概率,所有一个数据点可以属于多个簇。例如数据点X可以有百分之20的概率属于A簇,百分之80的概率属于B簇。
    行了行了 又说多了,本来想说图像检测的东西来着,一搞模式识别说了一大堆。。模式识别还有很多其他的方式,比如层次识别啊 模糊均值啊 请大家动动手指去百度吧(其实我有些也是百度来的,发出来是为了让自己更有印象)
    图像检测下一节总结!

    展开全文
  • http://blog.csdn.net/wishchin/article/details/44559329 http://www.cnblogs.com/dongsheng/articles/2793134.html ... 记录下有意思的题 1、循环变量不能声明为unsigned 型,因为当其为0...
  • 转载文章仅供学习之用,如有侵权,请联系我删除文章。(邮箱:eric_wangyz@foxmail.com)
  • 既然学了模式识别这个专业,研究生期间主要方向是机器学习,计算机视觉,图像处理。所以很想了解现在这个领域的就业方向及相关要求。 今天在“增强视觉 | 计算机视觉 增强现实”上看到一则招聘智能图像/视频处理...
  • 最近一直研究图像处理与模式识别的问题,通过同高手的交流,结合牛人的指点,现把自己的感受和体会跟大家分享,尤其是目标检测与识别这一块,如有不对的地方,希望高手指点一下!   如果有读关于目标检测和识别...
  • (1) IEEE Transactions on Pattern Analysis and Machine Intelligence,IEEE模式分析机器智能汇刊,简称PAMI,是IEEE最重要的学术性汇刊之一。 (2) ACM Transactions on Graphics,美国计算机协会图形汇刊,简称...
  • 虽然考试都结束了,手头还是累积了不少活儿要补,不多写了,晒个小项目,之前一直做的,后来当做模式识别课程的大作业交了。 大体框架如下: 还是之前的火灾检测,但是在一些简单的颜色、运动检测的基础上增加...
  • 图像处理是将输入图像转换为输出图像的过程,人是图像处理的效果的最终解释者; 在计算机视觉中,计算机是图像的解释者;图像处理仅仅是计算机视觉系统中的一个模块; 计算机图形学的主要工作是从三维描述到二维...
  • 图像模式识别的方法

    2015-07-05 12:24:17
    图像模式识别的方法很多,从图像模式识别提取的特征对象来看,图像识别方法可分为以下几种:基于形状特征的识别技术、基于色彩特征的识别技术以及基于纹理特征的识别技术。其中,基于形状特征的识别方法,其关键是...
  • 图像处理与识别

    2016-07-01 08:45:03
    图像处理与识别学习小结   数字图像处理是对图像进行分析、加工、和处理,使其满足视觉、心理以及其他要求的技术。图像处理是信号处理在图像域上的一个应用。目前大多数的图像是以数字形式存储,因而图像处理很多...
  • 图像处理与识别学习小结   数字图像处理是对图像进行分析、加工、和处理,使其满足视觉、心理以及其他要求的技术。图像处理是信号处理在图像域上的一个应用。目前大多数的图像是以数字形式存储,因而图像处理很多...
  • 学过了数字图像处理,就进行一个综合性强的小项目来巩固一下知识吧。前阵子编写调试了一套基于MATLAB的车牌识别的项目的代码。今天又重新改进了一下代码,识别的效果好一点了,也精简了一些代码。这里没有使用神经...
  • 图像处理(Image Processing) 对已有的图像进行变换、分析、重构,得到的仍是图像。 模糊、灰度化、增强对比度; 加滤镜; 腐蚀,膨胀。 增强现实(AR)——它既需要 CG...
  • 深度学习识别与定位的应用: http://www.cnblogs.com/jianzhitanqiao/p/5550344.html
  • 学习了计算机视觉方向有段时间了,整理一下一些基本的概念: 1.计算机图形学 计算机图形学是给定关于景象结构、表面反射特性、光源配置及相机模型的信息,生成图像,...模式识别则是从特征空间到类别空间的变换。研究内
1 2 3 4 5 ... 20
收藏数 85,518
精华内容 34,207