混合高斯(1)

混合高斯

  单一高斯模型无法应对如老忠实间歇喷泉这些实际的问题,而高斯混合模型提供了一类比单独的高斯分布更强大的概率模型。我们将高斯混合模型看成高斯分量的简单线性叠加,其公式为[注0]

(9.7)p(x)=k=1KπkN(x|μk,Σk)

引入一个K维的二值随机变量z=(z1,z2,,zK),这个变量采取"1-of-K"表示方法,其中一个特定元素zk等于1,其余所有的元素等于0.于是zk的值满足zk0,1kzk=1。因此我们可以根据哪个元素非零,判断向量z有K个可能的状态。现在做出如下假设:向量z的概率分布根据混合系数 πk 进行赋值,即

p(zk=1)=πk

其中系数 {πk} 满足 πk[0,1]kKzk=1,使得上述概率是合法的。由于向量z采用了“1-of-K”表示方法,因此可以将这个概率分布写成

(9.10)p(z)=kKπkzk

类似地,给定一个特定的值,x的条件概率分布是一个高斯分布

p(x|zk=1)=N(x|μk,Σk)

于是

(9.11)p(x|z)=k=1KN(x|μk,Σk)zk

因此向量x,z的联合概率分布为p(x,z)=p(z)p(x|z), 而x的边缘概率分布可以通过将联合概率分布对所有可能的z求和得到,即[注1]

(9.12)p(x)=zp(z)p(x|z)=kKπkN(x|μk,Σk)

  上面一顿操作下来是要干什么啊?用混合高斯分布来表示变量x的分布,然后通过引入一个新的变量z,通过这两个变量联合分布对新变量z所有可能求和,又得到这个混合高斯分布。转了一圈又回来了。

  • 如果可以通过对联合概率关于某个变量所有可能求和可以表示边缘概率分布,即存在p(x)=zp(x,z) 的表示形式,那么对于每个观测数据点xn,存在一个与之对应的潜在变量zn
  • 潜在变量可以显式写出?
  • 我们能够对联合概率分布p(x,z)操作,而不是对边缘概率分布p(x)操作,这会极大地简化计算
  • 给定x的条件下,z的条件概率可以求出,使用贝叶斯定理得到

(9.13)p(zk=1|x)=p(zk=1)p(x|zk=1)j=1Kp(zj=1)p(x|zj=1)=πkN(x|μk,Σk)j=1KπjN(x|μj,Σj)

