scikit-learn - 预先计算的矩阵在集群中的 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])
它如何改进我的代码以支持大型数据集?
解决方案
DBSCAN 本身从不要求您的数据以矩阵形式提供,并且只需要线性内存。
对你来说不幸的是,sklearn 作者决定实现 DBSCAN 与原始文章有点不同。这导致他们的实现可能会使用更多的内存。在像您这样的情况下,这些决定可能有缺点。
对于 Jaccard 距离,DBSCAN 的邻域搜索可以很好地加速,例如使用倒排索引。但即便如此,如果您自己实现 DBSCAN 的“教科书”版本,您一次只需要计算一行。
推荐阅读
- javascript - Nodejs从嵌套函数返回结果
- apache-camel - Apache Camel 在处理时手动 NACK 消息
- javascript - 在回调函数的调用之间清空反应状态
- python - 如何填写 QComboBox?
- javascript - 使用 Electron-Builder 的 RaspberryPi SerialPorts 出现问题
- ajax - 如何重新加载表格的一部分?
- macos - 如何使用 GnuPlot 绘制 NetCDF 文件?
- python - 将现有驱动程序的 pageLoadStrategy 从 eager 切换为 normal
- c - If Else 条件中的 Continue 语句给出无限循环
- angular - 提供了重复的列名:角材料数据表