首页 > 解决方案 > scikit-learn 的 GaussianMixture 聚类算法中的 weights_init 参数是如何使用的?

问题描述

前面的问题:如何使用 (GMM) 中的weights_init参数sklearn.mixture.GaussianMixture从单独的 python 包执行的 K-Means 的输出中初始化 GMM?

目标:

  1. 使用 RAPIDS CUML 库对 GPU 集群上的大型数据集执行 K-Means 聚类。
  2. GaussianMixture使用目标 1 的输出进行 初始化。

    要求:确保将外部 K-Means 算法和 scikit-learn 的 GMM 配对导致与默认 GMM 初始化方法相同的行为。

GMM的默认实现如下:

from sklearn.mixture import GaussianMixture

gmm = GaussianMixture(n_components=K, init_params='kmeans')

问题:在阅读文档、检查源代码并寻找其他自定义实现之后,我仍然对我的方法有点不确定,特别是关于输入参数的使用weights_init。我提出的方法如下:

from cuml import KMeans
from sklearn.mixture import GaussianMixture

# KMeans performed on GPU cluster w/ CUML library:
km = KMeans(n_clusters=K)
km.fit_predict(data)
labels = km.labels_
centroids = km.cluster_centers_

# GMM performed on CPU w/ sklearn library:
gmm = GaussianMixture(n_components=K, means_init=centroids, weights_init=???)
labels = gmm.fit_predict(data)
centroids = gmm.means_

我可以想出几种方法来确定weights_init,但我遵循默认实现中使用的方式。我的直觉表明,权重只是数据集中属于特定集群的样本的一部分,但我找不到任何东西来证实这一点。提前感谢任何帮助或澄清。

标签: pythonscikit-learn

解决方案


下面提供了使用 cuML 的 KMeans 为 sklearn 的 GaussianMixture 创建权重以代替默认权重的代码。您需要使用从 cuML 的 KMeans 模型中获得的标签来创建权重。我make_blobs在下面的示例中使用了数据集:

import numpy as np
from cuml.cluster import KMeans as cuKMeans

from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans as skKMeans
from sklearn.metrics import adjusted_rand_score
from sklearn.mixture import GaussianMixture
from sklearn.mixture._gaussian_mixture import _estimate_gaussian_parameters

n_samples = 100
n_features = 2

n_clusters = 5
random_state = 0

data, labels = make_blobs(n_samples=n_samples,
                          n_features=n_features,
                          centers=n_clusters,
                          random_state=random_state,
                          cluster_std=0.1)
km = cuKMeans(n_clusters=n_clusters, n_init=1)
km.fit(data)
label = km.labels_
centroids = km.cluster_centers_

# calculate the weights
resp = np.zeros((n_samples, n_clusters))
resp[np.arange(n_samples), label] = 1

weights, _, _ = _estimate_gaussian_parameters(data, resp, reg_covar=1e-6, covariance_type='full')
weights /= n_samples
print("weights : ", weights)

gmm = GaussianMixture(n_components=n_clusters, means_init=centroids, weights_init=weights)
labels = gmm.fit_predict(data)
gmm_centroids = gmm.means_
print(" gmm_centroids values with cuml weights : ")
print(gmm_centroids)

# default GM without cuml kmeans

default_gmm = GaussianMixture(n_components=n_clusters, means_init=centroids, weights_init=weights)
labels = default_gmm.fit_predict(data)
default_gmm_centroids = default_gmm.means_
print("gmm_centroids values with default weights : ")
print(default_gmm_centroids)

推荐阅读