python实现高斯判别分析算法的例子

  

这篇文章给大家分享的是有关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),那么协方差矩阵被定义为

python实现高斯判别分析算法的例子

下面是一些二维高斯分布的概率密度图像:

python实现高斯判别分析算法的例子

最右边的图像展现的二维高斯分布的均值是零向量(2x1的零向量),协方差矩阵Σ=IΣ=I(2x2的单位矩阵),像这样以零向量为均值以单位阵为协方差的多维高斯分布称为标准正态分布,中间的图像以零向量为均值,Σ=0.6IΣ=0.6I;最右边的图像中Σ=2IΣ=2I,观察发现当ΣΣ越大时,高斯分布越“铺开”,当ΣΣ越小时,高斯分布越“收缩”。

让我们看一些其他例子对比发现规律

python实现高斯判别分析算法的例子

上图中展示的三个高斯分布对应的均值均为零向量,协方差矩阵分别对应与下面三个

python实现高斯判别分析算法的例子

最左边的图像是我们熟悉的标准二维正态分布,然后我们观察到当我们增加ΣΣ的非主对角元素时,概率密度图像沿着45°线(x1=x2x1=x2)“收缩”,从对应的等高线轮廓图可以跟清楚的看到这一点:

python实现高斯判别分析算法的例子

通过对比右边和中间的两幅图发现,通过减少主对角元素可以让概率密度图像变得“收缩”,不过是在相反的方向上。

python实现高斯判别分析算法的例子

高斯判别分析模型

当我们处理输入特征是连续随机变量xx时的分类问题时,我们可以使用高斯判别分析模型(GDA),用多元正态分布模型来描述p(x|y)p(x|y),模型的具体数学表达式是这样的:

python实现高斯判别分析算法的例子

通过最大化似然函数ll可以得到上面四个参数的估计值:

python实现高斯判别分析算法的例子

我们用图像直观的描述一下算法处理的结果:

python实现高斯判别分析算法的例子

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;)
  null

python实现高斯判别分析算法的例子