Каков наилучший способ реализации поэтапного сходства косинусов в Python? - PullRequest
1 голос
/ 08 июля 2019

Код ниже очень неэффективен, учитывая большие матрицы. Есть ли лучший способ реализовать это?

Я уже искал в Интернете это здесь .

import numpy as np

def cosine_similarity(x, y):
    return np.dot(x, y) / (np.sqrt(np.dot(x, x)) * np.sqrt(np.dot(y, y)))

def compare(a, b):

    c = np.zeros((a.shape[0], b.shape[0]))

    for i, ai in enumerate(a):
        for j, bj in enumerate(b):
            c[i, j] = cosine_similarity(ai, bj)

    return c

a = np.random.rand(100,2000)
b = np.random.rand(800,2000)

compare(a,b) # shape -> (100, 800)

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

[Персональное редактирование]

Чтобы эффективно вычислить косинусное подобие, вот решение, которое я написал:

def compare(a, b):
    x = np.atleast_2d(np.sqrt(np.sum(a*a, axis=1))).T
    y = np.atleast_2d(np.sqrt(np.sum(b*b, axis=1))).T
    return a.dot(b.T) / x.dot(y.T)
0 голосов
/ 08 июля 2019

Как и в комментариях, если вы хотите взять произведение двух матриц, то numpy уже имеет эффективную реализацию этого, но это может быть слишком медленным для вас (O (n ^ 3)).

import numpy as np

a=np.array([3,2,1])
b=np.array([1,2,3])
c=a.dot(b)
print(c) #output = 10

Я видел в комментариях, что вас интересует косинусное расстояние между векторами. Для сходства косинусов рассмотрим использование Scipy:

from scipy.spatial.distance import cosine

a=[1,0,1]
b=[0,1,0]
print(cosine(a,b)) #output = 1.0

Это может быть быстрее для ваших нужд. Вот документация .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...