[预先计算的矩阵在群集的dbscan中花费了很多内存

问题描述 投票:0回答:1

我的科学园中有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-learn cluster-computing dbscan
1个回答
0
投票

DBSCAN本身从不需要您的数据作为矩阵可用,而仅需要线性存储器。

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

对于Jaccard距离,例如可以通过反向索引很好地加速DBSCAN的邻域搜索。但是,即使这样,如果实现DBSCAN yourself的“教科书”版本,则一次只需要计算一行即可。

© www.soinside.com 2019 - 2024. All rights reserved.