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生成指定尺寸缩略图的示例
May 07 Python
python使用mailbox打印电子邮件的方法
Apr 30 Python
Python算法之求n个节点不同二叉树个数
Oct 27 Python
Python简单实现查找一个字符串中最长不重复子串的方法
Mar 26 Python
使用Python写一个小游戏
Apr 02 Python
Python中max函数用于二维列表的实例
Apr 03 Python
Python Requests模拟登录实现图书馆座位自动预约
Apr 27 Python
Python2和Python3.6环境解决共存问题
Nov 09 Python
python如何实现一个刷网页小程序
Nov 27 Python
python 检查是否为中文字符串的方法
Dec 28 Python
python实现图片彩色转化为素描
Jan 15 Python
Python解析json时提示“string indices must be integers”问题解决方法
Jul 31 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解决URL中文GBK乱码问题的两种方法
2014/06/03 PHP
CodeIgniter启用缓存和清除缓存的方法
2014/06/12 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
php通过执行CutyCapt命令实现网页截图的方法
2016/09/30 PHP
小程序微信退款功能实现方法详解【基于thinkPHP】
2019/05/05 PHP
js 小数取整的函数
2010/05/10 Javascript
javascript定时保存表单数据的代码
2011/03/17 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
纯javascript实现简单下拉刷新功能
2015/03/13 Javascript
三分钟带你玩转jQuery.noConflict()
2016/02/15 Javascript
NodeJs的优势和适合开发的程序
2016/08/14 NodeJs
JS函数修改html的元素内容,及修改属性内容的方法
2016/10/28 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
Javascript之图片的延迟加载的实例详解
2017/07/24 Javascript
vue.js使用watch监听路由变化的方法
2018/07/08 Javascript
vue--点击当前增加class,其他删除class的方法
2018/09/15 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
2020/06/04 Javascript
vue中使用腾讯云Im的示例
2020/10/23 Javascript
JavaScript实现网页计算器功能
2020/10/29 Javascript
Vue自定义表单内容检查rules实例
2020/10/30 Javascript
使用Python抓取模板之家的CSS模板
2015/03/16 Python
详解python基础之while循环及if判断
2017/08/24 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
2019/08/09 Python
python中自带的三个装饰器的实现
2019/11/08 Python
使用python+whoosh实现全文检索
2019/12/09 Python
Python如何把十进制数转换成ip地址
2020/05/25 Python
Python进行统计建模
2020/08/10 Python
无工作经验者个人求职信范文
2013/12/22 职场文书
工作的心得体会
2013/12/31 职场文书
2014年组织委员工作总结
2014/12/01 职场文书
生日答谢词
2015/01/05 职场文书
华清池导游词
2015/02/02 职场文书
通知书大全
2015/04/27 职场文书
生活小常识广播稿
2015/08/19 职场文书
2016年秋季运动会通讯稿
2015/11/25 职场文书
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL