2017-12-20 3 views
0

저는 A '* A를 계산하는 다른 방법으로 파이썬에서 벤치마킹 테스트를하고 있습니다. A는 N x M 행렬입니다. 가장 빠른 방법 중 하나는 numpy.dot()을 사용하는 것이 었습니다.A의 공분산을 사용하여 A '* A를 계산할 수 있습니까?

numpy.cov() (공분산 행렬을 제공)을 사용하여 동일한 결과를 얻을 수 있다면 궁금합니다. 어떻게 든 가중치를 변경하거나 어떻게 든 A 행렬을 사전 처리합니까? 그러나 나는 성공하지 못했습니다. 누구나 A '* A와 A의 공분산 사이에 관계가 있는지를 알고 있습니까? A는 N 행/관측과 M 열/변수가있는 행렬입니까?

+2

실제 행렬 곱셈이 필요한 경우'''np.dot()'''이 (밀도 배열의 경우 BLAS를 사용하는 경우) 가장 빠릅니다. 다른 접근법을 분석 할 필요가 없습니다. 너는 왜 이것에 흥미가 있니? 귀하의 답변에 대해 – sascha

+0

감사합니다. 내가 일하는 연구원은 행렬 곱셈이'numy.cov()'와'numpy.corrcoef()'에 의해 행해질 수 있는지를 찾고, 파이썬에서 다른 메소드와 비교하여 타이밍을 벤치 마크했다. – AdhityaRavi

+1

이것이 numpy 문제가 아닌 수학 (선형 대수학) 문제라고 생각합니다. 당신은 A.T * A와 공분산 행렬의 일부 변형 사이에 등가 관계가 있는지 묻습니다. – Tai

답변

1

cov source을 살펴보십시오. 함수의 끝 부분에서 다음을 수행합니다.

c = dot(X, X_T.conj()) 

기본적으로 수행 할 점 제품입니다. 그러나 입력, 평균 빼기, 정규화, 빼기 등 모든 작업이 있습니다.

간단히 말해서 np.cov은 내부적으로 정확히 그 작업을 포함하기 때문에 결코 np.dot(A.T, A)보다 빠를 수 없습니다. 말했다

- covariance matrix is computed

enter image description here

또는 파이썬 :

import numpy as np 

a = np.random.rand(10, 3) 

m = np.mean(a, axis=0, keepdims=True) 
x = np.dot((a - m).T, a - m)/(a.shape[0] - 1) 

y = np.cov(a.T) 

assert np.allclose(x, y) # check they are equivalent 

당신이 볼 수 있듯이, 공분산 행렬은 당신이 평균을 뺄 경우 원시 내적에 해당 결과를 샘플 수 (1 빼기)로 나눕니다.

+0

대단히 감사합니다!. 난 내 대답을 가지고 – AdhityaRavi

+0

당신은 오신 것을 환영합니다. – kazemakase

관련 문제