当前位置: 首页 > news >正文

模式识别+Matlab 最大似然分类(MLC)【贝叶斯(Bayes)分类法】

最近(2020/6/14)模式识别课程 老师让用最大似然分类法对一个遥感影像进行分类,在CSDN 上有很多大佬都写过类似的文章,本人阅读之后,犹如醍醐灌顶,对这些大佬们的钦佩之情犹如绵绵江水滔滔不绝。此篇博客就简单记录一下 这段时间对MLC 的学习,希望可以帮助到大家。


一、预备知识

关于MLC,百度百科 中,最大似然分类(MaximumLikelihood Classification )被定义为 在两类或多类判决中,用统计方法根据最大似然比贝叶斯判决准则法建立非线性判别函数集,假定各类分布函数为正态分布,并选择训练区,计算各待分类样区的归属概率,而进行分类的一种图像分类方法。 其又称为贝叶斯(Bayes)分类法,是根据Bayes准则对遥感影像进行分类的。

1. 一篇大佬的博客

下面是 liangdas(CSDN博主)对MLC 的一些介绍,我觉得挺好的,就摘抄下来了,其中缺失部分也做了一些补充。

原文链接:https://blog.csdn.net/liangdas/article/details/19294951

前言:

最小距离分类法只考虑了待分类样本到各个类别中心的距离,而没有考虑已知样本的分布,所以它的分类速度快,但精度不高。今天要介绍的是另外一种分类方法——最大似然分类法,它也是分类里面用得很多的一种分类方法,它在分类的时候,不仅考虑了待分类样本到已知类别中心的距离,而且还考虑了已知类别的分布特征,所以其分类精度比最小距离分类法要高。

下面有一个图,黄色所示类别A的分布,蓝色是类别B的分布,类别A和B的类别中心都红色的点表示出来了,那么有一个未知类别的样本p,假设p到类别A的距离是Ap,到类别B的距离是Bp,现在Ap=Bp,那么如果用最小距离分类法,我们是不能判断样本p到底是属于A类还是B类的,所以这就是最小距离分类法的局限性。
在这里插入图片描述

感性认识:

假设在我们读书的时候,在一个月内,30天,你发现晚上11点以后实验室还亮着灯,你很好奇,每次推门进去,发现这30天内,实验室中不是甲就是乙,或者他们同时都在,你做了统计,是甲的天数是28天,是乙的次数是4天,然后有一天晚上11点,你发现实验室的灯又亮了,你同学问你:“你猜现在是谁在实验室呀?”,你会回答“应该是甲吧”。这其实就是生活中我们利用最大似然来分类的一个例子。

另外一个例子:现在我们有两个盒子:甲和乙,每个里面都装了100个球,其中甲中装了95个红球,5个黑球,乙中装了60个红球,40个黑球,现在有人从盒子里面取出了一个球,发现是红球,然后让你猜:“他是从哪个盒子里面取出来的?”,想必你会猜“甲”吧。

好了,其实我们生活中,已经对最大似然估计有了自己的经验体会,是不是还没有意识到它就是最大似然分类法呢?呵呵。(不是我呵呵的)

基本原理:

假设有两个事件A,B,我们通过先验的知识,知道A发生的条件下,x也发生的概率是P(x|A); B发生的条件下,x也发生的概率是P(X|B),那么,现在有一个事件x发生了,我们能否判断这个事件x是在A条件下,还是在B条件下发生的可能性大些呢?也就是要求出P(A|x)和P(B|x)哪一个最大?对分类问题而言,哪一个概率大,我们就说x属于哪一类。

我们回忆下贝叶斯公式:P(A|B)=P(B|A)*P(A)/P(B)

从贝叶斯公式中我们可以看到,求概率P(A|B)的问题转化成了求P(B|A),P(A)和P(B)的问题,其实里面真正的精华是:概率P(A|B)和P(B|A)的转换。因为通常,我们事先能知道P(A),P(B);或者是P(A)和P(B)在分类问题中是公共的项,可以约去;再或是他们的差异可以忽略不计,所以,要P(A|B)最大,也就是要P(B|A)最大!而对于P(B|A),我们可以从事先已经发生的事件中,通过统计等数学方法计算得到,这样这个分类问题就好解了!我们可以提炼下面的目标函数:
在这里插入图片描述
贝叶斯公式的经典之处就是将后验概率的问题转化成了先验概率的问题!

再回到上面的盒子和白球的问题中,A和B分别代表盒子甲和乙,事件x就是红球发生的概率,我们先验已经知道P(x|A)= 95/100=0.95,P(x|B)=60/100=0.6,我们要求的是P(A|x)和P(B|x),然后比较哪个最大?

P(A|x)= P(A)*P(x|A)/P(x)
P(B|x)= P(B)*P(x|B)/P(x)

