2019-06-11 13:43:28 qxqxqzzz 阅读数 61
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    31058 人正在学习 去看看 张中强

1、OCR识别和字符切分算法改进;

2、图像处理算法研究。

 

 

1,连通域 腐蚀 膨胀定义、原理

 

2,gd sgd bgd:原理 区别

3,c++ 和 python 的区别

4,如何解决过拟合问题(训练集上表现好,测试集表现差)

5,图像处理算法与机器学习,非机器学习图像处理

6,ocr识别算法与机器学习,非机器学习ocr识别

7,字符切分算法与机器学习,非机器学习字符切分

8,

2011-04-12 13:48:00 sandy7 阅读数 1407
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    31058 人正在学习 去看看 张中强

第七届SPIE多谱图像处理与模式识别国际学术会议征文通知

2011114~116   中国·桂林

多谱图像处理与模式识别国际学术会议是国际光学工程学会(SPIE)与中国联合组织的国际学术会议,已成功召开了六届(1998.武汉;2001.武汉;2003.北京;2005.武汉;2007.武汉;2009.宜昌),成为SPIE在我国举办的规模最大的国际会议。继第六届会议在宜昌取得圆满成功之后,第七届SPIE多谱图像处理与模式识别国际学术会议计划于201111月在桂林举行。大会将为从事多谱图像处理与模式识别领域研究的专家、教授、工程技术人员和研究生提供一个相互学习和交流的国际性论坛。为了提高会议的学术水平,会议将特邀国内外知名专家就本领域前沿作专题报告。大会工作语言为英语,议论文集将由美国SPIE正式出版,并将被EIISTP检索,欢迎大家积极投稿,参加会议。

征文范围(包括但不局限于)


1.     多谱图像获取

§   红外成像

§   微波成像

§   雷达和激光雷达成像

§   超声波成像

§   多谱与高光谱成像

§   医学成像

§   偏振光成像

§   液晶成像

§   微纳成像

§   单光子成像

§   超快成像

2.     多谱图像处理与分析

§   图像滤波

§   图像压缩

§   图像编码

§   数字水印

§   微波图像处理

§   雷达和激光雷达图像处理

§   超声波图像处理

§   多谱与高光谱图像处理

§   小波与分形分析

3.     自动目标识别与导航

§   边缘检测

§   图像分割

§   目标识别与跟踪

§   图像序列分析

§   弱小目标检测

§   图像特征提取

§   图像导航

4.     模式识别与计算机视觉

§   模式分类

§   神经网络

§   机器视觉

§   数据融合与挖掘

§   图像匹配

§   3D建模与重建

5.     图像并行处理和优化技术

§   并行算法和结构

§   智能算法

§   仿生算法

§   神经计算

§   优化方法和技术

6.     医学图像处理

§   医学图像处理和分析

§   医学图像可视化

§   医学图像引导手术

§   医学图像虚拟现实

§   计算机辅助医疗系统

7.     遥感图像处理与地理信息系统

§   遥感图像预处理

§   高光谱图像处理

§   遥感图像融合

§   地理信息系统

§   图像检索

8.     应用

§   智能视频监控

§   工业检测

§   环境监测

§   文化遗产保护

§   生物特征识别

§   其他应用

 


重要日期:

论文摘要截止时间:2011510

通知摘要接收时间2011615

正式论文截止时间:2011815

论文摘要格式(Summary):

Title of Conference:(See 1-8 above)

Paper title:

Authors and Institution:

Corresponding author:

Purpose:

Methods:

Results:

Conclusions:

Resume:(less than 150 words)

论文摘要提交须知:

登陆http://iprai.hust.edu.cn/mippr通过相应的链接进入SPIE官方网站,或直接登陆SPIE官方网站http://spie.org注册后进行投稿。投稿时请慎重选择八个主题之一并仅向该主题投稿,切忌一稿多投,否则稿件视为无效。

SPIE为了保证会议论文质量,要求仅能收录10篇以硕士研究生为第一作者的文章,所以,本次会议原则上不接收以硕士研究生为第一作者的文章(特别优秀的除外,但在投稿时务必注明)。

 

会议组委会联系方式:

1、 邮寄地址:武汉华中科技大学科技楼902室图像识别与人工智能研究所MIPPR 2011秘书处 [邮编430074]  联系人:张发雄

2、 电话:+86-27-87540131         传真:+86-27-87540131

3、 Emailmippr@126.com

4、 大会网址:http://iprai.hust.edu.cn/mippr/(教育网)  

 

第七届SPIE多谱图像处理与模式识别国际学术会议组委会

2019-02-10 21:19:07 qq_43679627 阅读数 575
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    31058 人正在学习 去看看 张中强
                     
 

