2015-01-05 5 views
1

극심한 학습 기계의 Numpy에서 양방향 배열로 작업하고 있습니다. 내 배열 중 하나 인 H는 무작위 적이며 그 pseudoinverse를 계산하려고합니다. scipy.linalg.pinv2를 사용하면 모든 것이 원활하게 실행됩니다. 그러나 scipy.linalg.pinv를 사용하면 때로는 (시간의 30-40 %) 문제가 발생합니다.Numpy/Scipy pinv 및 pinv2는 다르게 동작합니다.

pinv2를 사용하는 이유는 "높이"와 "와이드"배열에서 pinv2가 더 나은 성능을 보였기 때문입니다 (여기서는 http://vene.ro/blog/inverses-pseudoinverses-numerical-issues-speed-symmetry.html).

H가 열 j가 모두 1이면, pinv (H)는 행 j에서 큰 계수를가집니다. 그런 경우 np.dot (pinv (H), Y)에 몇 개의 나노 값 (Y는 작은 정수의 배열)이 포함되어 있기 때문에 이것이 문제가됩니다.

이제는 선형 대수와 수치 계산이 아니기 때문에 두 가지 함수의 버그 또는 정밀도와 관련된 속성인지 이해할 수 있습니다. 이 질문에 답해 주시면 버그 리포트를 제출할 수 있습니다. 솔직히 말해서 나는 무엇을 써야할지 모를 것입니다.

배열을 np.savetxt (fn, a, '% .2e', ';')로 저장했습니다. 찾으려면 https://dl.dropboxusercontent.com/u/48242012/example.tar.gz을 참조하십시오.

도움을 주시면 감사하겠습니다. 제공된 파일에서 pinv (H) .csv에서 행 14, 33, 55, 56 및 99는 큰 값을 가지며 pinv2 (H)에서는 동일한 행이 더 적절한 값을 갖음을 볼 수 있습니다.

귀하의 도움에 감사드립니다.

+0

정수 대신 부동 소수점 숫자로 전환 하시겠습니까? –

+0

왜 결과가 바뀌 었는지 설명 할 수 있습니까? – marcotama

+0

yr 데이터를 보지 않았지만 값이 32 비트보다 큰 경우 데이터를 NaN 영역으로 강제 전송할 수 있습니다. –

답변

0

즉,이 개 기능은 의사 역행렬 행렬을 계산하는 두 가지 방법을 구현 :

  1. scipy.linalg.pinv은 매우 집중적 인 계산과 메모리를 많이 차지 할 수있다 최소 제곱을 사용합니다. https://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.pinv.html#scipy.linalg.pinv

  2. scipy.linalg.pinv2는 대부분의 경우 작은 메모리 풋 프린트로 실행해야하는 SVD (singular value decomposition)를 사용합니다. https://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.pinv2.html#scipy.linalg.pinv2 numpy.linalg.pinv도이 방법을 구현합니다.

두 가지 다른 평가 방법이므로 결과 행렬은 동일하지 않습니다. 각각의 방법에는 장점과 단점이 있으며, 데이터를 깊이 이해하지 않고 의사 역이 어떤 용도로 사용되어야 할지를 결정하는 것이 항상 쉬운 것은 아닙니다. 나는 단순히 시행 착오를 제안하고 분류 자에게 최상의 결과를주는 것을 사용합니다.

경우에 따라 이러한 기능을 솔루션으로 수렴 할 수 없으므로 scipy.stats.LinAlgError가 발생합니다. 이 경우 두 번째 pinv 구현을 사용하면 오류의 수를 크게 줄일 수 있습니다.