행렬 을 통 해 두 개의 벡터 집중 요소 두 개의 오 씨 거리 (python 실현) 를 구하 십시오.
2042 단어 기초 알고리즘
많은 알고리즘 에서 벡터 유럽식 거 리 를 구 하 는 것 과 관련된다. 예 를 들 어 기계 학습 중의 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)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
조세 프 링 문제 (구조 체 지침 실현)#include<stdio.h> #include<stdlib.h> struct node{ int data; struct node *next; }; int main(){ int i,j,k,m,n; struct node...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.