Как установить центры кластеров вручную в KMeans и предсказать вероятности вместо классов? (или ГММ)

Я следую этому примеру здесь:

https://www.stackoverflow.com/questions/60205100/define-cluster-centers-manually< /а>

Он устанавливает начальное положение центроидов и запускает только одну итерацию, поэтому центроиды в конечном итоге становятся изначально установленными. Я смог воспроизвести в своем коде.

Я также ищу вероятности в результате, я смог использовать:

https://scikit-learn.org/0.16/modules/generated/sklearn.mixture.GMM.html

Я пытался использовать тот же подход (init), что и в KMeans, но я не думаю, что есть способ использовать GMM.

Итак, как я могу это сделать? Есть ли другие алгоритмы/способы?

PS: Я понимаю, что это разные алгоритмы, я просто пытаюсь лучше интерпретировать данные.


person Al777    schedule 17.04.2021    source источник
comment
Я не совсем понимаю ваш вопрос. вы хотите получить вероятности каждой точки, принадлежащей кластеру, в kmeans? Когда у вас есть центроиды и кластеры, вы можете предсказать вероятность, верно?   -  person StupidWolf    schedule 17.04.2021
comment
В KMeans я могу предсказать только кластер, а не вероятности попадания в кластеры. В GMM я могу предсказать вероятности, но не могу ввести центры кластеров.   -  person Al777    schedule 17.04.2021


Ответы (1)


Не очень понятно, чего вы пытаетесь добиться здесь. Kmeans работает, минимизируя прозрачное расстояние внутри кластеров, поэтому здесь не так уж много вероятности. Чтобы рассчитать вероятность, вам нужно сделать определенные предположения, например, данные в кластере следуют многомерному гауссову. Ниже приведена приблизительная оценка, и она действительно зависит от ваших данных.

Обратите внимание, что при 1 итерации средние значения могут немного измениться в зависимости от вашего набора данных, например:

from sklearn import datasets
from sklearn.cluster import KMeans
from sklearn.mixture import GaussianMixture
import matplotlib.pyplot as plt

cts = np.array([[1,1],[2,2],[3,3]])

X, y_true = datasets.make_blobs(n_samples=100,
                       centers=cts,
                       cluster_std=0.30,
                       random_state=0)

plt.scatter(X[:,0],X[:,1],c=y_true)

введите здесь описание изображения

Теперь, если мы запустим kmeans, как в этом посте, средства изменятся (немного):

kmeans = KMeans(n_clusters=3, random_state=0,
                init = cts,
               n_init=1).fit(X)

kmeans.cluster_centers_

array([[0.99526578, 1.00152973],
       [1.99987588, 2.10819314],
       [2.94674517, 2.96792463]])

И чтобы ответить на ваш вопрос, чтобы использовать GMM для получения приблизительной вероятности на основе результатов kmeans, мы можем сделать:

clf = GaussianMixture(n_components=3, covariance_type='spherical',
                      means_init = kmeans.cluster_centers_ ,n_init= 1 ,max_iter=1)
                      
clf.fit(X)
clf.predict_proba(X)
person StupidWolf    schedule 18.04.2021