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のダウンロードはinfnan期待していないよう

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を行うことができると思います。マスク

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

を考えると、あなたは、列のすべての値が第1の軸に沿ってnp.allを使用してTrueあるかどうかをチェックすることによってポイントを含めるかどうかを確認することができます。

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

ありがとうございます。これは完璧です! –

関連する問題