scikit-learn - 如何获得 GMM 集群的代表点?

标签 scikit-learn cluster-analysis centroid gmm

我已经使用 sklearn 高斯混合模型算法 (GMM) 对我的数据 (75000, 3) 进行了聚类。我有 4 个集群。我的数据的每个点都代表一个分子结构。现在我想得到每个簇最具代表性的分子结构,我理解的是簇的质心。到目前为止,我已经尝试使用 gmm.means_ 属性定位位于集群中心的点(结构),但是该确切点不对应于任何结构(我使用了 numpy.where)。我需要获得最接近质心的结构的坐标,但我没有在模块的文档( http://scikit-learn.org/stable/modules/generated/sklearn.mixture.GaussianMixture.html )中找到执行此操作的函数。如何获得每个集群的代表性结构?

非常感谢您的帮助,任何建议将不胜感激。

((由于这是一个通用问题,我认为没有必要添加用于聚类的代码或任何数据,如果有必要,请告诉我))

最佳答案

对于每个簇,你可以为每个训练点测量其对应的密度,并选择密度最大的点来表示它的簇:

此代码可以作为示例:

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

它会将中心绘制为橙色点:

enter image description here

关于scikit-learn - 如何获得 GMM 集群的代表点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47412749/

相关文章:

python - Scikit K 均值聚类性能度量

python - 在 scipy 中计算成对距离时出现内存错误

javascript - 在谷歌地图中正确定位邮政编码标签

python - 无法获取 Geohash 的边界框

java - 在 K-Mean Java 程序中检索每个簇的质心位置

python - 从数据集中删除异常值

machine-learning - 将二元模型的输出与多类模型的输出进行比较是否公平?

python - 使用 GridsearchCV 提取管道中最佳模型的 MLPRegressor 属性 (n_iter_ )?

python - sklearn SVM/SVC 始终为任何给定输入预测相同的类别

matlab - K均值质心被边缘化为没有数据点[Matlab]