Dict кластера и раздела с kmeans python - PullRequest
0 голосов
/ 26 марта 2020

Я ищу решение своей проблемы.

Я использую Kmeans от sklearn, и мне нужен словарь с { cluster : list of partition}

kmeans = KMeans(n_clusters=n)
kmeans.fit(data)

result = zip(data,kmeans.labels_)
sortedR = sorted(result,key=lambda x: x[1])

cluster_nb = {}
for k,v in sortedR:
    if v in cluster_nb:
        cluster_nb[v].append(k)
    else:
        cluster_nb[v] = [k] 

У меня есть позиции кластеров kmoyen. помечает как ключ, но мне нужен соответствующий элемент kmoyen.cluster_centers_

Например:

{'[1,2]' :  [array([1, 3]), array([2,4])], '[5,5]' : [array([7, 8]), array([10,12])]}

Я пытался с новым l oop:

for x in cluster_nb:
    cluster_nb[str(kmeans.cluster_centers_[x])] = cluster_nb.pop(x)
return cluster_nb

Но у меня есть эта ошибка:

IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

Где я делаю свою ошибку?

Есть ли более простое решение?

1 Ответ

0 голосов
/ 26 марта 2020

Попробуйте это:

from sklearn.cluster import KMeans
import numpy as np

data = np.random.randint(100, size=(100, 2))
kmeans = KMeans(n_clusters=5)
kmeans.fit(data)

centroids_partitions = {}
for centr in kmeans.cluster_centers_:
    centroid_label = kmeans.predict([centr])
    partition = []
    for k, v in zip(data, kmeans.labels_):
        if v == centroid_label:
            partition.append(k.ravel())

    centroids_partitions[centroid_label[0]] = partition

print(centroids_partitions)

, который возвращает диктовку, например:

{0: [array([55,  8]), ... ,[truncated], 1: [array([70, 87]), array([77, 63]), ... ]}

, где 0, 1 и т. Д. c - метки кластеров kmeans.labels_

Или, если вы хотите, чтобы центроиды координировались в качестве ключа для dict, замените на:

centroids_partitions[centr[0],centr[1]] = partition

, что выводит:

{(68.29411764705881, 24.470588235294127): [array([72, 19]), array([69,  1]), array([58, 46]), .... ]}
...