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

Я сгруппировал свои данные (75000, 3), используя алгоритм sklearn Gaussian Mix Model (GMM). У меня 4 кластера. Каждая точка моих данных представляет молекулярную структуру. Теперь я хотел бы получить наиболее репрезентативную молекулярную структуру каждого кластера, который, как я понимаю, является центром тяжести кластера. До сих пор я пытался найти точку (структуру), которая находится прямо в центре кластера, используя атрибут gmm.means_, однако эта точная точка не соответствует какой-либо структуре (я использовал numpy.where). Мне нужно было бы получить координаты ближайшей структуры к центроиду, но я не нашел функцию для этого в документации модуля (http://scikit-learn.org/stable/modules/generated/sklearn.mixture.GaussianMixture.html). Как я могу получить репрезентативную структуру каждого кластера?

Большое спасибо за вашу помощь, любое предложение будет оценено.

((Поскольку это общий вопрос, я не считаю необходимым добавлять код, используемый для кластеризации, или какие-либо данные, сообщите мне, если это необходимо))


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


Ответы (2)


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

Этот код может служить примером:

import numpy as np
import matplotlib.pyplot as plt
import scipy.stats
from sklearn import mixture

n_samples = 100
C = np.array([[0.8, -0.1], [0.2, 0.4]])

X = np.r_[np.dot(np.random.randn(n_samples, 2), C),
         np.random.randn(n_samples, 2) + np.array([-2, 1]), 
         np.random.randn(n_samples, 2) + np.array([1, -3])]

gmm = mixture.GaussianMixture(n_components=3, covariance_type='full').fit(X)

plt.scatter(X[:,0], X[:, 1], s = 1)

centers = np.empty(shape=(gmm.n_components, X.shape[1]))
for i in range(gmm.n_components):
    density = scipy.stats.multivariate_normal(cov=gmm.covariances_[i], mean=gmm.means_[i]).logpdf(X)
    centers[i, :] = X[np.argmax(density)]
plt.scatter(centers[:, 0], centers[:, 1], s=20)
plt.show()

Это нарисовало бы центры в виде оранжевых точек:

введите описание изображения здесь

person David Dale    schedule 21.11.2017

Найдите точку с наименьшим расстоянием Махаланобиса до центра скопления.

Потому что GMM использует расстояние Махаланобиса для присвоения баллов. По модели GMM это точка с наибольшей вероятностью принадлежности к этому кластеру.

У вас есть все, что вам нужно для вычисления: кластер means_ и covariances_.

person Has QUIT--Anony-Mousse    schedule 21.11.2017