我正在使用scikit-learn来实现Dirichlet过程高斯混合模型:
https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/mixture/dpgmm.py http://scikit-learn.org/stable/modules/generated/sklearn.mixture.BayesianGaussianMixture.html
即sklearn.mixture.BayesianGaussianMixture()
,默认设置为weight_concentration_prior_type = 'dirichlet_process'
。与k-means相反,用户设置群集的数量" k"先验,DPGMM是一个无限混合模型,Dirichlet过程作为聚类数量的先验分布。
我的DPGMM模型始终将确切的簇数输出为n_components
。正如这里所讨论的,处理这个问题的正确方法是减少冗余组件"与predict(X)
:
Scikit-Learn's DPGMM fitting: number of components?
然而,链接到的示例实际上并没有删除冗余组件并显示"正确"数据中的簇数。相反,它只是绘制正确的簇数。
http://scikit-learn.org/stable/auto_examples/mixture/plot_gmm.html
用户如何实际删除冗余组件,并输出应该是这些组件的数组?这是删除冗余集群的官方" /唯一方法吗?
这是我的代码:
>>> import pandas as pd
>>> import numpy as np
>>> import random
>>> from sklearn import mixture
>>> X = pd.read_csv(....) # my matrix
>>> X.shape
(20000, 48)
>>> dpgmm3 = mixture.BayesianGaussianMixture(n_components = 20, weight_concentration_prior_type='dirichlet_process', max_iter = 1000, verbose = 2)
>>> dpgmm3.fit(X) # Fitting the DPGMM model
>>> labels = dpgmm3.predict(X) # Generating labels after model is fitted
>>> max(labels)
>>> np.unique(labels) #Number of lab els == n_components specified above
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19])
#Trying with a different n_components
>>> dpgmm3_1 = mixture.BayesianGaussianMixture( weight_concentration_prior_type='dirichlet_process', max_iter = 1000) #not specifying n_components
>>> dpgmm3_1.fit(X)
>>> labels_1 = dpgmm3_1.predict(X)
>>> labels_1
array([0, 0, 0, ..., 0, 0, 0]) #All were classified under the same label
#Trying with n_components = 7
>>> dpgmm3_2 = mixture.BayesianGaussianMixture(n_components = 7, weight_concentration_prior_type='dirichlet_process', max_iter = 1000)
>>> dpgmm3_2.fit()
>>> labels_2 = dpgmm3_2.predict(X)
>>> np.unique(labels_2)
array([0, 1, 2, 3, 4, 5, 6]) #number of labels == n_components
答案 0 :(得分:3)
目前还没有自动执行方法,但您可以查看估算的weights_
属性和具有较小值的修剪组件(例如,低于0.01)。
修改:哟计算您可以执行的模型有效使用的组件数量:
model = BayesianGaussianMixture(n_components=30).fit(X)
print("active components: %d" % np.sum(model.weights_ > 0.01)
这应该打印一些低于提供的上限的活动组件(在本例中为30)。
编辑2 :n_components
参数指定模型可以使用的最大组件数。可以通过在拟合结束时内省weigths_
属性来检索模型实际使用的有效组件数。它主要取决于数据结构和weight_concentration_prior
的值(特别是如果样本数量很少)。
答案 1 :(得分:2)
检查[1]中描述的排斥高斯混合物。 他们试图使用重叠较少的高斯混合物,因此通常不那么多余。
我还没有找到它的源代码。
[1] https://papers.nips.cc/paper/4589-repulsive-mixtures.pdf