对于P(A), P(B),因为我们目前总共只有两个盒子甲和乙,也就是A和B,它们各有一个,所以P(A)=P(B)=1/2=0.5。

对于P(x),因为P(A|x)和P(B|x)的贝叶斯表达式中都有P(x)这一项,所以,P(x)作为公共项,我们可以不考虑。如果硬是想知道它的值,那么因为是随机取一个球,P(x)=(95+60)/(100+100)。
这样我们就可以轻松的知道P(A|x)大,还是P(B|x)大了。
最大似然分类又叫贝叶斯分类。

N 维空间的最大似然分类法原理:

上面的例子中, x都是二项分布的,也就是x的取值只取两个值,通常为0,1,发生或者不发生等,但是在实际问题中,x往往不是服从这么一个简单的二项分布,而很有可能是其他更复杂一些的分布。

在统计学和模式识别中,对某一个待研究的集合,在经验的基础上,我们通常假设它是一个服从正太分布的变量集合,如一群人的身高、某各班级某一科目的考试成绩、某个类别的某一维特征,我们都假定它是服从正态分布的,也叫高斯分布,即用均值 μ \mu μ,和方差 σ \sigma σ来描述的一组样本分布。对一维正态分布,其定义为:

若随机变量 X X X 服从一个位置参数为 μ \mu μ、尺度参数为 σ \sigma σ 的正态分布,记为: X ∼ N ( μ , σ 2 ) X \sim N( \mu , \sigma^2 ) XN(μ,σ2)

则其概率密度函数为 f ( x ) = 1 σ 2 π    e − ( x − μ ) 2 2 σ 2  ⁣ {\displaystyle f(x)={\frac {1}{\sigma {\sqrt {2\pi }}}}\;e^{-{\frac {\left(x-\mu \right)^{2}}{2\sigma ^{2}}}}\!} f(x)=σ2π 1e2σ2(xμ)2

其含义为:变量 x 在此正态分布中出现的概率。

通常,为了描述某一个对象,我们会从这个对象抽象出多个属性,每一个属性代表一个一维空间,多个属性就组成一个多维空间。对于多维空间的中的变量,它也有其正态分布的概率密度函数:(大佬的博客中,这部分有些内容缺失了,我按我的理解补充一下,有可能不是大佬本意)
在这里插入图片描述
上面已经指出了,最大似然分类的目标函数是:
在这里插入图片描述
p(Ci) 通常可以根据已知条件计算得到,或者其区别可以忽略不计。
p(x) 是公共项,所以不用考虑其具体的值。

N 维空间的最大似然分类法的化简:

在这里插入图片描述

2. 一些基础概念

学了模式识别,我都学到了啥?下面列的一些概念是这门课程中涉及到的,有可能与本篇博文讲的东西关联性不是很强。(本来想一下写到这里的,可后来发现要点太多,就另开了一篇博客。)

https://blog.csdn.net/Gou_Hailong/article/details/106747589

有一点,我觉得有必要单独列出来:

模式识别系统设计 / 评价过程
系统评价原则: 为了更好地对模式识别系统性能进行评价,必须使用一组独立于训练集的测试集对系统进行测试。

训练集: 是一个已知样本集,在监督学习方法中,用它来开发出模式分类器。

测试集: 在设计识别和分类系统时没有用过的独立样本集。
在这里插入图片描述

二、着手编程

前面已经提到,最大似然分类又称 Bayes 分类法,是根据 Bayes 则对遥感影像进行分类的。其具体内容是什么呢?请看下面原理部分,我们从头开始。

1. 原理

最大似然分类法将卫星遥感多波段数据的分布当作多维正态分布来构造判别分类函数。其基本思想是:各类的已知像元的数据在平面或空间中构成一定的点群;每一类的每一维数据在自己的数轴上形成一个正态分布,该类的多维数据就构成该类的一个多维正态分布,有了各类的多维分布模型,对于任何一个未知类别的数据向量,都可反过来求它属于各类的概率;比较这些概率的大小,看属于哪一类的概率大,就把这个数据向量或这个像元归为该类。

基于该基本思想,我们有如下步骤(由于这里用到的数据有可能不是各位人手都有的,所以权当我抛砖引玉,这里就当是看一个对遥感影像进行分类的例子吧):

首先先介绍一下实验数据:实验数据是 191 Band Hyperspectral Image: HYDICE image of Washington DC Mall (Dcmall),测试数据集,训练数据集。也就是一张191波段的 16位 的高光谱图像,还有两个已经分类好的数据集,所以大家应该知道我为什么要把“模式识别系统设计 / 评价过程”在上面单独列出来了吧😜

