두 배열 간의 코사인 거리 계산-Python

아비 섹 타쿠 르

fn기본적 cosine distance으로 두 개의 큰 숫자 배열 (10000, 100) 및 (5000, 100) 행 단위로 계산 하는 함수를 적용하고 싶습니다 . 즉,이 배열의 각 행 조합에 대한 값을 계산합니다.

내 구현 :

import math
def fn(v1,v2):
    sumxx, sumxy, sumyy = 0, 0, 0
    for i in range(len(v1)):
        x = v1[i]; y = v2[i]
        sumxx += x*x
        sumyy += y*y
        sumxy += x*y
    return sumxy/math.sqrt(sumxx*sumyy)
val = []
for i in range(array1.shape[0]):
    for j in range(array2.shape[0]):
        val.append(fn(array1[i, :], array2[j, :]))

이 기능은 매우 빠르고 몇 ms 밖에 걸리지 않습니다.

CPU times: user 4 ms, sys: 0 ns, total: 4 ms
Wall time: 1.24 ms

이를 수행하는 효율적인 방법이 있습니까?

디바 카르

접근 방법 # 1 : 우리는 간단하게 사용할 수있는 Scipy's cdist그와 cosine거리 기능 -

from scipy.spatial.distance import cdist

val_out = 1 - cdist(array1, array2, 'cosine')

접근 방법 # 2 : 사용하는 또 다른 방법 matrix-multiplication-

def cosine_vectorized(array1, array2):
    sumyy = (array2**2).sum(1)
    sumxx = (array1**2).sum(1, keepdims=1)
    sumxy = array1.dot(array2.T)
    return (sumxy/np.sqrt(sumxx))/np.sqrt(sumyy)

접근법 # 3 :np.einsum 다른 것에 대한 자기 제곱 합계를 계산하는 데 사용 -

def cosine_vectorized_v2(array1, array2):
    sumyy = np.einsum('ij,ij->i',array2,array2)
    sumxx = np.einsum('ij,ij->i',array1,array1)[:,None]
    sumxy = array1.dot(array2.T)
    return (sumxy/np.sqrt(sumxx))/np.sqrt(sumyy)

접근 방법 # 4 : 다른 방법에 대한 계산 부담을 줄이기 위해 numexpr모듈 가져 오기 square-root-

import numexpr as ne

def cosine_vectorized_v3(array1, array2):
    sumyy = np.einsum('ij,ij->i',array2,array2)
    sumxx = np.einsum('ij,ij->i',array1,array1)[:,None]
    sumxy = array1.dot(array2.T)
    sqrt_sumxx = ne.evaluate('sqrt(sumxx)')
    sqrt_sumyy = ne.evaluate('sqrt(sumyy)')
    return ne.evaluate('(sumxy/sqrt_sumxx)/sqrt_sumyy')

런타임 테스트

# Using same sizes as stated in the question
In [185]: array1 = np.random.rand(10000,100)
     ...: array2 = np.random.rand(5000,100)
     ...: 

In [194]: %timeit 1 - cdist(array1, array2, 'cosine')
1 loops, best of 3: 366 ms per loop

In [195]: %timeit cosine_vectorized(array1, array2)
1 loops, best of 3: 287 ms per loop

In [196]: %timeit cosine_vectorized_v2(array1, array2)
1 loops, best of 3: 283 ms per loop

In [197]: %timeit cosine_vectorized_v3(array1, array2)
1 loops, best of 3: 217 ms per loop

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

두 파이썬 배열 사이의 유클리드 거리 계산

분류에서Dev

배열 사이의 거리 계산

분류에서Dev

python-python pandas의 두 열 사이의 날짜 시간 계산

분류에서Dev

두 점 사이의 거리 계산 (Haskell)

분류에서Dev

Arduino를 사용하여 두 지점 간의 GPS 거리 계산

분류에서Dev

두 개의 numpy 배열 사이의 거리를 계산할 수없는 이유는 무엇입니까?

분류에서Dev

두 열 사이의 거리를 계산하고 팬더를 그리는 방법

분류에서Dev

