在Python中手动计算Akaike信息标准(AIC)

For*_*est 4 python data-analysis scikit-learn

据我所知,Python中没有AIC包。因此,我尝试手动计算它,以找到数据集中的最佳聚类数量(我使用 K 均值进行聚类)

我在Wiki上遵循等式:

AIC = 2k - 2ln(最大似然)

下面是我当前的代码:

range_n_clusters = range(2, 10)
for n_clusters in range_n_clusters:
    model = cluster.KMeans(n_clusters=n_clusters, init='k-means++', n_init=10, max_iter=300, tol=0.0001,
                           precompute_distances='auto', verbose=0, random_state=None, copy_x=True, n_jobs=1)
    model.fit(X)
    centers = model.cluster_centers_
    labels = model.labels_
    likelihood = ?????
    aic = 2 * len(X.columns) - 2 * likelihood
    print(aic)
Run Code Online (Sandbox Code Playgroud)

有关如何计算似然值的任何指示吗?

// 更新:使用高斯混合模型计算 AIC:

在此输入图像描述

它不是应该看起来像一条曲线吗?(而不是直线)

我的绘图代码:

def aic(X):
  range_n_clusters = range(2, 10)
  aic_list = []
  for n_clusters in range_n_clusters:
     model = mixture.GaussianMixture(n_components=n_clusters, init_params='kmeans')
     model.fit(X)
     aic_list.append(model.aic(X))
  plt.plot(range_n_clusters, aic_list, marker='o')
  plt.show()
Run Code Online (Sandbox Code Playgroud)

agt*_*ver 6

我假设您使用 scikit-learn 来完成这项工作。在这种情况下,有一个与 K-means 相关的模型,称为高斯混合模型。这些模型可以采用 K 均值聚类来初始化。之后,它围绕 K 均值中心对高斯曲线进行建模。这将创建一个概率密度函数,它是输入数据的概括。使用它的优点是您可以计算可能性,从而计算AIC

所以你可以这样做:

from sklearn.mixture import GaussianMixture
model = GaussianMixture(n_components=n_clusters, init_params='kmeans')
model.fit(X)
print(model.aic(X))
Run Code Online (Sandbox Code Playgroud)

像 Py 一样简单。