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


Posted in Python onDecember 09, 2019

高斯判别分析算法(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
#author:Xiaolewen
import matplotlib.pyplot as plt
from numpy import *

#Randomly generate two cluster data of Gaussian distributions
mean0=[2,3]
cov=mat([[1,0],[0,2]])
x0=random.multivariate_normal(mean0,cov,500).T #The first class point which labael equal 0
y0=zeros(shape(x0)[1])
#print x0,y0
mean1=[7,8]
cov=mat([[1,0],[0,2]])
x1=random.multivariate_normal(mean1,cov,300).T
y1=ones(shape(x1)[1]) #The second class point which label equals 1
#print x1,y1

x=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,\Sigma
phi=(1.0/m)*len(y1)
#print phi
u0=mean(x0,axis=1) 
#print u0
u1=mean(x1,axis=1)
#print u1

xplot0=x0;xplot1=x1 #save the original data to 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=concatenate([x0_sub_u0,x1_sub_u1])
#print x_sub_u

x_sub_u=mat(x_sub_u)
#print x_sub_u

sigma=(1.0/m)*(x_sub_u.T*x_sub_u)
#print sigma

#plot the discriminate boundary ,use the u0_u1's midnormal
midPoint=[(u0[0]+u1[0])/2.0,(u0[1]+u1[1])/2.0]
#print midPoint
k=(u1[1]-u0[1])/(u1[0]-u0[0])
#print k
x=range(-2,11)
y=[(-1.0/k)*(i-midPoint[0])+midPoint[1] for i in x]



#plot contour for two gaussian distributions
def gaussian_2d(x, y, x0, y0, sigmaMatrix):
 return exp(-0.5*((x-x0)**2+0.5*(y-y0)**2))
delta = 0.025
xgrid0=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 grid
X1,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 comments
plt.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实现高斯判别分析算法的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 冒泡,选择,插入排序使用实例
Feb 05 Python
举例讲解如何在Python编程中进行迭代和遍历
Jan 19 Python
Python常见加密模块用法分析【MD5,sha,crypt模块】
May 24 Python
TensorFlow变量管理详解
Mar 10 Python
python 列表转为字典的两个小方法(小结)
Jun 28 Python
Python测试模块doctest使用解析
Aug 10 Python
Python下应用opencv 实现人脸检测功能
Oct 24 Python
Python 2种方法求某个范围内的所有素数(质数)
Jan 31 Python
Python图像处理库PIL的ImageFont模块使用介绍
Feb 26 Python
Python基础之列表常见操作经典实例详解
Feb 26 Python
python生成并处理uuid的实现方式
Mar 03 Python
Python3爬虫带上cookie的实例代码
Jul 28 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
Dec 09 #Python
使用 Python 写一个简易的抽奖程序
Dec 08 #Python
布隆过滤器的概述及Python实现方法
Dec 08 #Python
Python+Redis实现布隆过滤器
Dec 08 #Python
PyCharm 2019.3发布增加了新功能一览
Dec 08 #Python
使用tqdm显示Python代码执行进度功能
Dec 08 #Python
Python tkinter实现图片标注功能(完整代码)
Dec 08 #Python
You might like
PHP添加MySQL数据记录代码
2008/06/07 PHP
php array_search() 函数使用
2010/04/13 PHP
LazyLoad 延迟加载(按需加载)
2010/05/31 Javascript
使用jquery实现select添加实现后台权限添加的效果
2011/05/28 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
关于Javascript作用域链的八点总结
2013/12/06 Javascript
js登录弹出层特效
2014/03/07 Javascript
js拼接html注意问题示例探讨
2014/07/14 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
2016/05/17 Javascript
微信小程序 教程之注册程序
2016/10/17 Javascript
基于 Vue.js 之 iView UI 框架非工程化实践记录(推荐)
2017/11/21 Javascript
JS弹窗 JS弹出DIV并使整个页面背景变暗功能的实现代码
2018/04/21 Javascript
JavaScript累加、迭代、穷举、递归等常用算法实例小结
2018/05/08 Javascript
JS实现json对象数组按对象属性排序操作示例
2018/05/18 Javascript
js中Object.defineProperty()方法的不详解
2018/07/09 Javascript
jQuery pjax 应用简单示例
2018/09/20 jQuery
基于Koa2写个脚手架模拟接口服务的方法
2018/11/27 Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
2019/04/08 Javascript
vue用elementui写form表单时,在label里添加空格操作
2020/08/13 Javascript
在vue中axios设置timeout超时的操作
2020/09/04 Javascript
[00:32]2018DOTA2亚洲邀请赛Newbee出场
2018/04/03 DOTA
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
python 实现归并排序算法
2012/06/05 Python
Python实现检测文件MD5值的方法示例
2018/04/11 Python
pandas 将list切分后存入DataFrame中的实例
2018/07/03 Python
tensorflow使用神经网络实现mnist分类
2018/09/08 Python
Python之——生成动态路由轨迹图的实例
2019/11/22 Python
python3 常见解密加密算法实例分析【base64、MD5等】
2019/12/19 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
2020/02/25 Python
matlab灰度图像调整及imadjust函数的用法详解
2020/02/27 Python
对python pandas中 inplace 参数的理解
2020/06/27 Python
HTML5边玩边学(1)画布实现方法
2010/09/21 HTML / CSS
美国最大的宠物用品零售商:PetSmart
2016/11/14 全球购物
应用化学专业职业生涯规划书
2014/01/22 职场文书
就业协议书盖章的注意事项
2014/09/28 职场文书
暂住证明怎么写
2015/06/19 职场文书