这篇文章给大家分享的是有关python实现高斯判别分析算法的例子的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
高斯判别分析算法(Gaussian discriminat analysis)
高斯判别算法是一个典型的生成学习算法(关于生成学习算法可以参考我的另外一篇博客)。在这个算法中,我们假设p(x|y)p(x|y)服从多元正态分布。
注:在判别学习算法中,我们假设p(y|x)p(y|x)服从一维正态分布,这个很好类比,因为在模型中输入数据XX通常是拥有很多维度的,所以对于XX的条件概率建模时要取多维正态分布。
多元正态分布
多元正态分布也叫多元高斯分布,这个分布的两个参数分别是平均向量μ∈Rnμ∈Rn和一个协方差矩阵∑∈Rn×n∑∈Rn×n
关于协方差矩阵的定义;假设XX是由nn个标量随机变量组成的列向量,并且μkμk是第kk个元素的期望值,即μk=E(Xk)μk=E(Xk),那么协方差矩阵被定义为
下面是一些二维高斯分布的概率密度图像:
最右边的图像展现的二维高斯分布的均值是零向量(2x1的零向量),协方差矩阵Σ=IΣ=I(2x2的单位矩阵),像这样以零向量为均值以单位阵为协方差的多维高斯分布称为标准正态分布,中间的图像以零向量为均值,Σ=0.6IΣ=0.6I;最右边的图像中Σ=2IΣ=2I,观察发现当ΣΣ越大时,高斯分布越“铺开”,当ΣΣ越小时,高斯分布越“收缩”。
让我们看一些其他例子对比发现规律
上图中展示的三个高斯分布对应的均值均为零向量,协方差矩阵分别对应与下面三个
最左边的图像是我们熟悉的标准二维正态分布,然后我们观察到当我们增加ΣΣ的非主对角元素时,概率密度图像沿着45°线(x1=x2x1=x2)“收缩”,从对应的等高线轮廓图可以跟清楚的看到这一点:
通过对比右边和中间的两幅图发现,通过减少主对角元素可以让概率密度图像变得“收缩”,不过是在相反的方向上。
高斯判别分析模型
当我们处理输入特征是连续随机变量xx时的分类问题时,我们可以使用高斯判别分析模型(GDA),用多元正态分布模型来描述p(x|y)p(x|y),模型的具体数学表达式是这样的:
通过最大化似然函数ll可以得到上面四个参数的估计值:
我们用图像直观的描述一下算法处理的结果:
python的实现demo 如下:
第57的高斯概率密度函数用矩阵运算写有bug没跑通,又因为实验数据只有二维,于是在纸上对上文中矩阵运算公式进行了化简至最后结果写在了函数里。如有疑问可以拿出笔来演算一下。
#GDA #作者:Xiaolewen import matplotlib.pyplot  as plt 得到numpy import * # Randomly generate  two cluster  data of Gaussian 分布 mean0=(2、3) x=垫([[1,0],[0,2]]) x0=random.multivariate_normal (mean0 x 500) .T #, first class point which labael equal 0 y0=0(形状(x0) [1]) # print x0, y0 mean1=[7,8] x=垫([[1,0],[0,2]]) x1=random.multivariate_normal .T (mean1, x和,300) 日元=1(形状(x1) [1]), #, second class point which label equals 1 # print (x1, y1) x=数组([连接(x0 [0], x1[0])),连接(x1 (x0 [1], [1])))) y=阵列((连接((y0, y1)))) m=形状(x) [1] # print x, y, m # Caculate 从而参数:\φ,σ\ u1, \ \情况 φ=(1.0/m) * len(日元) # print φ 情况=意味着(x0,轴=1), # print 情况 u1=意味着(x1,轴=1) # print u1 xplot0=x0; xplot1=x1 #节省;从而original data 用plot x0=x0.T; x1=x1.T; x=x.T # print x0, x1, x x0_sub_u0=x0-u0 x1_sub_u1=x1-u1 # print x0_sub_u0 # print x1_sub_u1 x_sub_u=连接([x0_sub_u0 x1_sub_u1]) # print x_sub_u x_sub_u=垫(x_sub_u) # print x_sub_u σ=(1.0/m) * (x_sub_u.T * x_sub_u) # print σ # plot 从而discriminate boundary , use 从而u0_u1& # 39; s midnormal 中点=[(情况[0]+ u1[0])/2.0(情况[1]+ u1 [1])/2.0) # print 中点 k=(u1[1]情况[1])/(u1[0]情况[0]) # print k x=范围(11) y=[(-1.0/k) * (i-midPoint[0]) +中点[1],for 小姐:拷贝x] # plot contour  for two  gaussian 分布 def gaussian_2d (x0, x,, y,, y0,, sigmaMatrix): ,return exp (-0.5 * ((x-x0) * * 2 + 0.5 * (y-y0) * * 2)) delta 0.025=, xgrid0=论坛(2,6日,δ) ygrid0=论坛(2,6日,δ) xgrid1=不等(δ)3,11日 ygrid1=不等(δ)3,11日 X0, Y0=meshgrid (xgrid0, ygrid0), # generate 从而网格 (X1, Y1=meshgrid xgrid1 ygrid1) Z0=gaussian_2d (X0, Y0, 2、3、浸) Z1=gaussian_2d (X1, Y1, 7, 8,浸) # plot 从而,figure 以及add 评论 plt.figure (1) plt.clf () plt.plot (xplot0 [0], xplot0 [1], & # 39; ko # 39;) plt.plot (xplot1 [0], xplot1 [1], & # 39; gs # 39;) plt.plot(情况[0],情况[1],& # 39;rx # 39;, markersize=20) plt.plot (u1 [0], u1 [1], & # 39; y * & # 39;, markersize=20) plt.plot (x, y) CS0=plt.contour (X0, Y0,, Z0) plt.clabel (CS0,内联=1,字形大?10) CS1=plt.contour (X1, Y1, Z1) plt.clabel (CS1,内联=1,字形大?10) plt.title (“Gaussian  discriminat analysis") plt.xlabel (& # 39; Feature Dimension (0) & # 39;) plt.ylabel (& # 39; Feature Dimension (1) & # 39;) nullpython实现高斯判别分析算法的例子