Как я могу попробовать различные компоненты дистрибутива GMM?

Я сгруппировал свои данные (12000, 3), используя алгоритм sklearn Gaussian Mix Model (GMM). У меня 3 кластера. Каждая точка моих данных представляет молекулярную структуру. Я хотел бы знать, как я мог выбрать каждый кластер. Я пробовал с функцией:

gmm = GMM(n_components=3).fit(Data)
gmm.sample(n_samples=20)

но он выполняет выборку всего дистрибутива, но мне нужен образец каждого из компонентов.


person Rachael    schedule 28.03.2018    source источник


Ответы (1)


Ну, это не так просто, так как вам нужно вычислить собственные векторы всех ковариационных матриц. Вот пример кода для проблемы, которую я изучал

import numpy as np
from scipy.stats import multivariate_normal
import random
from operator import truediv
import itertools
from scipy import linalg
import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn import mixture

#import some data which can be used for gmm
mix = np.loadtxt("mixture.txt", usecols=(0,1), unpack=True)
#print(mix.shape)
color_iter = itertools.cycle(['navy', 'c', 'cornflowerblue', 'gold',
                              'darkorange'])

def plot_results(X, Y_, means, covariances, index, title):
#function for plotting the gaussians
    splot = plt.subplot(2, 1, 1 + index)
    for i, (mean, covar, color) in enumerate(zip(
            means, covariances, color_iter)):
        v, w = linalg.eigh(covar)
        v = 2. * np.sqrt(2.) * np.sqrt(v)
        u = w[0] / linalg.norm(w[0])
        # as the DP will not use every component it has access to
        # unless it needs it, we shouldn't plot the redundant
        # components.
        if not np.any(Y_ == i):
            continue
        plt.scatter(X[Y_ == i, 0], X[Y_ == i, 1], .8, color=color)

        # Plot an ellipse to show the Gaussian component
        angle = np.arctan(u[1] / u[0])
        angle = 180. * angle / np.pi  # convert to degrees
        ell = mpl.patches.Ellipse(mean, v[0], v[1], 180. + angle, color=color)
        ell.set_clip_box(splot.bbox)
        ell.set_alpha(0.5)
        splot.add_artist(ell)

    plt.xlim(-4., 3.)
    plt.ylim(-4., 2.)

gmm = mixture.GaussianMixture(n_components=3, covariance_type='full').fit(mix.T)
print(gmm.predict(mix.T))
plot_results(mix.T, gmm.predict(mix.T), gmm.means_, gmm.covariances_, 0,
             'Gaussian Mixture')   

Итак, для моей проблемы результирующий график выглядел так: введите здесь описание изображения

Изменить: здесь ответ на ваш комментарий. Я бы использовал панд для этого. Предположим, что X — это ваша матрица признаков, а y — ваши метки, тогда

import pandas as pd
y_pred = gmm.predict(X)
df_all_info = pd.concat([X,y,y_pred], axis=1)

В результирующем кадре данных вы можете проверить всю необходимую информацию, вы даже можете просто исключить образцы, которые алгоритм неправильно классифицировал:

df_wrong = df_all_info[df_all_info['name of y-column'] != df_all_info['name of y_pred column']]
person pythonic833    schedule 28.03.2018
comment
Это не совсем то, что я имел в виду. У меня есть график, подобный вашему. Мои данные уже распределены по трем кластерам, и я могу видеть кластеры графически, в моем случае я использовал сфероиды, поскольку это трехмерный график. Я хочу знать, какая точка данных соответствует каждому кластеру. Например, если каждая линия представляет собой молекулярную структуру, я хочу знать, принадлежит ли структура, представленная линией 7, кластеру 1, 2 или 3 и так далее. Это или образец каждого кластера, который я могу связать со структурами X. не уверен, что правильно объясняю - person Rachael; 29.03.2018
comment
проверьте мое редактирование, это должен быть ответ, который вы изначально хотели - person pythonic833; 29.03.2018
comment
Это действительно помогло! Большое спасибо! - person Rachael; 29.03.2018