2017-02-22 2 views
2

Je souhaite utiliser sklearn.mixture.GaussianMixture pour stocker un modèle de mélange gaussien afin de pouvoir l'utiliser ultérieurement pour générer des échantillons ou une valeur à un point d'échantillonnage en utilisant la méthode score_samples. Voici un exemple où les composants ont le poids suivant, moyenne et covariancesInitialisation de GaussianMixture en utilisant les paramètres de composant - sklearn

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]]]) 

J'initialisés le mélange comme suivre

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) 

Enfin j'ai essayé de générer un échantillon en fonction des paramètres qui ont abouti à une erreur:

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

Si je comprends GaussianMixture est destiné à adapter un échantillon en utilisant un mélange de gaussiennes, mais est-il possible de lui fournir les valeurs finales et co à partir de là?

+0

Vous devez d'abord envoyer vos données dans le modèle pour les former, puis générer uniquement des échantillons aléatoires. Voir la [documentation de sample()] (http://scikit-learn.org/stable/modules/generated/sklearn.mixture.GaussianMixture.html#sklearn.mixture.GaussianMixture.sample) –

+0

Je n'ai pas d'initial les données que j'ai sont les paramètres de chaque composant. Je suis à la recherche d'une solution de contournement ou d'une bibliothèque python alternative. – hashmuke

Répondre

1

You rock, J.P.Petersen! Après avoir vu votre réponse, j'ai comparé la modification introduite en utilisant la méthode fit. Il semble que l'instanciation initiale ne crée pas tous les attributs de gmix. Spécifiquement il manque les attributs suivants,

covariances_ 
means_ 
weights_ 
converged_ 
lower_bound_ 
n_iter_ 
precisions_ 
precisions_cholesky_ 

Les trois premiers sont introduits quand les entrées données sont assignées. Pour le reste, pour mon application, le seul attribut dont j'ai besoin est precisions_cholesky_ qui est la décomposition de la matrice de covariance inverse. En tant que minimum requis je l'ai ajouté comme suit,

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

Il semble qu'il a une vérification qui vérifie que le modèle a été formé. Vous pourriez le tromper en entraînant le GMM sur un très petit jeu de données avant de régler les paramètres. Comme ceci:

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

Pour comprendre ce qui se passe, ce GaussianMixture premier checks that it has been fitted:

self._check_is_fitted() 

qui déclenche the following check:

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

Et enfin le last function call :

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

qui vérifie seulement que le classificateur a déjà les attributs.


Donc en bref, la seule chose que vous avez manquer d'avoir fonctionner (sans avoir à fit il) est de définir precisions_cholesky_ attribut:

gmix.precisions_cholesky_ = 0 

devrait faire l'affaire (ne peut pas essayer si pas 100% sûr: P)

Cependant, si vous voulez jouer en toute sécurité et une solution cohérente en cas scikit-learn met à jour ses contrains, la solution de @JPPetersen est probablement la meilleure façon d'aller .

+0

Ya qui explique quelque chose, j'ai d'abord attaché pour assigner 'gmix.precisions_cholesky_ = None', avec qui j'ai pu générer des échantillons. Cependant cela ne fonctionnera pas si vous appelez 'score_samples', qui s'attend à ce que la valeur soit un tableau numpy avec une dimension similaire à la covariance. – hashmuke