我的科学园中有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])
如何改善我的代码以支持大型数据集?
DBSCAN本身从不需要您的数据作为矩阵可用,而仅需要线性存储器。
不幸的是,sklearn作者决定实现DBSCAN有点与原始文章不同。这导致它们的实现可能使用更多的内存。在您这样的情况下,这些决定可能会有弊端。
对于Jaccard距离,例如可以通过反向索引很好地加速DBSCAN的邻域搜索。但是,即使这样,如果实现DBSCAN yourself的“教科书”版本,则一次只需要计算一行即可。