首页 > 解决方案 > 预先计算的矩阵在集群中的 dbscan 中消耗大量内存

问题描述

我的 scieniao 有 4000 万个数据集。dbscan 可以在 sklean 中支持这么大的数据集吗?下面是我的代码

result=[]
for line in open("./raw_data1"):
#for line in sys.stdin:
        tagid_result = [0]*10
        line = line.strip()
        fields = line.split("\t")
        if len(fields)<6:
                continue
        tagid = fields[3]
        tagids = tagid.split(":")
        for i in tagids:
                tagid_result[tagid2idx[i]] = 1
        result.append(tagid_result)

distance_matrix = pairwise_distances(X, metric='jaccard')
#print (distance_matrix)
dbscan = DBSCAN(eps=0.1, min_samples=1200, metric="precomputed", n_jobs=-1)
db = dbscan.fit(distance_matrix)
for i in range(0,len(db.labels_)):
        print (db.labels_[i])

它如何改进我的代码以支持大型数据集?

标签: scikit-learncluster-computingdbscan

解决方案


DBSCAN 本身从不要求您的数据以矩阵形式提供,并且只需要线性内存。

对你来说不幸的是,sklearn 作者决定实现 DBSCAN 与原始文章有点不同。这导致他们的实现可能会使用更多的内存。在像您这样的情况下,这些决定可能有缺点。

对于 Jaccard 距离,DBSCAN 的邻域搜索可以很好地加速,例如使用倒排索引。但即便如此,如果您自己实现 DBSCAN 的“教科书”版本,您一次只需要计算一行。


推荐阅读