GaussianMixture初始化使用组件参数 - sklearn

时间:2017-02-22 13:30:09

标签: python numpy scikit-learn gaussian mixture

我想使用sklearn.mixture.GaussianMixture来存储高斯混合模型,以便稍后我可以使用score_samples方法在样本点生成样本或值。以下是组件具有以下权重,均值和协方差的示例

import numpy as np
weights = np.array([0.6322941277066596, 0.3677058722933399])
mu = np.array([[0.9148052872961359, 1.9792961751316835], 
               [-1.0917396392992502, -0.9304220945910037]])
sigma = np.array([[[2.267889129267119, 0.6553245618368836], 
                        [0.6553245618368835, 0.6571014653342457]], 
                       [[0.9516607767206848, -0.7445831474157608], 
                        [-0.7445831474157608, 1.006599716443763]]])

然后我将混合物初始化为

from sklearn import mixture
gmix = mixture.GaussianMixture(n_components=2, covariance_type='full')
gmix.weights_ = weights   # mixture weights (n_components,) 
gmix.means_ = mu          # mixture means (n_components, 2) 
gmix.covariances_ = sigma  # mixture cov (n_components, 2, 2) 

最后,我尝试根据导致错误的参数生成样本:

x = gmix.sample(1000)
NotFittedError: This GaussianMixture instance is not fitted yet. Call 'fit' with appropriate arguments before using this method.

据我所知,GaussianMixture旨在使用高斯混合物拟合样本,但有没有办法为它提供最终值并从那里继续?

3 个答案:

答案 0 :(得分:3)

它似乎有一个检查,以确保模型已经过培训。您可以在设置参数之前通过在非常小的数据集上训练GMM来欺骗它。像这样:

gmix = mixture.GaussianMixture(n_components=2, covariance_type='full')
gmix.fit(rand(10, 2))  # Now it thinks it is trained
gmix.weights_ = weights   # mixture weights (n_components,) 
gmix.means_ = mu          # mixture means (n_components, 2) 
gmix.covariances_ = sigma  # mixture cov (n_components, 2, 2)
x = gmix.sample(1000)  # Should work now

答案 1 :(得分:1)

你摇滚,J.P.Petersen! 看到你的答案后,我比较了使用fit方法引入的变化。似乎初始实例化不会创建gmix的所有属性。具体来说,它缺少以下属性,

covariances_
means_
weights_
converged_
lower_bound_
n_iter_
precisions_
precisions_cholesky_

在分配给定输入时引入前三个。其余的,对于我的应用,我需要的唯一属性是precisions_cholesky_,它是反covarinace矩阵的cholesky分解。作为最低要求,我将其添加如下,

gmix.precisions_cholesky_ = np.linalg.cholesky(np.linalg.inv(sigma)).transpose((0, 2, 1))

答案 2 :(得分:1)

要了解正在发生的事情,GaussianMixture首先checks that it has been fitted

self._check_is_fitted()

触发the following check

def _check_is_fitted(self):
    check_is_fitted(self, ['weights_', 'means_', 'precisions_cholesky_'])

最后是last function call

def check_is_fitted(estimator, attributes, msg=None, all_or_any=all):

仅检查分类器是否已具有属性。

所以简而言之,你唯一缺少让它工作(不必fit)就是设置precisions_cholesky_属性:

gmix.precisions_cholesky_ = 0

应该做的伎俩(不能尝试,所以不是100%肯定:P)

但是,如果你想安全并且有一致的解决方案,以防scikit-learn更新它的禁区,@ J.P.Petersen的解决方案可能是最好的方法。