机器学习笔记(五)-高斯判别分析

原创不易,转载前请注明博主的链接地址:Blessy_Zhu https://blog.csdn.net/weixin_42555080
本次代码的环境:
运行平台: Windows
Python版本: Python3.x
IDE: PyCharm

一、 前言

机器学习笔记(四)-逻辑回归已经介绍了,软分类又分为概率判别模型:为代表的模型是逻辑回归;还有概率生成模型,为代表的是高斯判别分析(GDA:Guassian Discrimant Analysis)。GDA是本文的主角。接下来,直奔主题吧!!!

二、GDA实现细节

机器学习笔记(四)-逻辑回归中介绍,生成模型的主要过程就是通过先验,求后验概率,如下式子所示:
在这里插入图片描述
根据y的取值是0或者1,实际上就是符合伯努利分布,这样,为了求P(x|y),现假设:
在这里插入图片描述
将上面y=1,y=0的合并成一个式子,同时也将x|y=1和x|y=0合并成一个式子:
在这里插入图片描述
这样,根据训练样本,估计出先验概率以及高斯分布的均值和协方差矩阵(注意这里两类内部高斯分布的协方差矩阵相同),即可通过如下贝叶斯公式求出一个新样本分别属于两类的概率,进而可实现对该样本的分类。
在这里插入图片描述
接下里就开始求目标函数,这里采用的是log-likelihood log似然函数。

那么高斯判别分析的核心工作就是估计上述未知量ϕ,μ1,μ2,Σ。如何来估计这些参数?又该最大似然估计上场了。其对数似然函数为:
 

 
在这里插入图片描述

首先求最好求的内容ϕ,因为它只和最后一个式子有关系:
 

 
在这里插入图片描述

接下来求μ1,μ1只和第一个式子有关;实际上,μ2只和第二个式子有关,这里就不再详细的写μ2的推导过程,只给出μ1的推导过程:
 

 
在这里插入图片描述

最后求解最难求的Σ,它是和式子1,2都有关系,也就是求使得满足下面式子的Σ值:
在这里插入图片描述
为了方便运算,下面引入了tr()的运算。
 

 
在这里插入图片描述
在这里插入图片描述

三、GDA验证

首先产生任意两簇基于高斯分布的数据:

#GDA
import matplotlib.pyplot as plt
from numpy import *

#任意产生两簇基于高斯分布的数据
mean0=[2,3]
cov=mat([[1,0],[0,2]])
x0=random.multivariate_normal(mean0,cov,500).T   #第一类的数据值为0
y0=zeros(shape(x0)[1])
mean1=[7,8]
cov=mat([[1,0],[0,2]])
x1=random.multivariate_normal(mean1,cov,300).T
y1=ones(shape(x1)[1]) #第二类数据值为1
x=array([concatenate((x0[0],x1[0])),concatenate((x0[1],x1[1]))])
y=array([concatenate((y0,y1))])
m=shape(x)[1]

定义并初始化参数:ϕ,μ0,μ1,Σ,并展示原始数据

#定义并初始化参数:ϕ,μ0,μ1,Σ
phi=(1.0/m)*len(y1)
u0=mean(x0,axis=1)
u1=mean(x1,axis=1)

#展示原始训练数据
xplot0=x0
xplot1=x1
x0=x0.T
x1=x1.T
x=x.T
x0_sub_u0=x0-u0
x1_sub_u1=x1-u1
x_sub_u=concatenate([x0_sub_u0,x1_sub_u1])
x_sub_u=mat(x_sub_u)
sigma=(1.0/m)*(x_sub_u.T*x_sub_u)

#用u0和u1的中正态绘制区分边界
midPoint=[(u0[0]+u1[0])/2.0,(u0[1]+u1[1])/2.0]
k=(u1[1]-u0[1])/(u1[0]-u0[0])
x=range(-2,11)
y=[(-1.0/k)*(i-midPoint[0])+midPoint[1] for i in x]
#绘制两个高斯分布的轮廓
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)

最后,绘制图形

#绘图
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)

结果展示:
在这里插入图片描述

四、总结

本篇内容主要介绍了GDA高斯判别分析,并对GDA模型进行验证。这篇文章就到这里了,欢迎大佬们多批评指正,也欢迎大家积极评论多多交流。
 

 
在这里插入图片描述

参考文章

1 机器学习(十七)——高斯判别分析模型(The Gaussian Discriminant Analysis model)
2 斯坦福大学机器学习——高斯判别分析
3 斯坦福机器学习实现与分析之五(高斯判别分析)
4 生成学习算法之高斯判别分析模型
5 高斯判别分析(GDA)Python代码(乳腺癌数据实例)
6 高斯判别分析算法(Gaussian discriminat analysis)

  • 7
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值