kmeans之于模式识别,如同“hello world”之于C、之于任何一门高级语言。

算法的规格(specification)

在聚类问题(一般非监督问题)中,给定训练样本X={x(1),x(2),,x(N)}
matlab计算程序:

J_cur = sum(sum((X - C(label, :)).^2, 2));
  • 1

这里写图片描述

效果图

这里写图片描述

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

2019-06-20 09:17:20 ShuYunBIGDATA 阅读数 267
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    31058 人正在学习 去看看 张中强

根据亚马逊官方的说法, Amazon Go是技术创新的成果,无人便利店内应用了计算机视觉、深度学习算法,无线射频识别、图像分析和感测融合等多种技术,原理类似于无人驾驶。

那么下边就介绍一下计算机视觉与图像处理、模式识别、机器学习之间的关系。

要实现计算机视觉必须有图像处理的帮助,而图像处理倚仗与模式识别的有效运用,而模式识别是人工智能领域的一个重要分支,人工智能与机器学习密不可分。纵观一切关系,发现计算机视觉的应用服务于机器学习,各个环节缺一不可,相辅相成。

 

计算机视觉

 


计算机视觉(computer vision):用计算机来模拟人的视觉机理获取和处理信息的能力。就是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,用电脑处理成为更适合人眼观察或传送给仪器检测的图像。

计算机视觉研究相关的理论和技术,试图建立能够从图像或者多维数据中获取'信息'的人工智能系统。计算机视觉的挑战是要为计算机和机器人开发具有与人类水平相当的视觉能力。

机器视觉需要图象信号,纹理和颜色建模,几何处理和推理,以及物体建模。一个有能力的视觉系统应该把所有这些处理都紧密地集成在一起。

 

图像处理

 


图像处理(image processing):用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。

 图像处理一般指数字图像处理。数字图像是指用数字摄像机、扫描仪等设备经过采样和数字化得到的一个大的二维数组,该数组的元素称为像素,其值为一整数,称为灰度值。

图像处理技术的主要内容包括图像压缩,增强和复原,匹配、描述和识别3个部分。常见的处理有图像数字化、图像编码、图像增强、图像复原、图像分割和图像分析等。

 

模式识别

 


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

模式识别又常称作模式分类,从处理问题的性质和解决问题的方法等角度,模式识别分为有监督的分类(Supervised Classification)和无监督的分类(Unsupervised Classification)两种。模式还可分成抽象的和具体的两种形式。前者如意识、思想、议论等,属于概念识别研究的范畴,是人工智能的另一研究分支。我们所指的模式识别主要是对语音波形、地震波、心电图、脑电图、图片、照片、文字、符号、生物传感器等对象的具体模式进行辨识和分类。
模式识别研究主要集中在两方面:
一是研究生物体(包括人)是如何感知对象的,属于认识科学的范畴;
二是在给定的任务下,如何用计算机实现模式识别的理论和方法

应用计算机对一组事件或过程进行辨识和分类,所识别的事件或过程可以是文字、声音、图像等具体对象,也可以是状态、程度等抽象对象。这些对象与数字形式的信息相区别,称为模式信息。

模式识别与统计学、心理学、语言学、计算机科学、生物学、控制论等都有关系。它与人工智能、图像处理的研究有交叉关系。

 

 

机器学习

 


机器学习(Machine Learning)是研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域,它主要使用归纳、综合而不是演绎。

机器学习在人工智能的研究中具有十分重要的地位。一个不具有学习能力的智能系统难以称得上是一个真正的智能系统,但是以往的智能系统都普遍缺少学习的能力。随着人工智能的深入发展,这些局限性表现得愈加突出。正是在这种情形下,机器学习逐渐成为人工智能研究的核心之一。它的应用已遍及人工智能的各个分支,如专家系统、自动推理、自然语言理解、模式识别、计算机视觉、智能机器人等领域。

机器学习的研究是根据生理学、认知科学等对人类学习机理的了解,建立人类学习过程的计算模型或认识模型,发展各种学习理论和学习方法,研究通用的学习算法并进行理论上的分析,建立面向任务的具有特定应用的学习系统。这些研究目标相互影响相互促进。

 

人类研究计算机的目的,是为了提高社会生产力水平,提高生活质量,把人从单调复杂甚至危险的工作中解救出来。今天的计算机在计算速度上已经远远超过了人,然而在很多方面,特别是在人类智能活动有关的方面例如在视觉功能、听觉功能、嗅觉功能、自然语言理解能力功能等等方面,还不如人。

这种现状无法满足一些高级应用的要求。例如,我们希望计算机能够及早地发现路上的可疑情况并提醒汽车驾驶员以避免发生事故,我们更希望计算机能帮助我们进行自动驾驶,目前的技术还不足以满足诸如此类高级应用的要求,还需要更多的人工智能研究成果和系统实现的经验。

 

