2017-03-21 6 views
1

scipy를 사용하여 음수가 아닌 최소 제곱을 수행합니다. 다음과 같이 사소한 예는 다음과 같습니다마스크를 사용하는 Scipy NNLS

import numpy as np 
from scipy.optimize import nnls 

A = np.array([[60, 70, 120, 60],[60, 90, 120, 70]], dtype='float32') 
b = np.array([6, 5]) 
x, res = nnls(A, b) 

을 지금, 나는 A 또는 b에서 일부 항목이 누락 될 수있는 상황 (np.NaN)가 있습니다. 뭔가 같은, scipy이 inf 또는 nan을 기대하지 않는

A_2 = A.copy() 
A_2[0,2] = np.NaN 

는 당연히, A_2에 NNLS를 실행, b는 작동하지 않습니다.

누락 된 항목을 계산에서 제외시키기 위해 어떻게 NNLS 마스크를 수행 할 수 있습니까? 마스크는 다음과 같이 정의 할 수있는 효과적으로,이

Minimize |(A_2.x- b)[mask]| 

로 번역한다 : 일반적으로

mask = ~np.isnan(A_2) 

, 항목 Ab 모두에서 누락 될 수있다.

아마 도움 :

[1] How to include constraint to Scipy NNLS function solution so that it sums to 1

답변

1

난 당신이 (당신이 포함하고자하는 포인트를 결정) 첫번째 마스크를 계산 한 후 NNLS을 수행 할 수 있다고 생각합니다. 만약 모든 열의 값은 제 1 축을 따라 np.all를 사용하는 경우 True를 확인하여 포인트를 포함하는지 여부를 확인할 수 마스크

In []: mask 
Out[]: 
array([[ True, True, False, True], 
     [ True, True, True, True]], dtype=bool) 

감안.

In []: np.all(mask, axis=0) 
Out[]: array([ True, True, False, True], dtype=bool) 

이 문자는 A의 열 마스크로 사용할 수 있습니다.

In []: nnls(A_2[:,np.all(mask, axis=0)], b) 
Out[]: (array([ 0.09166667, 0.  , 0.  ]), 0.7071067811865482) 

같은 생각 연속 마스크를 구성 b 위해 사용될 수있다.

+0

감사합니다. 이것은 완벽 해! –