#python #scikit-learn
#python #scikit-learn
Вопрос:
Вопрос заранее: как мне использовать weights_init
параметр в sklearn.mixture.GaussianMixture
(GMM) для инициализации GMM из выходных данных K-Means, выполняемых отдельным пакетом python?
Цели:
- Выполните кластеризацию K-средних для большого набора данных в кластере GPU, используя библиотеку RAPIDS CUML.
- Инициализируйте
GaussianMixture
, используя выходные данные objective 1.Требование: убедитесь, что сопряжение внешнего алгоритма K-Means и GMM от scikit-learn приводит к тому же поведению, что и метод инициализации 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
, но мне нужен способ, используемый в реализации по умолчанию. Моя интуиция подсказывает, что веса — это просто доля выборок в наборе данных, которые принадлежат определенному кластеру, но я не могу найти ничего, чтобы подтвердить это. Заранее спасибо за любую помощь или разъяснения.
Ответ №1:
Ниже приведен код для использования KMeans cuML для создания весов для GaussianMixture sklearn вместо весов по умолчанию. Для создания весов необходимо использовать метки, полученные из модели KMeans от cuML. Я использовал 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)