GaussianMixture initialization using component parameters - sklearn

前端 未结 3 1450
刺人心
刺人心 2021-02-10 01:16

I want to use sklearn.mixture.GaussianMixture to store a gaussian mixture model so that I can later use it to generate samples or a value at a sample point using score_sam

相关标签:
3条回答
  • 2021-02-10 01:43

    It seems that it has a check that makes sure that the model has been trained. You could trick it by training the GMM on a very small data set before setting the parameters. Like this:

    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
    
    0 讨论(0)
  • 2021-02-10 01:58

    You rock, J.P.Petersen! After seeing your answer I compared the change introduced by using fit method. It seems the initial instantiation does not create all the attributes of gmix. Specifically it is missing the following attributes,

    covariances_
    means_
    weights_
    converged_
    lower_bound_
    n_iter_
    precisions_
    precisions_cholesky_
    

    The first three are introduced when the given inputs are assigned. Among the rest, for my application the only attribute that I need is precisions_cholesky_ which is cholesky decomposition of the inverse covarinace matrices. As a minimum requirement I added it as follow,

    gmix.precisions_cholesky_ = np.linalg.cholesky(np.linalg.inv(sigma)).transpose((0, 2, 1))
    
    0 讨论(0)
  • 2021-02-10 01:58

    To understand what is happening, what GaussianMixture first checks that it has been fitted:

    self._check_is_fitted()
    

    Which triggers the following check:

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

    And finally the last function call:

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

    which only checks that the classifier already has the attributes.


    So in short, the only thing you have missing to have it working (without having to fit it) is to set precisions_cholesky_ attribute:

    gmix.precisions_cholesky_ = 0
    

    should do the trick (can't try it so not 100% sure :P)

    However, if you want to play safe and have a consistent solution in case scikit-learn updates its contrains, the solution of @J.P.Petersen is probably the best way to go.

    0 讨论(0)
提交回复
热议问题