徐亦达 概率模型学习 : gmm

单高斯分布 MLE

posterior 正比例于 likelihood * prior
p ( θ ∣ x ) ∝ p ( x ∣ θ ) ∗ p ( θ ) p(\theta | x) \propto p(x|\theta) * p(\theta) p(θx)p(xθ)p(θ)
参 数 θ 的 后 验 分 布 ∝ 参 数 θ 表 示 的 x 分 布 上 已 知 样 本 有 多 大 概 率 ∗ 参 数 θ 的 先 验 分 布 参数\theta的后验分布 \propto 参数\theta表示的x分布上已知样本有多大概率 * 参数\theta的先验分布 θθxθ
参 数 的 后 验 ∝ 样 本 的 l i k e l i h o o d ∗ 参 数 的 先 验 参数的后验 \propto 样本的likelihood * 参数的先验 likelihood
MLE : max log_likelihood estimator
MAP: max a posterior

混合高斯分布(多个高斯分布混合在一起) MLE
徐亦达 概率模型学习 : gmm_第1张图片

单高斯混合分布, 只需要令: ∂ L ∂ u = 0 \frac{\partial{L}}{\partial{u}}=0 uL=0 ∂ L ∂ Σ = 0 \frac{\partial{L}}{\partial{\Sigma}}=0 ΣL=0 ; 即可一步到位的精确的求出 u 和 Σ u和\Sigma uΣ的值

混合高斯分布,由于L中有log(多个式子求和), 而log(多个式子求和)求出导数是可以的, 但 要解 ∂ L ∂ u = 0 \frac{\partial{L}}{\partial{u}}=0 uL=0 ∂ L ∂ Σ = 0 \frac{\partial{L}}{\partial{\Sigma}}=0 ΣL=0 比较难, 所以 没法一步到位精确求解,只能迭代求解 。 此迭代求解方法 即 EM算法

即:
解方程 ∂ l o g ( 多 个 式 子 的 乘 积 ) ∂ 其 中 一 个 变 量 \frac{\partial{log(多个式子的乘积)}}{\partial{其中一个变量}} log() = 0 较难
解方程 ∂ l o g ( 多 个 式 子 的 和 ) ∂ 其 中 一 个 变 量 \frac{\partial{log(多个式子的和)}}{\partial{其中一个变量}} log() = 0 较容易
注意:两者的导数都可以求得出来

EM算法(混合高斯分布)
徐亦达 概率模型学习 : gmm_第2张图片

中心点或均值u、形状或协方差矩阵 Σ \Sigma Σ
徐亦达 概率模型学习 : gmm_第3张图片

em算法迭代过程演示

e m 算 法 参 数 Θ 初 始 化 为 Θ ( 1 ) em算法参数\Theta初始化为\Theta^{(1)} emΘΘ(1)
e m 算 法 第 1 次 迭 代 结 果 Θ ( 2 ) em算法第1次迭代结果\Theta^{(2)} em1Θ(2)
e m 算 法 第 2 次 迭 代 结 果 Θ ( 3 ) em算法第2次迭代结果\Theta^{(3)} em2Θ(3)
e m 算 法 第 f 次 迭 代 结 果 ( e m 算 法 收 敛 时 的 结 果 ) Θ ( f ) em算法第f次迭代结果(em算法收敛时的结果) \Theta^{(f)} emf(em)Θ(f)

em迭代描述
徐亦达 概率模型学习 : gmm_第4张图片
em算法迭代过程描述:
Θ ( g + 1 ) = Θ ( g ) \Theta^{(g+1)}=\Theta^{(g)} Θ(g+1)=Θ(g)
Θ ( g + 1 ) = a r g m a x Θ ∫ z l o g p ( X , z ∣ Θ ) p ( z ∣ X , Θ ( g ) ) d z \Theta^{(g+1)}={argmax}_{\Theta}\int_{z} {log p(X,z|\Theta) p(z|X,\Theta^{(g)})} dz Θ(g+1)=argmaxΘzlogp(X,zΘ)p(zX,Θ(g))dz (这里看完后 弄清楚了 回头要明确一下)

em算法引入的隐变量z应该保持边缘分布不变:
徐亦达 概率模型学习 : gmm_第5张图片

这里的 z i z_i zi 就是前面"EM算法(混合高斯分布)" 中的 α l \alpha_l αl
上图 p ( x i ) p(x_i) p(xi) 就是 p ( x i ∣ Θ ) p(x_i|\Theta) p(xiΘ)

em算法中 log_likelihood l o g p ( X ∣ Θ ) log p(X|\Theta) logp(XΘ) 逐步增加 推导 1
徐亦达 概率模型学习 : gmm_第6张图片
如果 对于任意 Θ \Theta Θ H ( Θ ( g ) , Θ ( g ) ) ≥ H ( Θ , Θ ( g ) ) H(\Theta^{(g)}, \Theta^{(g)} ) \ge H(\Theta, \Theta^{(g)} ) H(Θ(g),Θ(g))H(Θ,Θ(g))
H ( Θ ( g ) , Θ ( g ) ) ≥ H ( Θ ( g + 1 ) , Θ ( g ) ) H(\Theta^{(g)}, \Theta^{(g)} ) \ge H(\Theta^{(g+1)}, \Theta^{(g)} ) H(Θ(g),Θ(g))H(Θ(g+1),Θ(g))

em算法中 log_likelihood l o g p ( X ∣ Θ ) log p(X|\Theta) logp(XΘ) 逐步增加 推导 2
徐亦达 概率模型学习 : gmm_第7张图片
Jensen’s inequality (琴生不等式)

sklearn 手写数字数据集 gmm 例子 (图片的一个像素点被当成一个随机变量)
徐亦达 概率模型学习 : gmm_第8张图片

"""sklearn 手写数字数据集 gmm 例子 (图片的一个像素点被当成一个随机变量)
来自 https://jakevdp.github.io/PythonDataScienceHandbook/05.12-gaussian-mixtures.html
或 https://github.com/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/05.12-Gaussian-Mixtures.ipynb
"""

import numpy as np
from sklearn.datasets import load_digits
from matplotlib import pyplot as plt
def plot_digits(data):
    fig, ax = plt.subplots(10, 10, figsize=(8, 8),
                           subplot_kw=dict(xticks=[], yticks=[]))
    fig.subplots_adjust(hspace=0.05, wspace=0.05)
    for i, axi in enumerate(ax.flat):
        im = axi.imshow(data[i].reshape(8, 8), cmap='binary')
        im.set_clim(0, 16)
    plt.show()

digits = load_digits()
print(digits.data.shape)#(1797, 64)

# plot_digits(digits.data)

from sklearn.decomposition import PCA
pca = PCA(n_components=0.99, whiten=True)
data = pca.fit_transform(digits.data)
print(data.shape)#(1797, 41)

from sklearn.mixture import GaussianMixture
"""
n_components = np.arange(50, 210, 10)
models = [GaussianMixture(n_components=n, covariance_type='full', random_state=0) for n in n_components]
aics = [model.fit(data).aic(data) for model in models]
plt.plot(n_components, aics); plt.show()
"""

gmm = GaussianMixture(n_components=150, covariance_type='full', random_state=0)
gmm.fit(data)
print(gmm.converged_)

data_new,label_new = gmm.sample(n_samples=100)
print(data_new.shape)

digits_new = pca.inverse_transform(data_new)
plot_digits(digits_new)

你可能感兴趣的:(机器学习)