人工智能

 


人工智能,是由人类设计并在计算机环境下实现的模拟或再现某些人智能行为的技术。一般认为,人类智能活动可以分为两类:感知行为与思维活动。模拟感知行为的人工智能研究的一些例子包括语音识别、话者识别等与人类的听觉功能有关的"计算机听觉",物体三维表现的形状知识、距离、速度感知等与人类视觉有关的"计算机视觉",等等。模拟思维活动的人工智能研究的例子包括符号推理、模糊推理、定理证明等与人类思维有关的"计算机思维",等等。

 

从图像处理和模式识别发展起来的计算机视觉研究对象之一是如何利用二维投影图像恢复三维景物世界。计算机视觉使用的理论方法主要是基于几何、概率和运动学计算与三维重构的视觉计算理论,它的基础包括射影几何学、刚体运动力学、概率论与随机过程、图像处理、人工智能等理论。
计算机视觉要达到的基本目的有以下几个:
(1) 根据一幅或多幅二维投影图像计算出观察点到目标物体的距离;
(2) 根据一幅或多幅二维投影图像计算出目标物体的运动参数;
(3) 根据一幅或多幅二维投影图像计算出目标物体的表面物理特性;
(4) 根据多幅二维投影图像恢复出更大空间区域的投影图像。

计算机视觉要达到的最终目的是实现利用计算机对于三维景物世界的理解,即实现人的视觉系统的某些功能。

在计算机视觉领域里,医学图像分析、光学文字识别对模式识别的要求需要提到一定高度。又如模式识别中的预处理和特征抽取环节应用图像处理的技术;图像处理中的图像分析也应用模式识别的技术。在计算机视觉的大多数实际应用当中,计算机被预设为解决特定的任务,然而基于机器学习的方法正日渐普及,一旦机器学习的研究进一步发展,未来"泛用型"的电脑视觉应用或许可以成真。

人工智能所研究的一个主要问题是:如何让系统具备"计划"和"决策能力"?从而使之完成特定的技术动作(例如:移动一个机器人通过某种特定环境)。这一问题便与计算机视觉问题息息相关。在这里,计算机视觉系统作为一个感知器,为决策提供信息。另外一些研究方向包括模式识别和机器学习(这也隶属于人工智能领域,但与计算机视觉有着重要联系),也由此,计算机视觉时常被看作人工智能与计算机科学的一个分支。

机器学习是研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域,它主要使用归纳、综合而不是演译。
        为了达到计算机视觉的目的,有两种技术途径可以考虑。
         第一种是仿生学方法,即从分析人类视觉的过程入手,利用大自然提供给我们的最好参考系--人类视觉系统,建立起视觉过程的计算模型,然后用计算机系统实现之。
        第二种是工程方法,即脱离人类视觉系统框框的约束,利用一切可行和实用的技术手段实现视觉功能。此方法的一般做法是,将人类视觉系统作为一个黑盒子对待,实现时只关心对于某种输入,视觉系统将给出何种输出。

这两种方法理论上都是可以使用的,但面临的困难是,人类视觉系统对应某种输入的输出到底是什么,这是无法直接测得的。而且由于人的智能活动是一个多功能系统综合作用的结果,即使是得到了一个输入输出对,也很难肯定它是仅由当前的输入视觉刺激所产生的响应,而不是一个与历史状态综合作用的结果。

        不难理解,计算机视觉的研究具有双重意义。

其一,是为了满足人工智能应用的需要,即用计算机实现人工的视觉系统的需要。这些成果可以安装在计算机和各种机器上,使计算机和机器人能够具有"看"的能力。

其二,视觉计算模型的研究结果反过来对于我们进一步认识和研究人类视觉系统本身的机理,甚至人脑的机理,也同样具有相当大的参考意义。

 

END

碧茂课堂精彩课程推荐:

1.Cloudera数据分析课;

2.Spark和Hadoop开发员培训;

3.大数据机器学习之推荐系统;

4.Python数据分析与机器学习实战;

详情请关注我们公众号:碧茂大数据-课程产品-碧茂课堂

现在注册互动得海量学币,大量精品课程免费送!

2018-08-31 12:55:08 dimei0938 阅读数 926
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    31058 人正在学习 去看看 张中强

在谈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簇。
行了行了 又说多了,本来想说图像检测的东西来着,一搞模式识别说了一大堆。。模式识别还有很多其他的方式,比如层次识别啊 模糊均值啊 请大家动动手指去百度吧(其实我有些也是百度来的,发出来是为了让自己更有印象)
图像检测下一节总结!

统计模式识别

阅读数 7475

没有更多推荐了,返回首页