python之如何加快向量集之间余弦相似度的计算

java哥 阅读:29 2024-12-31 21:38:35 评论:0

我有一组向量(~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) 

请您参考如下方法:

您可以通过使用 scipy 摆脱嵌套循环,这很慢。的距离模块。

给定 vectors = {'k1':v1, 'k2':v2, ..., 'km':vm}vi是一个长度为 n 的 Python 列表。

import numpy as np  
from scipy.spatial import distance 
 
# transfrom vectors to m x n numpy array  
data = np.array(list(vectors.values()) 
 
# compute pairwise cosine distance  
pws = distance.pdist(data, metric='cosine') 
pws是压缩距离矩阵。它是一维的,按以下顺序保存距离:
pws = np.array([ (k1, k2), (k1, k3), (k1, k4), ..., (k1, km), 
                           (k2, k3), (k2, k4), ..., (k2, km), 
                                      ..., 
                                                   (km-1, km) ]) 

另请注意 distance.pdist计算余弦距离而不是余弦相似度。


标签:Python
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号