2017-02-22 44 views
2

Я хочу использовать sklearn.mixture.GaussianMixture для хранения модели гауссовой смеси, чтобы потом использовать ее для генерации выборок или значения в точке с использованием метода score_samples. Ниже приведен пример, где компоненты имеют следующий вес, среднее и ковариацииИнициализация GaussianMixture с использованием параметров компонента - 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]]]) 

Затем я инициализирован смесь, как следовать

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 предназначена, чтобы соответствовать образцу с использованием смеси Gaussian, но есть способ, чтобы обеспечить его конечными значениями и со Оттуда?

+0

Сначала вам нужно прокормить свои данные в модели, чтобы обучить его, тогда только он может генерировать случайные образцы. См. [Документация образца()] (http://scikit-learn.org/stable/modules/generated/sklearn.mixture.GaussianMixture.html#sklearn.mixture.GaussianMixture.sample) –

+0

У меня нет начального данные, которые у меня есть, - это параметры каждого компонента. Я ищу обходное решение или альтернативную библиотеку python. – hashmuke

ответ

1

Вы рок, J.P.Petersen! После просмотра ответа я сравнил изменение, внесенное с помощью метода fit. Кажется, что исходное создание не создает всех атрибутов gmix. В частности, отсутствуют указанные ниже атрибуты:

Первые три введены, когда заданные входы назначены. Среди остальных, для моего приложения, единственным атрибутом, который мне нужен, является precisions_cholesky_, который является холеским разложением обратных ковариановых матриц. В качестве минимального требования я добавил его как следует,

gmix.precisions_cholesky_ = np.linalg.cholesky(np.linalg.inv(sigma)).transpose((0, 2, 1)) 
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

Чтобы понять, что происходит, то, что 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 обновляет contrains, решение @JPPetersen, вероятно, лучший способ пойти ,

+0

Я что-то объясняю, я начал привязываться, чтобы назначить 'gmix.precisions_cholesky_ = None', с тем, что я смог сгенерировать образцы. Однако это не сработает, если вы вызываете 'score_samples', который ожидает, что это значение будет массивом numpy с размером, аналогичным ковариации. – hashmuke

 Смежные вопросы

  • Нет связанных вопросов^_^