高斯分布模型(高斯分布原理)

http://www.itjxue.com  2023-02-15 20:05  来源:未知  点击次数: 

广义线性模型、指数分布族中的高斯分布、伯努利分布

中文术语表述加了英文原文,尽量以原文为主,原文在

为什么要有指数分布族 :普通线性模型(general linear model)处理二分类等问题受限(除二分类以外,还有一些其他原因),因此定义了广义线性模型(generalized linear model )来处理这些问题,大部分经常碰到的广义线性模型都是指数分布族。

定义指数分布族的“指数”可能是因为求导方便(这个是自己想想的,不一定准确)

定义指数分布族 :(指数分布族的定义符号有很多版本,这里采用的是CS229 描述的写法,注意PRML的写法稍有不同,CS229是斯坦福大学Andrew NG的机器学习课程,PRML是模式识别机器学习的经典书籍)

η 是 自然参数(natural parameter,also called thecanonical parameter)。

T(y) ?是充分统计量 (sufficient statistic) ,一般情况下就是y。

a(η) 是 对数部分函数(log partition function),这部分确保Y的分布p(y:η) 计算的结果加起来(连续函数是积分)等于1.

伯努利分布作为指数分布族的例子 (比如在某段时间内,广告被点击的分布;某段时间内,顾客是否进店等等):

设 均值(mean)为 φ,分布 在Y上的取值为{0,1},因此

p(y= 1;φ) =φ;

p(y= 0;φ) = 1?φ

即,调整φ,得到不同的伯努利分布,一旦设定好φ,T,a,b都被固定住,就能得到一个伯努利分布。

把上式的右边改写成指数分布族形式

可以看出,

b(y) = 1

T(y) = y

a(η) = -log(1?φ)

η = log (φ/(1-φ))

因此 φ=

这个就是sigmoid函数了,也是logistic 函数,Great.

高斯分布作为指数分布族的例子(线性回归 linear regression):

假设 σ^2 = 1

指数分布族的形式为

可以看出,

当然指数分布族中的成员很多,泊松分布,gamma分布,beta分布等等,碰到需要解决一个具体问题的时候(比如要去判断多少人在一个时间段内访问某个店,也是某一家店需要扩张选店的其中一个依据),泊松分布是一个很好的模型,泊松分布恰巧也是属于指数分布族。

下面描述一个方法:如何构造一个广义线性模型(GLMS)来解决上述问题(如某个时间段内,多少人进店)

具体来说,思考一个分类(classification)问题或者回归(regression)问题,我们需要预测随机变量Y是X的函数(比如多少人进店的问题,X是某个店的奖励政策、近期广告等等一些特征)

要建立一个GLM处理这个问题,首先做三个假设:

3:η和X线性(叫“指定选择” design choice 可能更合适):

应用三个假设举例如下:

比如 最小二乘(ordinary least square regression),是指数分布族模型的一种special case。

根据假设2,可以得出

根据假设1,假设服从高斯分布,可以得出

高斯分布 η = μ(参考前述高斯分布) ,

根据假设3:

比如 logistic regression 同理:

等式2为伯努利分布的均值

假设2可得到等式1

假设1可得到等式3

假设3可得到等式4

附原文

什么是高斯混合模型

高斯混合模型就是用高斯概率密度函数(正态分布曲线)精确地量化事物,它是一个将事物分解为若干的基于高斯概率密度函数(正态分布曲线)形成的模型。 高斯模型就是用高斯概率密度函数(正态分布曲线)精确地量化事物,将一个事物分解为若干的基于高斯概率密度函数(正态分布曲线)形成的模型。

混合高斯模型的单分布高斯背景模型

单分布高斯背景模型认为,对一个背景图像,特定像素亮度的分布满足高斯分布,即对背景图像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;

}

(责任编辑:IT教学网)

更多