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 相关文章推荐
python3使用urllib示例取googletranslate(谷歌翻译)
Jan 23 Python
在Django中创建动态视图的教程
Jul 15 Python
Python进阶学习之特殊方法实例详析
Dec 01 Python
python实现壁纸批量下载代码实例
Jan 25 Python
python spyder中读取txt为图片的方法
Apr 27 Python
python实现汽车管理系统
Nov 30 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
Dec 04 Python
Python设计模式之建造者模式实例详解
Jan 17 Python
Python人脸识别第三方库face_recognition接口说明文档
May 03 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
Aug 20 Python
Python机器学习之底层实现KNN
Jun 20 Python
Python爬虫基础之初次使用scrapy爬虫实例
Jun 26 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
利用discuz自带通行证整合dedecms的方法以及文件下载
2007/03/06 PHP
asp和php下textarea提交大量数据发生丢失的解决方法
2008/01/20 PHP
php全局变量和类配合使用深刻理解
2013/06/05 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
2014/11/03 PHP
(仅IE下有效)关于checkbox 三态
2007/05/12 Javascript
Locate a File Using a File Open Dialog Box
2007/06/18 Javascript
js 判断 enter 事件
2009/02/12 Javascript
js正确获取元素样式详解
2009/08/07 Javascript
Jquery事件的连接使用示例
2013/06/18 Javascript
javascript跟随滚动效果插件代码(javascript Follow Plugin)
2013/08/03 Javascript
js判断变量初始化的三种形式及推荐用的形式
2014/07/22 Javascript
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
JS中mouseover和mouseout多次触发问题如何解决
2016/06/06 Javascript
JavaScript 计算笛卡尔积实例详解
2016/12/02 Javascript
jQuery中的100个技巧汇总
2016/12/15 Javascript
浅谈js中的变量名和函数名重名
2017/02/13 Javascript
JavaScript实现移动端页面按手机屏幕分辨率自动缩放的最强代码
2017/08/18 Javascript
详解JavaScript中typeof与instanceof用法
2018/10/24 Javascript
vue 使用vue-i18n做全局中英文切换的方法
2018/10/29 Javascript
解决vue2 在mounted函数无法获取prop中的变量问题
2018/11/15 Javascript
[06:21]完美世界亚洲区首席发行官竺琦TI3采访
2013/08/26 DOTA
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
2019/12/31 Python
django 利用Q对象与F对象进行查询的实现
2020/05/15 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
2020/07/03 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
详解Html5页面实现下载文件(apk、txt等)的三种方式
2018/10/22 HTML / CSS
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
美国婚戒购物网站:Anjays Designs
2017/06/28 全球购物
高级Java程序员面试要点
2013/08/02 面试题
Delphi笔试题
2016/11/14 面试题
四风问题对照检查材料整改措施
2014/09/27 职场文书
2014年导购员工作总结
2014/11/18 职场文书
小学优秀教师先进事迹材料
2014/12/16 职场文书
少先队中队工作总结
2015/08/14 职场文书
Win10多屏显示如何设置?Win10电脑多屏显示设置操作方法
2022/07/07 数码科技