机器学习小白:高斯判别分析(GDA)

好文链接:
https://www.cnblogs.com/jcchen1987/p/4424436.html

https://blog.csdn.net/xiaolewennofollow/article/details/46406447?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

假设已有数据:
在这里插入图片描述
目标函数:
在这里插入图片描述
其中 y 符合伯努利分布:注意两类样本的分布 均值不同,方差相同
在这里插入图片描述
应该是个漂亮小姐姐的笔记:
在这里插入图片描述由上一张图可以看出,当y=1和0时概率不同,写在一起后为
(1)
记住这个式子,之后会用于公式的推导.

通过对数极大似然估计(也是偷小姐姐的图,自己的字太丑,haha),函数为样本发生的概率取对数;接下来就是让函数L最大化,要对四个参数求导数

在这里插入图片描述
求导过程直接省略,看了你也记不住,只记最后结论为:
(1)
在这里插入图片描述
N为样本总数,N1为第一类样本数量,N2为第二类样本数量
(2)
在这里插入图片描述
(3)u2的估计只需要将上式中 yi 换成(1-yi);N1换成N2

(4)

在这里插入图片描述
总结:
在这里插入图片描述

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   #label 为 0,这也是高斯判别分析公式推导时的条件
y0=zeros(shape(x0)[1])

# x0.shape                                       #2行500列,每一列是一个数据,第一类有500个二维样本
mean1=[7,8]
cov=mat([[1,0],[0,2]])
x1=random.multivariate_normal(mean1,cov,300).T
y1=ones(shape(x1)[1])                            #第二类样本label 是1


x=array([concatenate((x0[0],x1[0])),concatenate((x0[1],x1[1]))])#将两中样本数据拼接
y=array([concatenate((y0,y1))])

m=shape(x)[1]                                   # m是样本的列数,这里也是样本的总数


# #计算参数:\phi,\u0,\u1,\Sigma
phi=(1.0/m)*len(y1)                             # phi 为0.375, label=1的样本数占总样本数

u0=mean(x0,axis=1)                              #[2.03983572 3.10866202],第一类样本两个维度的均值
u1=mean(x1,axis=1)                              #[7.07794924 8.00548557],第二类样本两个维度的均值

#下面是最难求的Σ
xplot0=x0;xplot1=x1   #save the original data  to plot 
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)                           #使用mat函数 之后才能使用一些线性代数的操作


sigma=(1.0/m)*(x_sub_u.T*x_sub_u)              #最后求出Σ是个2×2的矩阵,符合理论,因为每个样本只有两个维度
sigma.shape              

# #画出决策边界 
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]#斜率有了,但是只有斜率只不过是一条过原点的直线罢了
                                                   #截距为依旧很重要,截距计算的是y轴这个维度两类样本的均值,有了k和b 之后决策边界就可以画出来了



    
##这下面都是画图像了,不必深究
# #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)

接下来我们将看一下决策边界的斜率是怎么求出来的
在这里插入图片描述
图中与决策边界垂直的线的斜率可以轻松看出为
(u1[1]-u0[1])/(u1[0]-u0[0]) ,而两线垂直,斜率之积为-1,从而可以轻易得出决策边界的斜率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值