두 Pandas DataFrame 열 사이의 Levenshtein 거리를 어떻게 계산합니까?

분류에서Dev

배열의 각 연속 요소 사이의 거리 계산

분류에서Dev

NaN을 포함하는 배열 사이의 거리 계산

분류에서Dev

정점 배열 사이의 거리 계산

분류에서Dev

두 선과 두 호 사이의 최소 거리 계산

분류에서Dev

두 문자열 벡터 간의 코사인 유사성을 어떻게 계산할 수 있습니까?

분류에서Dev

Java에서 두 지리 좌표 사이의 거리 계산

분류에서Dev

두 배열 간의 관계

분류에서Dev

두 배열 간의 관계

분류에서Dev

두 열 사이의 합계 계산

분류에서Dev

두 데이터 프레임의 데카르트 곱에 대한 코사인 거리 계산

분류에서Dev

두 클래스의 위도 점 사이의 거리 계산

분류에서Dev

두 날짜 사이의 Python 계산 기간 길이

분류에서Dev

Python에서 두 datetime 값 사이의 시간 차이 계산

분류에서Dev

두 선 사이의 가장 넓은 거리 계산

분류에서Dev

Oracle에서 두 위도 경도 점 사이의 거리 계산

분류에서Dev

두 테이블 사이의 거리 계산

분류에서Dev

pdb 파일에서 두 원자 사이의 거리 계산

분류에서Dev

두 GPRS 좌표 사이의 거리 계산

분류에서Dev

두 좌표 사이의 거리를 계산하는 방법. ArangoDB

분류에서Dev

자바에서 두 점 사이의 거리 계산

분류에서Dev

KNN 구현을 수행하기 위해 두 개의 다른 모양 numpy 배열 사이의 거리를 계산하는 방법

Related 관련 기사

  1. 1

    두 파이썬 배열 사이의 유클리드 거리 계산

  2. 2

    배열 사이의 거리 계산

  3. 3

    python-python pandas의 두 열 사이의 날짜 시간 계산

  4. 4

    두 점 사이의 거리 계산 (Haskell)

  5. 5

    Arduino를 사용하여 두 지점 간의 GPS 거리 계산

  6. 6

    두 개의 numpy 배열 사이의 거리를 계산할 수없는 이유는 무엇입니까?

  7. 7

    두 열 사이의 거리를 계산하고 팬더를 그리는 방법

  8. 8

    두 Pandas DataFrame 열 사이의 Levenshtein 거리를 어떻게 계산합니까?

  9. 9

    배열의 각 연속 요소 사이의 거리 계산

  10. 10

    NaN을 포함하는 배열 사이의 거리 계산

  11. 11

    정점 배열 사이의 거리 계산

  12. 12

    두 선과 두 호 사이의 최소 거리 계산

  13. 13

    두 문자열 벡터 간의 코사인 유사성을 어떻게 계산할 수 있습니까?

  14. 14

    Java에서 두 지리 좌표 사이의 거리 계산

  15. 15

    두 배열 간의 관계

  16. 16

    두 배열 간의 관계

  17. 17

    두 열 사이의 합계 계산

  18. 18

    두 데이터 프레임의 데카르트 곱에 대한 코사인 거리 계산

  19. 19

    두 클래스의 위도 점 사이의 거리 계산

  20. 20

    두 날짜 사이의 Python 계산 기간 길이

  21. 21

    Python에서 두 datetime 값 사이의 시간 차이 계산

  22. 22

    두 선 사이의 가장 넓은 거리 계산

  23. 23

    Oracle에서 두 위도 경도 점 사이의 거리 계산

  24. 24

    두 테이블 사이의 거리 계산

  25. 25

    pdb 파일에서 두 원자 사이의 거리 계산

  26. 26

    두 GPRS 좌표 사이의 거리 계산

  27. 27

    두 좌표 사이의 거리를 계산하는 방법. ArangoDB

  28. 28

    자바에서 두 점 사이의 거리 계산

  29. 29

    KNN 구현을 수행하기 위해 두 개의 다른 모양 numpy 배열 사이의 거리를 계산하는 방법

뜨겁다태그

보관