GMM,高斯混合模型,也可以简写为MOG。高斯模型就是用高斯概率密度函数(正态分布曲线)精确地量化事物,将一个事物分解为若干的基于高斯概率密度函数(正态分布曲线)形成的模型。
高斯混合模型(CMMs)是统计学习理论的基本模型,在可视媒体领域应用广泛。近些年来,随着可视媒体信息的增长和分析技术的深入,GMMs在(纹理)图像分割、视频分析、图像配准、聚类等领域有了进一步的发展。从GMMs的基本模型出发,从理论和应用的角度讨论和分析了GMMs的求解算法,包括EM算法、变化形式等,论述了GMMs的模型选择问题:在线学习和模型约简。在视觉应用领域,介绍了GMMs在图像分段、视频分析、图像配准、图像降噪等领域的扩展模型与方法,详细地阐述了一些最新的典型模型的原理与过程,如用于图像分段的空间约束CMMs、图像配准中的关联点漂移算法。最后,讨论了一些潜在的发展方向与存在的困难问题。
1.图像分段
高斯混合模型在图像分割领域应用广泛,在一般图像上经典过程是将像素映射到特征空间,然后假设特征空间的点由待定参数的GMMs生成,使用EM等算法计算最优的参数值以确定像素的类别。实际上,在图像分割应用中GMMs被看做是一个聚类模型,与特征选择、聚类分析、模型选择、EM算法设计紧密相关。
2.视频分析
CMMs和相关的统计方法广泛应用于视频分段、目标识别和跟踪、错误消除,为手势识别、武器制导、智能交通、视频监控等应用提供服务。
在视频分段方面有不少的工作。早期, Weiss和Adelson根据相邻像素之间的某种相似性,如强度,通过马尔科夫随机场建立了运动分割的统一框架。
3.噪声消除
噪声在图像和视频中不可避免,消除噪声有利于图像与视频分割、特征提取、目标跟踪与识别等后期处理过程。GMMs在图像噪声消除领域多有应用,一个主要的方法是利用GMMs对图像的正交函数基分解系数建模,消除噪声(91 1999年, Wain-wright等人发展了一类多尺度随机过程来表达图像的统计本质,该随机过程定义在多解析系数树的层叠结构之上。
4.图像配准
图像配准和融合是图像和视频分析领域发展的方向之一,在医疗图像处理、航空制导、遥感图像处理、视频监控等领域应用广泛。图像配准通常建立在图像特征提取基础之上,常用的方法有最小二乘估计、小波变换、FFTE息等。CMMs和EM算法亦可用于(3D)图像配准,近些年来,有不少的研究成果。Chui和Rangarajan通过GMMs构建了特征点集配准映射,通过融合EM过程的模拟退火算法计算模型参数。
参数:
n_components : int,默认为1。
混合物成分的数量。
covariance_type : {“完整”(默认),“并列”,“诊断”,“球形”}
描述要使用的协方差参数类型的字符串。必须是以下之一:
‘充分’
每个分量都有自己的通用协方差矩阵
‘绑’
所有分量共享相同的通用协方差矩阵
‘diag’
每个分量都有自己的对角协方差矩阵
‘球形’
每个组件都有其自己的单个方差
tol : float,默认为1e-3。
收敛阈值。当下限平均增益低于此阈值时,EM迭代将停止。
reg_covar : 浮点型,默认为1e-6。
非负正则化添加到协方差的对角线上。允许确保协方差矩阵均为正。
max_iter : int,默认为100。
要执行的EM迭代次数。
n_init : int,默认为1。
要执行的初始化次数。保持最佳结果。
init_params : {‘kmeans’,‘random’},默认为’kmeans’。
用于初始化权重,均值和精度的方法。必须是以下之一:
“K均值” : 责任 是 初始化 使用 K均值。
“随机” : 责任 是 随机初始化的 。
weights_init : 类似数组的形状(n_components,),可选
用户提供的初始权重,默认为无。如果为None,则使用init_params方法初始化权重。
means_init :类 数组,形状(n_components,n_features),可选
用户提供的初始均值,默认为None,如果为None,则使用该init_params方法初始化均值。
precisions_init : 类似数组的字段,可选。
用户提供的初始精度(协方差矩阵的倒数),默认为无。如果为None,则使用’init_params’方法初始化精度。形状取决于’covariance_type’:
(n_components ,) 如果是 '球形' ,
(n_features , n_features ) 如果是 'tied' ,
(n_components , n_features ) 如果是 'diag' ,
(n_components , n_features , n_features ) 如果是 'full'
random_state : int,RandomState实例或无,可选(默认值:无)
如果为int,则random_state是随机数生成器使用的种子;否则为false。如果是RandomState实例,则random_state是随机数生成器;如果为None,则随机数生成器是所使用的RandomState实例np.random。
warm_start : 布尔值,默认为False。
如果’warm_start’为True,则最后一次拟合的结果将用作下一次fit()的初始化。在类似问题上多次调用拟合时,这可以加快收敛速度。在这种情况下,“ n_init”将被忽略,并且在第一次调用时仅发生一次初始化。请参阅词汇表。
verbose : int,默认为0。
启用详细输出。如果为1,则打印当前的初始化和每个迭代步骤。如果大于1,则还将打印对数概率和每个步骤所需的时间。
verbose_interval : int,默认为10。
下一次打印之前完成的迭代次数。
属性:
weights_ : 类似数组的形状(n_components,)
每种混合物成分的重量。
means_ : 数组状,形状(n_components,n_features)
每个混合物成分的平均值。
covariances_ : 类似数组
每个混合物成分的协方差。形状取决于covariance_type:
(n_components ,) 如果是 '球形' ,
(n_features , n_features ) 如果是 'tied' ,
(n_components , n_features ) 如果是 'diag' ,
(n_components , n_features , n_features ) 如果是 'full'
precisions_ : 类似数组
混合物中每种成分的精密度矩阵。精度矩阵是协方差矩阵的逆矩阵。协方差矩阵是对称正定的,因此可以通过精度矩阵等效地对高斯的混合进行参数化。存储精度矩阵而不是协方差矩阵使在测试时计算新样本的对数似然更有效率。形状取决于covariance_type:
(n_components ,) 如果是 '球形' ,
(n_features , n_features ) 如果是 'tied' ,
(n_components , n_features ) 如果是 'diag' ,
(n_components , n_features , n_features ) 如果是 'full'
precisions_cholesky_ : 类似数组
每个混合成分的精确矩阵的cholesky分解。精度矩阵是协方差矩阵的逆矩阵。协方差矩阵是对称正定的,因此可以通过精度矩阵等效地对高斯的混合进行参数化。存储精度矩阵而不是协方差矩阵使在测试时计算新样本的对数似然更有效率。形状取决于covariance_type:
(n_components ,) 如果是 '球形' ,
(n_features , n_features ) 如果是 'tied' ,
(n_components , n_features ) 如果是 'diag' ,
(n_components , n_features , n_features ) 如果是 'full'
converged_ : 布尔
当在fit()中达到收敛时为true,否则为False。
n_iter_ : int
最适合EM达到收敛的步数。
lower_bound_ : 浮动
EM最佳拟合的对数似然(训练数据相对于模型)的下界值。
例:绘制两个高斯混合的密度估计。数据是从具有不同中心和协方差矩阵的两个高斯生成的。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
from sklearn import mixture
n_samples = 300
# generate random sample, two components
np.random.seed(0)
# generate spherical data centered on (20, 20)
shifted_gaussian = np.random.randn(n_samples, 2) + np.array([20, 20])
# generate zero centered stretched Gaussian data
C = np.array([[0., -0.7], [3.5, .7]])
stretched_gaussian = np.dot(np.random.randn(n_samples, 2), C)
# concatenate the two datasets into the final training set
X_train = np.vstack([shifted_gaussian, stretched_gaussian])
# fit a Gaussian Mixture Model with two components
clf = mixture.GaussianMixture(n_components=2, covariance_type='full')
clf.fit(X_train)
# display predicted scores by the model as a contour plot
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.0),
levels=np.logspace(0, 3, 10))
CB = plt.colorbar(CS, shrink=0.8, extend='both')
plt.scatter(X_train[:, 0], X_train[:, 1], .8)
plt.title('Negative log-likelihood predicted by a GMM')
plt.axis('tight')
plt.show()
参考资料:https://scikit-learn.org/0.21/modules/generated/sklearn.mixture.GaussianMixture.html#sklearn.mixture.GaussianMixture
[1]管涛,李玲玲.高斯混合模型、求解算法及视觉应用综述[J].中国图像图形学报,2017,17(12):1-22.