행렬 을 통 해 두 개의 벡터 집중 요소 두 개의 오 씨 거리 (python 실현) 를 구하 십시오.

2042 단어 기초 알고리즘
행렬 을 통 해 두 개의 벡터 집중 요소 두 개의 오 씨 거리 (python 실현) 를 구하 십시오.
많은 알고리즘 에서 벡터 유럽식 거 리 를 구 하 는 것 과 관련된다. 예 를 들 어 기계 학습 중의 KNN 알고리즘 은 훈련 집 A 와 테스트 집 B 의 벡터 로 구 성 된 모든 질서 있 는 쌍 (Ai, Bi) 에 대해 Ai 와 Bi 의 유럽식 거 리 를 구 해 야 한다.이렇게 하면 이중 포 함 된 순환 을 가 져 와 벡터 집합 이 클 때 효율 이 높 지 않다.
이 과정 을 행렬 연산 으로 어떻게 실현 하 는 지 소개 한다.
만약 에 두 개의 3 차원 벡터 집합 이 있다 고 가정 하고 행렬 로 표시 한다.
A=[a11a12a21a22a31a32]
B=⎡⎣⎢⎢b11b12b13b21b22b23b31b32b33⎤⎦⎥⎥
A, B 두 집합 중의 원소 두 칸 의 오 씨 거 리 를 요구한다.
먼저 ABT 구하 기:
ABT=⎡⎣⎢⎢⎢⎢⎢∑k=13ak1bk1∑k=13ak2bk1∑k=13ak1bk2∑k=13ak2bk2∑k=13ak1bk3∑k=13ak2bk3⎤⎦⎥⎥⎥⎥⎥
그 다음 에 A 와 BT 에 대해 각각 벡터 의 모 제곱 을 구하 고 2 * 3 행렬 로 확장 합 니 다.
Asq=⎡⎣⎢⎢⎢⎢⎢∑k=13(ak1)2∑k=13(ak2)2∑k=13(ak1)2∑k=13(ak2)2∑k=13(ak1)2∑k=13(ak2)2⎤⎦⎥⎥⎥⎥⎥
Bsq=⎡⎣⎢⎢⎢⎢⎢∑k=13(bk1)2∑k=13(bk1)2∑k=13(bk2)2∑k=13(bk2)2∑k=13(bk3)2∑k=13(bk3)2⎤⎦⎥⎥⎥⎥⎥
그리고:
Asq+Bsq−2ABT=⎡⎣⎢⎢⎢⎢⎢∑k=13(ak1−bk1)2∑k=13(ak2−bk1)2∑k=13(ak1−bk2)2∑k=13(ak2−bk2)2∑k=13(ak1−bk3)2∑k=13(ak2−bk3)2⎤⎦⎥⎥⎥⎥⎥
위의 이 행렬 을 제곱 하면 A, B 벡터 집합 두 칸 의 유럽식 거 리 를 얻 을 수 있다.
다음은 python 구현:
import numpy
def EuclideanDistances(A, B):
    BT = B.transpose()
    vecProd = A * BT
    SqA =  A.getA()**2
    sumSqA = numpy.matrix(numpy.sum(SqA, axis=1))
    sumSqAEx = numpy.tile(sumSqA.transpose(), (1, vecProd.shape[1]))    
    SqB = B.getA()**2
    sumSqB = numpy.sum(SqB, axis=1)
    sumSqBEx = numpy.tile(sumSqB, (vecProd.shape[0], 1))    
    SqED = sumSqBEx + sumSqAEx - 2*vecProd   
    ED = (SqED.getA())**0.5
    return numpy.matrix(ED)

좋은 웹페이지 즐겨찾기