数组列表中每个数组组合的余弦相似度得分 Python

Cosine Simiarlity scores for each array combination in a list of arrays Python

我有数组列表,我想计算数组列表中每个数组组合的余弦相似度。

我的完整列表包含 20 个数组,3 x 25000。下面是一小部分选择

import pandas as pd
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity,cosine_distances


C = np.array([[-127, -108, -290],
       [-123,  -83, -333],
       [-126,  -69, -354],
       [-146, -211, -241],
       [-151, -209, -253],
       [-157, -200, -254]])



D = np.array([[-129, -146, -231],
       [-127, -148, -238],
       [-132, -157, -231],
       [ -93, -355, -112],
       [ -95, -325, -137],
       [ -99, -282, -163]])



E = np.array(([[-141, -133, -200],
       [-132, -123, -202],
       [-119, -117, -204],
       [-107, -210, -228],
       [-101, -194, -243],
       [-105, -175, -244]]))


ArrayList = (C,D,E)

我的第一个问题是我得到每个数组的每个元素的成对结果,但是,我想要实现的是将数组作为一个整体来查看的结果。

比如我试试

scores = cosine_similarity(C,D)
scores
array([[0.98078461, 0.98258287, 0.97458466, 0.643815  , 0.71118811,
        0.7929595 ],
       [0.95226207, 0.95528395, 0.9428837 , 0.55905221, 0.63291722,
        0.7240552 ],
       [0.9363733 , 0.93972303, 0.9255921 , 0.51752531, 0.59402196,
        0.68918496],
       [0.98998438, 0.98903931, 0.99377116, 0.85494921, 0.8979725 ,
        0.9449272 ],
       [0.99335622, 0.99255262, 0.99635952, 0.84106771, 0.88619755,
        0.93616556],
       [0.9955969 , 0.99463213, 0.99794805, 0.82706302, 0.8738389 ,
        0.92640196]])


我期待的是奇异值 0.989...(这是一个虚构的数字) 下一个挑战是如何遍历我的数组列表中的每个数组以获得数组的成对结果,如下所示

     C    D       E
C  1.0    0.97   0.95
 
D  0.97   1.0    0.96

E  0.95  0.95    1.0


作为 python 的初学者,我不确定如何进行。任何帮助表示赞赏。

如果我理解正确的话,您要做的是在将每个矩阵用作 1Xn 维向量时获取余弦距离。在我看来,最简单的事情是用 numpy 函数以矢量方式实现余弦相似度。提醒一下,给定两个一维向量 xy,余弦相似度由下式给出:

cosine_similarity = x.dot(y) / (np.linalg.norm(x, 2) * np.linalg.norm(y, 2))

要对这三个指标执行此操作,我们首先将它们展平为一维表示并将它们堆叠在一起:

matrices_1d = temp = np.vstack((C.reshape((1, -1)), D.reshape(1, -1), E.reshape(1,-1)))

现在我们有了每个矩阵的 vector-representation,我们可以使用 np.linalg.norm(read on this functions here) 计算 L2 范数,如下所示:

norm_vec = np.linalg.norm(matrices_1d , ord=2, axis=1)

最后,我们可以计算余弦距离如下:

cos_sim = matrices_1d .dot(matrices_1d .T) / np.outer(norm_vec ,norm_vec)
# array([[1.        , 0.9126993 , 0.9699609 ],
#        [0.9126993 , 1.        , 0.93485159],
#        [0.9699609 , 0.93485159, 1.        ]])

请注意,作为完整性检查,对角线值为 1,因为向量与自身的余弦距离为 1。

余弦距离如果定义为1-cos_sim并且一旦具有相似性就很容易计算。