Как получить среднее значение и значение ковариации из модели гауссовой смеси граната

В модели смеси scikit Learn Gaussian мы можем получить среднее значение и ковариацию с помощью

clf = GaussianMixture(n_components=num_clusters, covariance_type="tied", init_params='kmeans')
for i in range(clf.n_components):
    cov=clf.covariances_[i]
    mean=clf.means_[i]

Но в случае гранатовой модели Gaussian Mixture указано, что нет атрибутов, называемых «ковариациями_» и «средними_» Большое спасибо за ваше драгоценное время.


person iforcebd    schedule 15.11.2020    source источник


Ответы (1)


Когда вы запускаете covariance_type="tied", модель предполагает общую ковариационную матрицу для всех компонентов, поэтому приведенный выше код не выполняется. Если covariance_type="tied", то это будет 1 ковариационная матрица под clf.covariances_. См. страницу справки:

«полный» каждый компонент имеет свою общую ковариационную матрицу

«связанные» все компоненты имеют одну и ту же общую ковариационную матрицу

С pomegranate он оценивает ковариационную матрицу для каждого компонента, поэтому хорошее сравнение с запуском GaussianMixture из sklearn с covariance_type="full"

from sklearn import datasets
from sklearn.mixture import GaussianMixture

iris = datasets.load_iris()

clf = GaussianMixture(n_components=3, covariance_type="full", init_params='kmeans')
clf.fit(iris.data)
cov = []
means = []
for i in range(clf.n_components):
    cov.append(clf.covariances_[i])
    means.append(clf.means_[i])

Итак, для компонента или кластера 0:

means[0]

array([5.006, 3.428, 1.462, 0.246])

cov[0]

array([[0.121765, 0.097232, 0.016028, 0.010124],
       [0.097232, 0.140817, 0.011464, 0.009112],
       [0.016028, 0.011464, 0.029557, 0.005948],
       [0.010124, 0.009112, 0.005948, 0.010885]])

Теперь с гранатом:

from pomegranate import GeneralMixtureModel, MultivariateGaussianDistribution

mdl = GeneralMixtureModel.from_samples(MultivariateGaussianDistribution,
                                       n_components=3, X=iris.data)
mdl = mdl.fit(iris.data)

Доступ к параметрам можно получить в разделе distributions, и у вас есть список, равный вашим компонентам. Для первого вы делаете distributions[0], для второго distributions[1] и так далее:

mdl.distributions[0].parameters[0]

[5.005999999999999, 3.4280000000000004, 1.462, 0.24599999999999986]

np.round(mdl.distributions[0].parameters[1],6)

array([[0.121764, 0.097232, 0.016028, 0.010124],
       [0.097232, 0.140816, 0.011464, 0.009112],
       [0.016028, 0.011464, 0.029556, 0.005948],
       [0.010124, 0.009112, 0.005948, 0.010884]])
person StupidWolf    schedule 15.11.2020
comment
Большое спасибо @StupidWolf, я только что нашел концепцию здесь: дома. cs.washington.edu/~jmschr/lectures/pomegranate.html . Но ваше объяснение просто великолепно, еще раз спасибо - person iforcebd; 15.11.2020
comment
рад, что это сработало у вас. Да, это очень полезная веб-ссылка. Спасибо, что поделились - person StupidWolf; 15.11.2020
comment
stackoverflow.com/questions/67137982/ @StupidWolf - person iforcebd; 17.04.2021