1.用 训练数据集 将各类的 类概率密度函数 确定下来。训练数据集中数据被分为了5类:训练grass116.txt、训练path50.txt、训练road110.txt、训练roof431.txt、训练tree49.txt 都被保存在如上的 txt 文件当中,其中后面的数字代表有多少个像素点。

(这里要吐槽一下,本来想直接在这里插公式的,但是看了好多篇博客,从Mathtype 复制粘贴了好多次都没有成功,最终我还是放弃了,有朋友知道怎么解决的 还请指点迷津)

在这里插入图片描述

2. 编程日志

6.14 开始准备相关事宜

6.15 将最大似然法的思路捋顺

6.16 因为matlab基础不牢,求方差卡脖子,费了一下午时间搞清楚了,并发现了之前思路里边的一个小错误:

https://blog.csdn.net/Gou_Hailong/article/details/106788580

6.17 【上午】发现之前想做191个波段的分类完全是异想天开,因为算出来的协方差矩阵太nm离谱 大到没边儿了(求判别函数都是inf)。猜想训练数据集的获得也并不是将191个波段完全考虑的,所以决定用各类方差都比较小的188、190、191这三个波段进行分类。【下午】憨憨,还没归一化。但是归一化之后分类结果都是归成了一类,怎么解?

6.18 今天找到了原因,原来是我个铁憨憨没有改变待分类样本的数据,一直都是对第一个像素点进行的判别。今天没有编程,先写了写论文,洋洋给我了一些启发:用测试样本集计算混淆矩阵来评定其精度,开篇博文介绍了一下混淆矩阵:

https://blog.csdn.net/Gou_Hailong/article/details/106842879

6.19 今天有巨大的突破,多亏了洋洋。混淆矩阵顺利成章做出来了,和洋洋的结果差不多。我想说的大突破是找到了可以表示分类结果的方法:以不同的颜色代表不同的类别,然后按像素点所在的位置将其染色。前提条件是了解怎么用Matlab 来画图(这个画图不是画数学函数曲线,是那种画画),方法加到了之前写的一个博客当中:

https://blog.csdn.net/Gou_Hailong/article/details/106242250

6.20 今天就是扫尾工作了,K 均值法之前写过,只不过将 2 维变 n 维就好了。n维算法也已经补充到了博客:

https://blog.csdn.net/Gou_Hailong/article/details/106027047

3. 源码

慎重考虑,我决定还是不提供源码了,我怕之后有学弟学妹们偷懒+蜂蜜毒药+老师找我喝茶 😨 😨 😨
在这里插入图片描述
为了下次看代码方便,我还是上传一张结构图吧。
在这里插入图片描述

引用/参考 文章

[1] liangdas-CSDN博主:https://blog.csdn.net/liangdas/article/details/19294951
[2] 百度文库:https://wenku.baidu.com/view/12a5de46a8956bec0975e364.html

相关文章:

  • “北斗”知多少?
  • 2坐标格式转换 ∈ C# 编程笔记
  • 1坐标格式转换 ∈ C# 编程笔记
  • 2坐标转换 四参数/七参数/正形变换 ∈ C# 编程笔记
  • 闭合附和导线近似平差 ∈ C# 编程笔记
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • Matlab 各种画图 ∈ Matlab 使用笔记
  • C#一个解决方案创建多个项目
  • 夜光遥感卫星调研
  • 回归拟合中的基本概念和公式汇编(SSE, MSE, RMSE, RMS, STD, 方差, SSR, SST, R-square, Adjusted_R-squ, 相关度)
  • 立方体相册
  • 中国行政单位划分
  • Matlab 画地图之 m_map
  • 火影手游饰品分解
  • 水准网平差
  • $translatePartialLoader加载失败及解决方式
  • 【css3】浏览器内核及其兼容性
  • Angular2开发踩坑系列-生产环境编译
  • ES2017异步函数现已正式可用
  • es6要点
  • javascript 哈希表
  • mysql中InnoDB引擎中页的概念
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • 前端面试总结(at, md)
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 一道闭包题引发的思考
  • 智能网联汽车信息安全
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (十六)串口UART
  • (五)Python 垃圾回收机制
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .net 按比例显示图片的缩略图
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET学习教程二——.net基础定义+VS常用设置
  • .NET中两种OCR方式对比
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • @我的前任是个极品 微博分析
  • [20171113]修改表结构删除列相关问题4.txt
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [AIGC] Redis基础命令集详细介绍
  • [ASP]青辰网络考试管理系统NES X3.5
  • [HEOI2013]ALO
  • [HNOI2006]鬼谷子的钱袋
  • [IDF]啥?
  • [Invalid postback or callback argument]昨晚调试程序时出现的问题,MARK一下
  • [java面试]宇信易诚 广州分公司 java笔试题目回忆录
  • [jquery]this触发自身click事件,当前控件向上滑出
  • [MZ test.16]P2 math 乘方e