PRML-1.2.4 高斯分布

高斯分布

\[\mathcal{N}(x|\mu,\sigma ^2)=\frac{1}{(2\pi\sigma ^2)^{1/2}}exp\left\{-\frac{1}{2\sigma ^2}(x-\mu)^2\right\}\]

多维高斯分布

\[\mathcal{N}(\mathbf{x}|\mathbf{\mu},\mathbf{\Sigma})=\frac{1}{(2\pi)^{D/2}|\mathbf{\Sigma}|^{1/2}}exp\left\{-\frac{1}{2}(\mathbf{x}-\mathbf{\mu})^{T}\mathbf{\Sigma}^{-1}(\mathbf{x}-\mathbf{\mu})\right\}\]

\(\mathbf{x}=(x_1,\ldots ,x_N)^T\)是对变量\(x\)的\(N\)个观测,每个观测都是独立从同一高斯分布中抽样的,独立同分布,所以得到一个观测的概率可以表示为

\[p(\mathbf{x}|\mu,\sigma ^2)=\prod_{n=1}^N\mathcal{N}(x_n|\mu,\sigma ^2)\]

这是似然函数,是关于\(\mu,\sigma ^2\)的函数,通过极大化似然函数可以求得参数,极大似然法寻找一组参数使得所观测的概率最大,挺奇怪的

x轴上的点是观测值,绿色的线长度表示观测值的概率密度,所有绿线的长度相乘,得到观测值的概率密度,通过调整参数\(\mu,\sigma ^2\)使得这个乘积最大,这是极大似然法的思想

python+matplotlib+tkinter实现演示:

 1 import numpy as np
 2 import matplotlib
 3 import matplotlib.pyplot as plt
 4 import random
 5 from Tkinter import *
 6 from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
 7 from matplotlib.figure import Figure
 8 
 9 N = 100    #采样点数目
10 mu = 0.5    #采样均值
11 sigma = 1    #采样标准差
12 
13 x0 =np.linspace(-2,3,200,endpoint=True)    #高斯分布画图点
14 x = np.random.normal(loc=mu, scale=sigma, size=N)    #高斯分布采样
15 t1 = np.mean(x)    #最大似然均值
16 t2 = np.sqrt(np.mean(np.square(x-t1)))    #最大似然标准差
17 leftlim = -2    #横坐标左极限
18 rightlim = 3    #横坐标右极限
19 
20 #高斯分布
21 def gaussian(x,mu,sigma):
22     return 1/(2*np.pi*sigma**2)**(0.5)*np.exp(-1/(2*sigma**2)*(x-mu)**2)
23 #滑块sc1和sc2回调函数
24 def draw_pic(self):
25     #获得均值和标准差参数
26     try:mu = float(v1.get())
27     except:
28         mu = 0.5
29         sc1.set(mu)
30     try:sigma = float(v2.get())
31     except:
32         sigma = 1
33         sc2.set(sigma)        
34     #清除图像
35     draw_pic.f.clf()
36     #画图
37     draw_pic.a = draw_pic.f.add_subplot(111)
38     draw_pic.a.set_xlim(leftlim,rightlim)
39     draw_pic.a.set_ylim(0,1)
40     draw_pic.a.set_xlabel(r'$x$')
41     draw_pic.a.set_ylabel(r'$p(x)$')
42     draw_pic.a.set_xticks(np.arange(leftlim,rightlim,0.5).tolist())
43     x0 =np.linspace(leftlim,rightlim,200,endpoint=True)
44     draw_pic.a.plot(x0,gaussian(x0,mu,sigma),color='r',linewidth=2)
45     draw_pic.a.vlines(x.tolist(),[0],gaussian(x,mu,sigma).tolist(),color='g')
46     draw_pic.canvas.show()
47     #设置标签
48     lb1.configure(text = "mu_ML:"+t1.astype('str')+ \
49                   "\nsigma_ML:"+t2.astype('str')
50                   +"\nSum of log of gaussian of x_n: "\
51                   +np.sum(np.log(gaussian(x,mu,sigma))).astype('|S10'))
52     
53     
54 if __name__ == '__main__':
55     
56     matplotlib.use('TkAgg')
57     root = Tk()
58     
59     draw_pic.f = Figure(figsize=(5,4),dpi=100)
60     draw_pic.canvas = FigureCanvasTkAgg(draw_pic.f,master = root)
61     draw_pic.canvas.show()
62     draw_pic.canvas.get_tk_widget().grid(row = 0,columnspan = 3)
63     #标签
64     lb1 = Label(root, text="")
65     lb1.grid(row=1,column=0)
66     #滑块1,用于设定均值
67     v1 = StringVar()
68     sc1 = Scale(root,
69       from_ = 0,         
70       to = 1,             
71       resolution = 0.001,       
72       orient = HORIZONTAL,  
73                 variable = v1 ,        
74       label = 'mu:'    ,
75       command = draw_pic
76       )
77     sc1.grid(row=1,column=1)
78     sc1.set(0.5)
79     #滑块2,用于设定标准差
80     v2= StringVar()
81     sc2 = Scale(root,
82       from_ = 0.000001,     
83       to = 3,             
84       resolution = 0.001,       
85       orient = HORIZONTAL,  
86       variable = v2 ,        
87       label = 'sigma:'    ,
88       command = draw_pic
89       )
90     sc2.grid(row=1,column=2)
91     sc2.set(1)
92      
93     root.mainloop()
View Code

 

转载于:https://www.cnblogs.com/wangsirui/p/5136608.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值