python - scikit-learn 的 GaussianMixture 聚类算法中的 weights_init 参数是如何使用的?
问题描述
前面的问题:如何使用 (GMM) 中的weights_init
参数sklearn.mixture.GaussianMixture
从单独的 python 包执行的 K-Means 的输出中初始化 GMM?
目标:
- 使用 RAPIDS CUML 库对 GPU 集群上的大型数据集执行 K-Means 聚类。
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
,但我遵循默认实现中使用的方式。我的直觉表明,权重只是数据集中属于特定集群的样本的一部分,但我找不到任何东西来证实这一点。提前感谢任何帮助或澄清。
解决方案
下面提供了使用 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)
推荐阅读
- mysql - MySQL-workbench 8 和转义字符
- fancybox - Fancybox 删除第一个或最后一个图像上的上一个和最后一个按钮
- ember.js - 如何修复警告“添加到非交互元素的交互无无效交互”
- javascript - 如何在CKEDITOR中使下标/上标互斥?
- swift - UIWebView 在 iOS 10 中崩溃
- c++ - if语句中无法识别掷骰子号码
- sql - SQL 行名和行标志
- haskell - 将用户输入(整数)转换为条件打印语句
- speech-recognition - 如何使 Dialogflow 语音到文本转录字母而不是单词
- java - spirngframework.ws HttpComponentsMessageSender - 如何设置每个主机的最大连接数?