单高斯模型(单高斯模型 隐马尔可夫模型 分类)
单高斯模型SGM & 高斯混合模型GMM
在了解高斯混合模型之前,我们先来看看什么是高斯分布,高斯分布大家应该都比较熟悉了,就是我们平时所说的正态分布,也叫高斯分布。正态分布是一个在数学、物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响力。
正态分布的特点
集中性:正态曲线的高峰位于正中央,即均数所在的位置。
对称性:正态曲线以均数为中心,左右对称,曲线两端永远不与横轴相交。
均匀变动性:正态曲线由均数所在处开始,分别向左右两侧逐渐均匀下降。
若随机变量 服从一个数学期望为 、方差为 的正态分布,记为 。其中期望值 决定了其位置,标准差 决定了分布的幅度。当 = 0, = 1时,正态分布是标准正态分布。
正态分布有极其广泛的实际背景, 生产与科学实验中很多随机变量的概率分布都可以近似地用正态分布来描述 。例如,在生产条件不变的情况下,产品的强力、抗压强度、口径、长度等指标;同一种生物体的身长、体重等指标;同一种种子的重量;测量同一物体的误差;弹着点沿某一方向的偏差;某个地区的年降水量;以及理想气体分子的速度分量,等等。一般来说,如果一个量是由许多微小的独立随机因素影响的结果,那么就可以认为这个量具有正态分布(见中心极限定理)。从理论上看,正态分布具有很多良好的性质 ,许多概率分布可以用它来近似;还有一些常用的概率分布是由它直接导出的,例如对数正态分布、t分布、F分布等。
高斯模型有单高斯模型(SGM)和混合高斯模型(GMM)两种。
概率密度函数服从上面的正态分布的模型叫做单高斯模型,具体形式如下:
当样本数据 是一维数据(Univariate)时,高斯模型的概率密度函数为:
其中: 为数据的均值, 为数据的标准差。
当样本数据 是多维数据(Univariate)时,高斯模型的概率密度函数为:
其中: 为数据的均值, 为协方差,d为数据维度。
高斯混合模型(GMM)是单高斯概率密度函数的延伸,就是用多个高斯概率密度函数(正态分布曲线)精确地量化变量分布,是将变量分布分解为若干基于高斯概率密度函数(正态分布曲线)分布的统计模型。
用通俗一点的语言解释就是, 个单高斯模型混合在一起,生成的模型,就是高斯混合模型。这 个子模型是混合模型的隐变量(Hidden variable)。一般来说,一个混合模型可以使用任何概率分布,这里使用高斯混合模型是因为高斯分布具备很好的数学性质以及良好的计算性能。
GMM是工业界使用最多的一种聚类算法。它本身是一种概率式的聚类方法,假定所有的样本数据X由K个混合多元高斯分布组合成的混合分布生成。
高斯混合模型的概率密度函数可以表示为:
其中:
是观察数据属于第 个子模型的概率, ;
是第 个的单高斯子模型的概率密度函数, 或
,具体函数见上方单高斯模型的概率密度函数。
参数估计有多种方法,有矩估计、极大似然法、一致最小方差无偏估计、最小风险估计、同变估计、最小二乘法、贝叶斯估计、极大验后法、最小风险法和极小化极大熵法等。最基本的方法是最小二乘法和极大似然法。
极大似然估计的思想是 :随机试验有多个可能的结果,但在一次试验中,有且只有一个结果会出现,如果在某次试验中,结果w出现了,则认为该结果发生的概率最大。
1)写出似然函数:
假设单个样本的概率函数为 ,对每个样本的概率函数连乘,就可以得到样本的似然函数
2)对似然函数取对数:
目的是为了让乘积变成加法,方便后续运算
3)求导数,令导数为0,得到似然方程:
和 在同一点取到最大值,所以可以通过对 求导,令导数为零,实现同个目的
4)解似然方程,得到的参数即为所求
对于单高斯模型,可以使用极大似然估计(MLE)来求解出参数的值。
单高斯模型的对数似然函数为:
上式分别对 和 求偏导数,然后令其等于0,可以得到对应的参数估计值:
如果依然按照上面的极大似然估计方法求参数
GMM的对数似然函数为:
对上式求各个参数的偏导数,然后令其等于0,并且还需要附件一个条件: 。
我们会发现,直接求导无法计算出参数。所以我们需要用其它方式去解决参数估计问题,一般情况下我们使用的是迭代的方法,用期望最大算法(Expectation Maximization,EM)进行估计。
EM算法的具体原理以及示例见我的另外一篇文章。
高斯模型的具体介绍
混合高斯模型:
运动检测的一般方法
目前,运动物体检测的问题主要分为两类,摄像机固定和摄像机运动。对于摄像机运动的运动物体检测问题,比较著名的解决方案是光流法,通过求解偏微分方程求的图像序列的光流场,从而预测摄像机的运动状态。对于摄像机固定的情形,当然也可以用光流法,但是由于光流法的复杂性,往往难以实时的计算,所以我采用高斯背景模型。因为,在摄像机固定的情况下,背景的变化是缓慢的,而且大都是光照,风等等的影响,通过对背景建模,对一幅给定图像分离前景和背景,一般来说,前景就是运动物体,从而达到运动物体检测的目的。
单分布高斯背景模型
单分布高斯背景模型认为,对一个背景图像,特定像素亮度的分布满足高斯分布,即对背景图像B,(x,y)点的亮度满足: IB(x,y) ~ N(u,d) 这样我们的背景模型的每个象素属性包括两个参数:平均值u 和 方差d。 对于一幅给定的图像G,如果 Exp(-(IG(x,y)-u(x,y))^2/(2*d^2)) T,认为(x,y)是背景点,反之是前景点。 同时,随着时间的变化,背景图像也会发生缓慢的变化,这时我们要不断更新每个象素点的参数 u(t+1,x,y) = a*u(t,x,y) + (1-a)*I(x,y) 这里,a称为更新参数,表示背景变化的速度,一般情况下,我们不更新d(实验中发现更不更新d,效果变化不大)。 高斯混合模型是用于背景提取的方法,OpenCV的cvaux中cvbgfg_gaussmix.cpp文件根据文献An improved adaptive background mixture model for real-time tracking with shadow中提供的方法编写了高斯混合模型函数。其中定义了CvGaussBGModel类用于存放高斯混合模型的各个参数。我用OpenCV使用高斯混合模型函数分以下几步: 1。需要用到icvUpdateGaussianBGModel,icvReleaseGaussianBGModel两个函数,但是源程序中将这两个函数定义为内部函数,需要做一些修改,首先将cvbgfg_gaussmix.cpp中前面两个函数的声明static void CV_CDECL icvReleaseGaussianBGModel( CvGaussBGModel** bg_model ); static int CV_CDECL icvUpdateGaussianBGModel( IplImage* curr_frame, CvGaussBGModel* bg_model );两行代码注释掉。然后在cvbgfg_gaussmix.cpp中间部分两个函数的定义部分,函数头static int和static void改成CV_IMPL int 和CV_IMPL void。最后在cvaux.h文件中CVAPI(CvBGStatModel*) cvCreateGaussianBGModel( IplImage* first_frame, CvGaussBGStatModelParams* parameters CV_DEFAULT(NULL));这句后面加上以下两句CVAPI(void) icvReleaseGaussianBGModel( CvGaussBGModel** bg_model ); CVAPI(int) icvUpdateGaussianBGModel( IplImage* curr_frame, CvGaussBGModel* bg_model ); 程序修改完毕,点rebuild all,全部重新编译。 2。在程序初始化部分定义高斯混合模型参数CvGaussBGModel* bg_model=NULL;在读取第一帧图像(背景图像)时,进行高斯背景建模bg_model = (CvGaussBGModel*)cvCreateGaussianBGModel(image, 0);image可以是灰度图象也可以是彩色图像。接下来再读取当前帧时,更新高斯模型 regioncount=icvUpdateGaussianBGModel(currframe, bg_model );regioncount的含义我不确定,我理解是代表背景中不同颜色区域的个数,这个参数我没有用到,它只是icvUpdateGaussianBGModel函数的返回值。 3。现在bg_model已经保存了经过高斯混合模型分类后的结果,bg_model-background保存了背景图像,bg_model-foreground保存了前景图像。 include stdio.h #include cv.h #include cxcore.h #include highgui.h #include cvaux.h//必须引此头文件 int main( int argc, char** argv ) { IplImage* pFrame = NULL; IplImage* pFrImg = NULL; IplImage* pBkImg = NULL; CvCapture* pCapture = NULL; int nFrmNum = 0; cvNamedWindow("video", 1); cvNamedWindow("background",1); cvNamedWindow("foreground",1); cvMoveWindow("video", 30, 0); cvMoveWindow("background", 360, 0); cvMoveWindow("foreground", 690, 0); if( argc 2 ) { fprintf(stderr, "Usage: bkgrd [video_file_name]\n"); return -1; } //打开视频文件 if(argc == 2) if( !(pCapture = cvCaptureFromFile(argv[1]))) { fprintf(stderr, "Can not open video file %s\n", argv[1]); return -2; } //打开摄像头 if (argc == 1) if( !(pCapture = cvCaptureFromCAM(-1))) { fprintf(stderr, "Can not open camera.\n"); return -2; } //初始化高斯混合模型参数 CvGaussBGModel* bg_model=NULL; while(pFrame = cvQueryFrame( pCapture )) { nFrmNum++; if(nFrmNum == 1) { pBkImg = cvCreateImage(cvSize(pFrame-width, pFrame-height), IPL_DEPTH_8U,3); pFrImg = cvCreateImage(cvSize(pFrame-width, pFrame-height), IPL_DEPTH_8U,1); //高斯背景建模,pFrame可以是多通道图像也可以是单通道图像 //cvCreateGaussianBGModel函数返回值为CvBGStatModel*, //需要强制转换成CvGaussBGModel* bg_model = (CvGaussBGModel*)cvCreateGaussianBGModel(pFrame, 0); } else { //更新高斯模型 cvUpdateBGStatModel(pFrame, (CvBGStatModel *)bg_model ); //pFrImg为前景图像,只能为单通道 //pBkImg为背景图像,可以为单通道或与pFrame通道数相同 cvCopy(bg_model-foreground,pFrImg,0); cvCopy(bg_model-background,pBkImg,0); //把图像正过来 pBkImg-origin=1; pFrImg-origin=1; cvShowImage("video", pFrame); cvShowImage("background", pBkImg); cvShowImage("foreground", pFrImg); if( cvWaitKey(2) = 0 ) break; } } //释放高斯模型参数占用内存 cvReleaseBGStatModel((CvBGStatModel**)bg_model); cvDestroyWindow("video"); cvDestroyWindow("background"); cvDestroyWindow("foreground"); cvReleaseImage(pFrImg); cvReleaseImage(pBkImg); cvReleaseCapture(pCapture); return 0; }
如何简单易懂的解释高斯混合(GMM)模型?
网上太多讲解例子,反而看的人云里雾里,我用自己的理解,旨在用最少的公式,用最短的时间来理解GMM。讲解不足之处,还望指正。
1.概述
高斯混合模型给出了一些点被分配到每个簇(Cluster)的概率,给出这些点的概率分布有何用呢?它表征了算法对结果的把握程度。如何理解呢,训练后的模型输出不再是一个具体值,不再是唯一决策函数y=f(x)作用后的唯一值,而是一系列概率值。举个例子,数据点集或者点云中的某一点,比如红色和蓝色簇边缘的那些点,既有可能属于蓝色簇,也有可能属于红色簇。函数作用后,分配到某一概率只是一个概率情况。点云的输出聚类情况,本来就是用来给控制模块去决策,输出不同簇的概率分布情况后,由后续控制模块通过融合其他诸如camera的识别概率来决策。
2.单高斯模型还是高斯混合模型
单高斯模型是指,数据集内分布的点,只有一个高斯分布即可覆盖。遵从如下概率分布函数,
这是最简单最理想的情况,实际情况却是,空间中一组点云,不可能一组高斯分布就能覆盖的,那么就需要多组高斯分布,混合高斯分布即由之而来,点在空间有疏有稀,不同高斯分布权重也不能一样,但所有权重值之和等于1,也就是下式中的ak。为什么权重之和为1呢,因为它本质还是一个概率密度分布函数,概率密度函数是指在概率密度曲线下方的面积,因此必然为1。
3.什么是隐变量?
通俗理解,假如有一组点集,我们分类之前是知道有5个点{a.b.c.d.e}的,又知道任意一点肯定是属于{A.B.C}三类的中的一类的,但是又不知道a点究竟属于哪个类。这就是隐变量。
4.有隐变量如何求最佳模型参数?
用最大似然估计法(MLE)求最大期望,也就是EM算法。网上有很多例子解释,最直观的就是掷硬币的例子,两枚硬币连掷五次,统计五次内正反的概率。(参考:如何感性地理解EM算法?)
核心思想就是,
(1)随机初始化一组参数θ0
(2)根据观测数据,和当前参数θ,求得未观测数据z的后验概率的期望
(3)求得的z有可能不是最优,根据最大似然法求最优的θ?
(4)重复第二三步,直到收敛
其中第二步叫做求期望,E步,第三步叫做求最大化,M步,合起来就是EM算法。
用向两个盘子盛菜举例来类比EM算法,食堂大厨炒了一个菜,分成两个盘子盛菜。大厨盛菜,看哪个盘子菜多,就把这个盘子菜向另外一个匀匀,直到多次重复,达到两个盘子的菜量大致一样的过程,然后端出去售卖。
大厨刚开始给两个盘都倒了菜,这就是赋初值,但是手感不好,一个多一个少。E步就是给两个盘子匀菜,M步最终迭代后,两个盘达到了均匀。无论赋初值多少,你会发现你去食堂买菜,相同菜品拿哪个盘子似乎菜量都是一样的。
非常直观,很容易理解。
5 如何求最大化似然概率?
单高斯比较好求,由高中数学知识可知道,函数求导,导数等于0的地方就是极值点所在。
那么混合高斯函数呢?
上式log里面有求和∑,这是我们不喜欢的,log里面我们喜欢的是乘除,最困难的地方也是最不好理解的地方出现了。
如何求解?只能通过通过迭代的方法进行求解,怎么求,Jensen不等式。我贴一下图方便理解。
从上图可以看到,curve曲线上的点一定小于切线(也就是求导数)的点。于是下式就成立了。我们就把和的对数,变成了对数的和,那么求导就变得容易多了。
Jesen不等式,相当于应用在凹函数上,不等号的方向反向了。
最后求得新一轮的迭代模型参数为下面:
当|θ?-θ|<ε收敛后,至此我们就找到了所有的高斯混合模型的参数。
高斯混合模型(GMM)
??最近在实际工作中用到了高斯混合模型(Gaussian Mixture Model),遂写一篇笔记来整理记录相关知识点,以便复查巩固。
简单回顾一下本科概率论讲过的高斯模型。
高斯模型是一种常用的变量分布模型,又称正态分布,在数理统计领域有着广泛的应用。
当样本数据 X 是一维数据(Univariate)时,高斯分布遵从下方概率密度函数(Probability Density Function)(下文简称pdf)如下: 其中 为数据均值(期望), 为数据标准差(Standard deviation)。
当样本数据 X 是多维数据(Multivariate)时,高斯分布pdf为:
其中, 为数据均值(期望), 为协方差(Covariance),描述各维变量之间的相关度,D 为数据维度。
??高斯混合模型可以看作是由 K 个单高斯模型组合而成的模型,这 K 个子模型是混合模型的隐变量(Hidden variable)。一般来说,一个混合模型可以使用任何概率分布,这里使用高斯混合模型是因为高斯分布具备很好的数学性质以及良好的计算性能。
先来看一组数据。
??所以,混合高斯模型并不是什么新奇的东西,它的本质就是融合几个单高斯模型,来使得模型更加复杂,从而产生更复杂的样本。理论上,如果某个混合高斯模型融合的高斯模型个数足够多,它们之间的权重设定得足够合理,这个混合模型可以拟合任意分布的样本。
对于单高斯模型,我们可以用最大似然法(Maximum likelihood)估算参数 的值 这里我们假设了每个数据点都是独立的(Independent),似然函数由概率密度函数(PDF)给出。
由于每个点发生的概率都很小,乘积会变得极其小,不利于计算和观察,因此通常我们用 Maximum Log-Likelihood 来计算(因为 Log 函数具备单调性,不会改变极值的位置,同时在 0-1 之间输入值很小的变化可以引起输出值相对较大的变动): 对其进行求导并令导数为0,所求出的参数就是最佳的高斯分布对应的参数。
所以最大化似然函数的意义就是:通过使得样本集的联合概率最大来对参数进行估计,从而选择最佳的分布模型。
对于高斯混合模型,Log-Likelihood 函数是: 如何计算高斯混合模型的参数呢?这里我们无法像单高斯模型那样使用最大似然法来求导求得使 likelihood 最大的参数,因为对于每个观测数据点来说,事先并不知道它是属于哪个子分布的(hidden variable),因此 log 里面还有求和,对于每个子模型都有未知的 ,直接求导无法计算。需要通过迭代的方法求解。
EM 算法是一种迭代算法,1977 年由 Dempster 等人总结提出,用于含有隐变量(Hidden variable)的概率模型参数的最大似然估计。
每次迭代包含两个步骤:
这里不具体介绍一般性的 EM 算法,(通过 Jensen 不等式得出似然函数的下界 Lower bound,通过极大化下界做到极大化似然函数,有log(E(x))=E(log(x))),只介绍怎么在高斯混合模型里应用从来推算出模型参数。
通过 EM 迭代更新高斯混合模型参数的方法(我们有样本数据 和一个有 个子模型的高斯混合模型,想要推算出这个高斯混合模型的最佳参数):
至此,我们就找到了高斯混合模型的参数。需要注意的是,EM 算法具备收敛性,但并不保证找到全局最大值,有可能找到局部最大值。解决方法是初始化几次不同的参数进行迭代,取结果最好的那次。
高斯模型是啥呀
高斯模型就是用高斯概率密度函数(正态分布曲线)精确地量化事物,将一个事物分解为若干的基于高斯概率密度函数(正态分布曲线)形成的模型。
对图像背景建立高斯模型的原理及过程:图像灰度直方图反映的是图像中某个灰度值出现的频次,也可以以为是图像灰度概率密度的估计。如果图像所包含的目标区域和背景区域相差比较大,且背景区域和目标区域在灰度上有一定的差异,那么该图像的灰度直方图呈现双峰-谷形状,其中一个峰对应于目标,另一个峰对应于背景的中心灰度。
对于复杂的图像,尤其是医学图像,一般是多峰的。通过将直方图的多峰特性看作是多个高斯分布的叠加,可以解决图像的分割问题。 在智能监控系统中,对于运动目标的检测是中心内容,而在运动目标检测提取中,背景目标对于目标的识别和跟踪至关重要。而建模正是背景目标提取的一个重要环节。