固定RAM DBSCAN或其他没有预定义簇数的聚类算法?

时间:2018-01-16 12:14:07

标签: python optimization cluster-analysis gensim

我想从我的自定义gensim模型中聚类3.5M 300维word2vec向量,以确定是否可以使用这些聚类来查找与主题相关的单词。它与model.most_similar_...不同,因为我希望附加相当遥远但仍然相关的词语。

模型的总体大小(在向量归一化之后,即model.init_sims(replace=True))在内存中是4GB:

words = sorted(model.wv.vocab.keys())
vectors = np.array([model.wv[w] for w in words]) 
sys.getsizeof(vectors)
4456416112

我尝试了scikit的DBSCAN以及GitHub的其他一些实现,但是在处理过程中它们似乎消耗了越来越多的RAM,并且在一段时间之后崩溃了std::bad_alloc。我有32 GB的RAM和130GB的交换。

指标是欧几里得,I convert my cosine distance threshold cos=0.48 as eps=sqrt(2-2*0.48),因此应该应用所有优化。

问题是我不知道群集的数量,并希望通过设置密切相关的词的阈值来确定它们(让它为cos<0.48d_l2 < sqrt(2-2*0.48))。 DBSCAN似乎在处理小子集,但我无法通过完整数据计算。

Python中是否有任何算法或解决方法可以帮助解决这个问题?

编辑:距离矩阵似乎是一个大小(浮点)= 4字节:3.5M * 3.5M * 4/1024(KB)/ 1024(MB)/ 1024(GB)/ 1024(TB)= 44.5 TB,所以不可能预先计算它。

EDIT2:目前正在尝试使用ELKI,但无法正确地对玩具子集上的数据进行聚类。

0 个答案:

没有答案
相关问题