原创不易,转载前请注明博主的链接地址: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)