在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 GaussianMixture
gm = 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