高斯判别分析算法及其python实现
来源:互联网 发布:js 时间格式化 编辑:程序博客网 时间:2024/05/16 18:59
高斯判别分析算法(Gaussian discriminat analysis)
高斯判别算法是一个典型的生成学习算法(关于生成学习算法可以参考我的另外一篇博客)。在这个算法中,我们假设
注:在判别学习算法中,我们假设
p(y|x) 服从一维正态分布,这个很好类比,因为在模型中输入数据X 通常是拥有很多维度的,所以对于X 的条件概率建模时要取多维正态分布。
多元正态分布
多元正态分布也叫多元高斯分布,这个分布的两个参数分别是平均向量
关于协方差矩阵的定义;假设
矩阵第
多元高斯分布可以记为
在上面的公式中,
下面是一些二维高斯分布的概率密度图像:
最右边的图像展现的二维高斯分布的均值是零向量(2x1的零向量),协方差矩阵
让我们看一些其他例子对比发现规律
上图中展示的三个高斯分布对应的均值均为零向量,协方差矩阵分别对应与下面三个
最左边的图像是我们熟悉的标准二维正态分布,然后我们观察到当我们增加
再看最后一组通过改变不同的
上面三幅图对应的
通过对比右边和中间的两幅图发现,通过减少主对角元素可以让概率密度图像变得“收缩”,不过是在相反的方向上。
在最后的例子中,我们固定
上图中对应的
高斯判别分析模型
当我们处理输入特征是连续随机变量
y∼Bernoulli(ϕ)
x|y=0∼N(μ0,Σ)
x|y=1∼N(μ1,Σ)
写出他们的概率分布为:
p(y)=ϕy(1−ϕ)1−y
p(x|y=0)=1(2π)n/2|Σ|12exp(−12(x−μ0)TΣ−1(x−μ0))
p(x|y=1)=1(2π)n/2|Σ|12exp(−12(x−μ1)TΣ−1(x−μ1))
现在我们的模型有四个参数
通过最大化似然函数
ϕ=1m∑i=1m1{y(i)=1}
μ0=∑mi=11{y(i)=0}xi∑mi=11{y(i)=0}
μ1=∑mi=11{y(i)=1}xi∑mi=11{y(i)=1}
Σ=1m∑i=1m(x(i)−μy(i))(x(i)−μy(i))T
我们用图像直观的描述一下算法处理的结果:
在图像中展示的是我们的训练数据集,并且在图上画出了两类分类数据的拟合出得高斯分布的等高线,两个等高线的轮廓和旋转方向相同,因为两个高斯分布的协方差矩阵
python的实现demo 如下:
第57的高斯概率密度函数用矩阵运算写有bug没跑通,又因为实验数据只有二维,于是在纸上对上文中矩阵运算公式进行了化简至最后结果写在了函数里。如有疑问可以拿出笔来演算一下。
#GDA#author:Xiaolewenimport matplotlib.pyplot as pltfrom numpy import *#Randomly generate two cluster data of Gaussian distributionsmean0=[2,3]cov=mat([[1,0],[0,2]])x0=random.multivariate_normal(mean0,cov,500).T #The first class point which labael equal 0y0=zeros(shape(x0)[1])#print x0,y0mean1=[7,8]cov=mat([[1,0],[0,2]])x1=random.multivariate_normal(mean1,cov,300).Ty1=ones(shape(x1)[1]) #The second class point which label equals 1#print x1,y1x=array([concatenate((x0[0],x1[0])),concatenate((x0[1],x1[1]))])y=array([concatenate((y0,y1))])m=shape(x)[1]#print x,y,m#Caculate the parameters:\phi,\u0,\u1,\Sigmaphi=(1.0/m)*len(y1)#print phiu0=mean(x0,axis=1) #print u0u1=mean(x1,axis=1)#print u1xplot0=x0;xplot1=x1 #save the original data to plot x0=x0.T;x1=x1.T;x=x.T#print x0,x1,xx0_sub_u0=x0-u0x1_sub_u1=x1-u1#print x0_sub_u0#print x1_sub_u1x_sub_u=concatenate([x0_sub_u0,x1_sub_u1])#print x_sub_ux_sub_u=mat(x_sub_u)#print x_sub_usigma=(1.0/m)*(x_sub_u.T*x_sub_u)#print sigma#plot the discriminate boundary ,use the u0_u1's midnormalmidPoint=[(u0[0]+u1[0])/2.0,(u0[1]+u1[1])/2.0]#print midPointk=(u1[1]-u0[1])/(u1[0]-u0[0])#print kx=range(-2,11)y=[(-1.0/k)*(i-midPoint[0])+midPoint[1] for i in x]#plot contour for two gaussian distributionsdef gaussian_2d(x, y, x0, y0, sigmaMatrix): return exp(-0.5*((x-x0)**2+0.5*(y-y0)**2))delta = 0.025xgrid0=arange(-2, 6, delta)ygrid0=arange(-2, 6, delta)xgrid1=arange(3,11,delta)ygrid1=arange(3,11,delta)X0,Y0=meshgrid(xgrid0, ygrid0) #generate the gridX1,Y1=meshgrid(xgrid1,ygrid1)Z0=gaussian_2d(X0,Y0,2,3,cov)Z1=gaussian_2d(X1,Y1,7,8,cov)#plot the figure and add commentsplt.figure(1)plt.clf()plt.plot(xplot0[0],xplot0[1],'ko')plt.plot(xplot1[0],xplot1[1],'gs')plt.plot(u0[0],u0[1],'rx',markersize=20)plt.plot(u1[0],u1[1],'y*',markersize=20)plt.plot(x,y)CS0=plt.contour(X0, Y0, Z0)plt.clabel(CS0, inline=1, fontsize=10)CS1=plt.contour(X1,Y1,Z1)plt.clabel(CS1, inline=1, fontsize=10)plt.title("Gaussian discriminat analysis")plt.xlabel('Feature Dimension (0)')plt.ylabel('Feature Dimension (1)')plt.show(1)
这是最终的拟合结果:
欢迎交流
- 高斯判别分析算法及其python实现
- 高斯判别分析算法及其python实现
- 高斯判别分析(附Matlab实现)
- 高斯判别分析(附Matlab实现)
- 斯坦福机器学习笔记1:GDA高斯判别分析算法的原理及matlab程序实现
- 高斯判别分析
- 生成学习算法、高斯判别分析与朴素贝叶斯模型
- 生成学习算法之高斯判别分析模型
- fisher判别分析原理+python实现
- 机器学习 --高斯判别分析
- 机器学习--高斯判别分析
- ML—高斯判别分析
- 高斯图像模糊算法及其 C 实现
- 高斯图像模糊算法及其 C 实现
- SMOTE算法及其python实现
- DBscan算法及其Python实现
- Kemans算法及其Python 实现
- kNN算法及其python实现
- µC/OS-III Release Notes
- 很有用的cuda查错代码片段
- 服务
- 【ios开发学习 - 第二课】iOS项目目录结构
- java ClassLoader详解
- 高斯判别分析算法及其python实现
- java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I`
- HDU 4408 最小生成树的个数
- hadoop平台优化
- 建立用户身份验证机制和个性化设置总结-会话(2)
- Maximal Square
- 顺序队列
- 链队列
- c语言变量和函数声明的修饰符static,extern,#define,const