在Scikit-Learn库里面调用sklearn.mixture.GaussianMixture
,有3个重要的属性n_clusters
, n_weights
和n_covariance
,分别对应着簇中心的数量、每个簇的重要性和每个簇的协方差矩阵。
重要概念:
-
BIC 贝叶斯信息准则
B I C = l o g ( m ) p ? 2 l o g ( L ^ ) BIC = log(m)p-2log(\hat L) BIC=log(m)p?2log(L^)其中m是样本数,p是模型参数个数, L ^ \hat L L^是最大似然函数的值
-
AIC 赤池信息准则
A I C = 2 p ? 2 l o g ( L ^ ) AIC=2p-2log(\hat L) AIC=2p?2log(L^) -
自由度
计算某一统计量时,取值不受限制的变量个数。通常df=n-k。其中n为样本数量,k为被限制的条件数或变量个数,或计算某一统计量时用到其它独立统计量的个数
问题:p模型的参数个数(即自由度)该如何计算?
假设n_clusters=3
,设数据集的维度为n_dims=2
。
由于每个簇都有一个权重,而且权重和为1,则关于权重的参数个数(即自由度)为2。同样地,对于 n × n n\times n n×n协方差矩阵,它自由度不是 n 2 n^2 n2,而是 1 + 2 + ? ? ? + n = n ( n + 1 ) 2 1+2+···+n=\frac{n(n+1)}{2} 1+2+???+n=2n(n+1)?。下面以python为例,手动计算GaussianMixture的BIC和AIC:
from sklearn.mixture import GaussianMixturegm = GaussianMixture(n_components=3, n_init=10, random_state=42)
gm.fit(X)n_clusters = 3
n_dims = 2
n_params_for_weights = n_clusters - 1
n_params_for_means = n_clusters * n_dims
n_params_for_covariance = n_clusters * n_dims * (n_dim + 1) // 2
n_params = n_params_for_weights + n_params_for_means + n_params_for_covariance
max_log_likelihood = gm.score(X) * len(X) # log(^L)
bic = np.log(len(X)) * n_params - 2 * max_log_likelihood
aic = 2 * n_params - 2 * max_log_likelihood