我们用 γ(zk) 表示 p(zk=1|x)。如果将 πk 看成 zk=1 的先验概率,则 γ(zk) 就是观测到x之后,对应的后验概率。对应混合模型,γ(zk) 也可以被看着第k个分量对应"解释"观测值x的"责任"[注2]。(zk=1等价于变量z的第k分量是1,其余分量是0.即z=(0,0,,0,1,0,,0)

最大似然

  假设我们有一个观测的数据集 x1,...,xn, 我们希望使用混合高斯模型来对数据进行建模。这个数据可以表示为一个 N×D 的矩阵X,其中第n行为xnT。类似地对应的潜在变量被表示为一个N×K 的矩阵Z,它的行为znT。我们假定数据点独立地从概率分布中取样。根据公式(9.7),对数似然函数为

(9.14)ln{p(X|π,μ,Σ)}=n=1Nln{k=1KπkN(xn|μk,Σk)}

求解最大似然函数面临的问题:

(1)奇异性的存在。假设混合高斯模型,它的分量的协方差矩阵为 Σk=σk2I,混合模型的第k分量均值和某个数据点完全相同,即对于某个n值,uk=xn,那么这个数据点为似然函数贡献一项,形式为

(9.15)N(xn|μk,Σk)=1(2π)0.51σk

如果考虑这个方差σk很小,趋于0,那么对数似然函数也会趋于无穷大。因此对数似然函数的最大化不是一个良好定义的问题[注3]

(2)最大化高斯混合模型的对数似然函数,比单一的高斯分布更加复杂。困难源自在公式(9.14)中,对k的求和出现在对数计算的内部,从而对数函数无法之间作用于高斯分布,也就无法简化计算。我们令对数似然函数的导数等于零,也不会得到一个解析解。

用于GM的EM

  有一种优雅的且强大的求解带有潜在变量的模型的最大似然解的方法被称为期望最大化算法,expectation-maximization algorithm,或者简称EM算法。
  首先,令公式(9.14)中关于高斯分量的均值μk导数等于零[注4],得到

(9.16)n=1NπkN(xn|μk,Σk)j=1KπjN(xn|μj,Σj)Σk1(xnμk)=0

用上文提到的后验概率(9.13)代替简化公式得

n=1Nγ(zk)Σk1(xnμk)=0

再对上述公式两侧同时乘以Σk

n=1Nγ(zk)(xnμk)=0

n=1Nγ(znk)xnn=1Nγ(znk)μk=0

(9.17)μk=n=1Nγ(znk)xnn=1Nγ(znk)

可以看到第k个高斯分量的均值μk可以通过对数据集中所有的数据点xn加权平均的方式得到,其中数据点xn的权重因子由后验概率γ(znk)给出。
  令公式(9.14)中关于高斯分布的协方差矩阵Σk的导数等于零[注5],得到

(9.19)Σk=n=1Nγ(znk)(xnμk)(xnμk)Tn=1Nγ(znk)

   最大化公式 (9.14)需考虑限制条件,混合系数之和等于1. 使用拉格朗日乘法,最大化下面的量 (9.20)lnp(X|π,μ,Σ)+λ(kKπk1)
求导得到

(9.21)0=n=1NN(xn|μk,Σk)j=1KπjN(xn|μj,Σj)+λ

上式两边同时乘以πk,然后再对k 求和得到

0=k=1Kn=1NπkN(xn|μk,Σk)j=1KπjN(xn|μj,Σj)+λk=1Kπk

0=n=1Nk=1KπkN(xn|μk,Σk)j=1KπjN(xn|μj,Σj)+λ

从而推导得到 λ=N
再代入公式(9.21)并同时乘以πk得到

(9.22)πk=1Nn=1NπkN(xn|μk,Σk)j=1KπjN(xn|μj,Σj)=1Nn=1Nγ(znk)=NkN

附录

[注0] 为了便于大家与原文进行对比,这里的公式索引,仍采用和书本一样的索引号。

[注1]

p(z)p(x|z)=kKπkzkN(x|μk,Σk)zk=kK{πkN(x|μk,Σk)}zk

由于z取值是"1-of-K",因此zk只1有个是1其余都等于零,即

p(z|zk=1)p(x|z|zk=1)=πkN(x|μk,Σk)

对向量z的所有可能求和就可以得到

p(x)=zp(zzk=1)p(x|zzk=1)=kKπkN(x|μk,Σk)

[注2]
  原文中是这么描述的:γ(zk) can also be viewed as the responsibility that component k takes for 'explaining' the observation x. 直白点讲,能观察到数据点x,高斯混合分布中第k个分布贡献占比是γ(zk),所有的分量贡献比之和等于1.

  设变量z的取值分别是z=(1,0,0),z=(0,1,0),z=(0,0,1),依次对应着颜色red,green,blue。变量z的概率分布,以及x的条件分布依次为

p(z)|z1=1=0.1,p(z)|z2=1=0.3,p(z)|z3=1=0.6

p(x|z1=1)=N(μ1,Σ1),z1=(21),Σ1=(1112)

p(x|z2=1)=N(μ2,Σ2),z2=(11),Σ2=(1112)

p(x|z3=1)=N(μ3,Σ3),z1=(4.52.5),Σ3=(1112)

使用如下代码画出的类似书中图9.5图形如下:

  • 图左:随机从概率分布p(z)取样得到z,再由条件概率分布p(x|z)取样得到二维点x。二维点x可以直接在直角坐标系用点画出,但是z不好直接在绘制在坐标系中,于是映射为一种颜色,然后涂在二维坐标点x上,即一一对应又完整了展示了联合变量(x,z)的取样。
  • 图中:忽略变量z的取值。(实际自然界现象可能很多都是复杂的多元分布,能直观观察到可能就是单个变量的取样,而背后隐藏着无法观察或者未知的,但与当前观察一一对应的某个变量值。)
  • 图右:观察到数据点后,按照后验概率γ(zk|x)公式求出,各个分量贡献占比,然后给数据点着色。可以看出位置点越靠近左右两侧的高斯分布的,其颜色越是接近红色或者蓝色。说明对应分量的影响越大。

import matplotlib.pyplot as plt
import numpy as np
from numpy.linalg import det, inv

global colors 
colors = ['red', 'green', 'blue'] # 颜色值:红、绿、蓝
global prob_colors 
prob_colors = np.array([0.1, 0.3, 0.6]) # 颜色变量Z取值的概率

# 条件概率 prob(x|z=red)
global mu_red
mu_red = np.array([-2, -1])
global sigma_red
sigma_red = np.array([[1,-1],[-1,2]])

# 条件概率 prob(x|z=green)
global mu_green
mu_green = np.array([1, 1])
global sigma_green
sigma_green = np.array([[1,1],[1,2]])

# 条件概率 prob(x|z=green)
global mu_blue
mu_blue = np.array([4.5, 2.5])
global sigma_blue
sigma_blue = np.array([[1,-1],[-1,2]])


def prob_value(x, mu, sigma):
    diff_term = (x - mu).reshape(2,1)
    D = len(x)
    den = (2 * np.pi) ** (D / 2) * np.sqrt(det(sigma))
    num = np.einsum("ij,jk->ik", np.einsum("ij,jk->ik", diff_term.T, inv(sigma)), diff_term)
    num = np.exp(-num / 2).squeeze()
    return num / den

def gamma_z(x):
    x_red = prob_value(x, mu_red, sigma_red)
    x_green = prob_value(x, mu_green, sigma_green)
    x_blue = prob_value(x, mu_blue, sigma_blue)
    den = prob_colors[0] * x_red + prob_colors[1] * x_green + prob_colors[2] * x_blue
    return (prob_colors[0]*x_red/den, prob_colors[1]*x_green/den, prob_colors[2]*x_blue/den)

num = 1000 # 总样本点数
x_red = []
x_green = []
x_blue = []
for i in range(num):
    rands = np.random.choice(colors, 1, p=prob_colors)
    if rands[0] == 'red':
        prob_norm = np.random.multivariate_normal(mu_red, sigma_red, size=1)
        x_red.append(prob_norm[0])
    if rands[0] == 'green':
        prob_norm = np.random.multivariate_normal(mu_green, sigma_green, size=1)
        x_green.append(prob_norm[0])
    if rands[0] == 'blue':
        prob_norm = np.random.multivariate_normal(mu_blue, sigma_blue, size=1)
        x_blue.append(prob_norm[0])

x_red=np.array(x_red)
x_green=np.array(x_green)
x_blue=np.array(x_blue)

x_all = np.concatenate((x_red, x_green, x_blue), axis=0)

gamma_zk = []
for i in range(num):
    xi = x_all[i]
    gamma_zk.append(gamma_z(xi))


plt.figure(figsize=(9,3))
plt.subplot(1,3,1) 
plt.plot(x_red[:,0], x_red[:,1], '.', alpha=1, color='r')
plt.plot(x_green[:,0], x_green[:,1], '.', alpha=1, color='g')
plt.plot(x_blue[:,0], x_blue[:,1], '.', alpha=1, color='b')

plt.subplot(1,3,2)
x_all = np.concatenate((x_red, x_green, x_blue), axis=0)
plt.plot(x_all[:,0], x_all[:,1], '.', alpha=1, color='pink')

tt = np.array([[1,0,0], [0,1,1]])
plt.subplot(1,3,3)
for ind in range(num):
    x = x_all[ind]
    plt.plot(x[0], x[1], '.', alpha=1, c=gamma_zk[ind])
plt.show()

[注3]:为什么单一高斯分布不会出现奇异性问题?

[注4]:如何推导这个(9.14)关于高斯分量均值μk的导数
首先,设f(X)=XTAX,XRn×1,ARn×n

X=(x1x2xn),A=(a11a12a1na21a22a2nan1an2ann)

f(X)=(x1,x2,,xn)(a11a12a1na21a22a2nan1an2ann)(x1x2xn)

f(X)=(x1,x2,,xn)(a11x1+a12x2++a1nxna21x1+a22x2++a2nxnan1x1+an2x2++annxn)

因此f(X)等于下面矩阵的各个元素相加

(a11x1x1a12x1x2a1nx1xna21x2x1a22x2x2a2nx2xnan1xnx1an2xnx2annxnxn)

此时假设矩阵A是对称矩阵, Aj表示矩阵A的第j列, 现在求f(X)关于X中第k个分量的导数,而f(X)中关于包含与xk的,对应上述矩阵的第k行和第k列。再考虑A的对称性,可以得到

akkxkxk+2jknakjxkxj

上式关于xk求导得到

xk=2j=1naj,kxk=2XTAj

从而求得

fXT=(fx1,fx2,,fxn)=(2XTA1,2XTA2,,2XTAn)=2XT(A1,A2,,An)=2XTA

因此,f(X)=XTAX关于向量X的导数为

fXT=2XTAfX=2AX

多元高斯分布的概率密度函数为

N(X|μ,Σ)=1(2π)n|Σ|exp{12(Xμ)TΣ1(Xμ)}

因此关于X的导数为

N(X|μ,Σ)X=N(X|μ,Σ)Σ1(Xμ)

posted @   星辰大海,绿色星球  阅读(86)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示