【发布时间】:2018-07-28 01:06:12
【问题描述】:
我有一组向量(~30k),每个向量由fasttext生成的300个元素组成,每个向量代表一个实体的含义,我想计算所有实体之间的相似度,所以我迭代嵌套问题中的向量,O(N^2) 复杂度,在时间上不实用。
您能推荐我另一种计算方法吗,或者我该如何并行化它?
def calculate_similarity(v1, v2):
"""
Calculate cosine distance between two vectors
"""
n1 = np.linalg.norm(v1)
n2 = np.linalg.norm(v2)
return np.dot(v1, v2) / n1 / n2
similarities = {}
for ith_entity, ith_vector in vectors.items():
for jth_entity, jth_vector in vectors.items():
if ith_entity == jth_entity:
continue
if (ith_entity, jth_entity) in similarities.keys() or (jth_entity, ith_entity) in similarities.keys():
continue
similarities[(ith_entity, jth_entity)] = calculate_similarity(ith_vector, jth_vector)
【问题讨论】:
-
300 个维度还是 300 个元素?
-
@MadPhysicist 元素,我来编辑一下
-
不确定,但KMeans 之类的集群算法会在此处提供帮助吗?
-
简单的加速思路:1) 使用对称性作为 i, j 的结果与 j, i 相同。即在所有项目上运行 i,但 j 仅从第一个项目到第 i 个项目。 2)提前对所有项目进行归一化,防止在循环内进行归一化。
-
这个问题对 SO 来说太宽泛了。从您自己的研究开始,尝试一些事情,如果您当时遇到特定问题,请提出另一个问题。
标签: python multithreading multiprocessing python-multiprocessing cosine-similarity