处理内存错误(Python sklearn集群)

处理内存错误(Python sklearn集群),python,python-3.x,scikit-learn,cluster-analysis,Python,Python 3.x,Scikit Learn,Cluster Analysis,我有一个数据集,每个数据都有稀疏的标签。 下面是数据的样子 [[“雪”、“冬天”、“冰冻”、“乐趣”、“海滩”、“鞋类”、“帽子”、“毛皮”、“在雪中玩耍”、“摄影”]、[“树”、“天空”、“白天”、“市区”、“分行”、“大都会区”、“冬季”、“城镇”、“城市”、“街灯”]、…] 标签总数约为50个,数据数量为200K。我想对这些数据进行聚类,但处理起来有点困难 我想用四种聚类算法(凝聚聚类、光谱聚类、MiniBatchKMeans、KMeans)对数据进行聚类,但由于内存问题,这些算法都不起作

我有一个数据集,每个数据都有稀疏的标签。 下面是数据的样子

[[“雪”、“冬天”、“冰冻”、“乐趣”、“海滩”、“鞋类”、“帽子”、“毛皮”、“在雪中玩耍”、“摄影”]、[“树”、“天空”、“白天”、“市区”、“分行”、“大都会区”、“冬季”、“城镇”、“城市”、“街灯”]、…]

标签总数约为50个,数据数量为200K。我想对这些数据进行聚类,但处理起来有点困难

我想用四种聚类算法(凝聚聚类、光谱聚类、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)

我的问题有什么解决方案或其他建议吗?

X的大小是多少

使用
toarray()
可以将数据转换为感测格式。这大大增加了内存需求

对于200k实例,不能使用谱聚类而不是仿射传播,因为它们需要O(n²)内存。因此,要么选择其他算法,要么对数据进行二次采样。显然,同时使用kmeans和minibatch kmeans(这是kmeans的近似值)也是没有用的。只使用一个


为了有效地处理稀疏数据,您可能需要自己实现这些算法。Kmeans是为密集数据设计的,因此在默认情况下为密集数据的实现计时是有意义的。事实上,在稀疏数据上使用平均值是相当值得怀疑的。因此,我也不希望使用kmeans在您的数据上获得很好的结果。

每次我在MacOS中运行此代码时,它都会永久运行。所以我在我的Windows笔记本电脑上运行了相同的代码,过了一段时间内存已满的消息就会中断。我想在MacOS上运行这段代码,我正在用Pycharm运行它。以下是我的选择自定义PyCharm VM选项-Xms1024m-Xmx2048m-XX:ReservedCodeCacheSize=240m-XX:+UseCompressedOops-Dfile.encoding=UTF-8-XX:+UseConcMarkSweepGC-XX:SoftRefLRUPolicyMSPerMB=50-ea-Dsun.io.UseConCaches=false-Djava.net.preferIPv4Stack=true-djjdk.http.auth.tunneling.disabledSchemes=“”-XX:+HeapDumpOnOutOfMemoryError-XX:-ommitstacktraceinfastthrow-Xverify:none-XX:ErrorFile=$USER\u HOME/java\u error\u in_pycharm\u%p.log-XX:HeapDumpPath=$USER\u HOME/java\u error\u in_pycharm.hprof您的java IDE设置显然不会影响python程序。当然,除了胖IDE本身会占用大量内存之外。