EM 算法与初值的选择有关,选择不同的初值可能得到不同的参数估计值
。
是观测变量的数据,
是隐变量的数据,
是模型参数。
的极大化,实现极大似然估计。
每次迭代包括两步:
步,求期望,即求
关于
的期望:
称为
函数,这里
是参数的现估计值
步,求极大,即极大化
函数得到参数的新估计值:
在构建具体的EM算法时,重要的是定义
函数。每次迭代中,EM算法通过极大化
函数来增大对数似然函数
EM算法在每次迭代后均提高观测数据的似然函数值,单调递增的,即
在一般条件下EM算法是收敛的,但不能保证收敛到全局最优
函数的 极大-极大算法
函数值(并不一定是极大化
函数),从而增加似然函数值
sklearn.mixture.GaussianMixture
class sklearn.mixture.GaussianMixture(n_components=1, covariance_type='full', tol=0.001,
reg_covar=1e-06, max_iter=100, n_init=1, init_params='kmeans', weights_init=None,
means_init=None, precisions_init=None, random_state=None, warm_start=False, verbose=0, verbose_interval=10)
参数说明:参考了 https://blog.csdn.net/lihou1987/article/details/70833229
n_components
: 混合高斯模型个数,默认为1covariance_type
: 协方差类型,包括{‘full’,‘tied’, ‘diag’, ‘spherical’}
四种,分别对应完全协方差矩阵(元素都不为零),相同的完全协方差矩阵(HMM会用到),对角协方差矩阵(非对角为零,对角不为零),球面协方差矩阵(非对角为零,对角完全相同,球面特性),默认‘full’ 完全协方差矩阵tol
:EM迭代停止阈值,默认为1e-3.reg_covar
: 协方差对角非负正则化,保证协方差矩阵均为正,默认为0max_iter
: 最大迭代次数,默认100n_init
: 初始化次数,用于产生最佳初始参数,默认为1init_params
: {‘kmeans’, ‘random’}
, defaults to ‘kmeans’.初始化参数实现方式,默认用kmeans实现,也可以选择随机产生weights_init
: 各组成模型的先验权重,可以自己设,默认按照7产生means_init
: 初始化均值,同8precisions_init
: 初始化精确度(模型个数,特征个数),默认按照7实现random_state
:随机数发生器warm_start
:若为True,则fit()调用会以上一次fit()的结果作为初始化参数,适合相同问题多次fit的情况,能加速收敛,默认为False。verbose
:使能迭代信息显示,默认为0,可以为1或者大于1(显示的信息不同)verbose_interval
:与13挂钩,若使能迭代信息显示,设置多少次迭代后显示信息,默认10次。#%%
# ---------sklearn GaussianMixture-----
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
from sklearn import mixture
from mpl_toolkits.mplot3d import Axes3D #3维绘图
n_samples = 300
np.random.seed(0)
#%% 以(-10,15) 和(0,20)为中心的高斯分布
shifted_gaussian = np.random.randn(n_samples, 2) + np.array([20, 20])
shifted_gaussian2 = np.random.randn(n_samples, 2) + np.array([-10, 15])
#%% 拉伸的(0,0)为中心的高斯分布
C = np.array([[0, -0.7], [3.5, 0.7]])
stretched_gaussian = np.dot(np.random.randn(n_samples, 2), C)
#%% 数据堆叠
X_train = np.vstack([shifted_gaussian, stretched_gaussian,shifted_gaussian2])
#%% 高斯分布 3个高斯分布
clf = mixture.GaussianMixture(n_components=3, covariance_type='full')
#%% 拟合
clf.fit(X_train)
#%%
x = np.linspace(-20, 30)
y = np.linspace(-20, 40)
#%%
X, Y = np.meshgrid(x, y)
XX = np.array([X.ravel(), Y.ravel()]).T
Z = -clf.score_samples(XX)
#%%
Z = Z.reshape(X.shape)
CS = plt.contour(X, Y, Z, norm=LogNorm(vmin=1.0, vmax=1000), levels=np.logspace(1, 4, 18))
CB = plt.colorbar(CS, shrink=0.8, extend='both')
plt.scatter(X_train[:, 0], X_train[:, 1], 0.8)
plt.show()
# 3D绘图
fig = plt.figure()
ax = Axes3D(fig)
# ax.scatter(X,Y,Z)
ax.plot_surface(X, Y, Z, cmap=plt.cm.autumn)
plt.show()