Работа с ошибкой памяти (кластеризация Python sklearn) - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть набор данных, каждый из которых имеет разреженные метки.Итак, ниже показано, как выглядят данные.

[["Снег", "Зима", "Замораживание", "Веселье", "Шапочка", "Обувь", "Головные уборы", "Мех", ""Игра в снегу »,« Фотография »], [« Дерево »,« Небо »,« Дневное время »,« Городской район »,« Филиал »,« Городской район »,« Зима »,« Город »,« Город »,«Уличный фонарь»], ...]

Общее количество этикеток составляет около 50, а количество данных - 200К.И я хочу кластеризовать эти данные, но у меня возникают проблемы с этим.

Я хочу кластеризовать эти данные с помощью четырех алгоритмов кластеризации (AgglomerativeClustering, SpectralClustering, MiniBatchKMeans, KMeans), но ни один из них не работает, потому чтопроблем с памятью.

Ниже приведен мой код.

from scipy.sparse import csr_matrix
from sklearn.cluster import KMeans
from sklearn.cluster import MiniBatchKMeans
from sklearn.cluster import AgglomerativeClustering
from sklearn.cluster import SpectralClustering
import json

NUM_OF_CLUSTERS = 10

with open('./data/sample.json') as json_file:
    json_data = json.load(json_file)
indptr = [0]
indices = []
data = []
vocabulary = {}
for d in json_data:
    for term in d:
        index = vocabulary.setdefault(term, len(vocabulary))
        indices.append(index)
        data.append(1)
    indptr.append(len(indices))

X = csr_matrix((data, indices, indptr), dtype=int).toarray()

# None of these algorithms work properly. I think it's because of memory issues.
# miniBatchKMeans = MiniBatchKMeans(n_clusters=NUM_OF_CLUSTERS, n_init=5, random_state=0).fit(X)
# agglomerative = AgglomerativeClustering(n_clusters=NUM_OF_CLUSTERS).fit(X)
# spectral = SpectralClustering(n_clusters=NUM_OF_CLUSTERS, assign_labels="discretize", random_state=0).fit(X)
#
# print(miniBatchKMeans.labels_)
# print(agglomerative.labels_)
# print(spectral.labels_)
with open('data.json', 'w') as outfile:
    json.dump(miniBatchKMeans.labels_.tolist(), outfile)

Существуют ли решения или другие рекомендации по моей проблеме?

1 Ответ

0 голосов
/ 23 апреля 2019

Каков размер X?

С toarray() вы конвертируете данные в смысловой формат.Это значительно увеличивает требования к памяти.

С экземплярами 200k вы не можете использовать спектральную кластеризацию, а не распространение аффина, потому что для этого требуется O (n²) памяти.Так что вы либо выбираете другие алгоритмы, либо отбираете данные.Очевидно, что также нет смысла использовать kmeans и мини-пакет kmeans (что является приближением к kmeans).Используйте только один.

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

...