2017-03-21 12 views
1

Ich mache nicht-negative kleinste Quadrate mit scipy. Ein triviales Beispiel würde wie folgt aussehen:Scipy NNLS mit Maske

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) 

Jetzt habe ich eine Situation, in der einige Einträge in A oder b können fehlen (np.NaN). So etwas wie,

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

Ofcourse, laufen NNLS auf A_2, b wird nicht funktionieren wie scipy keine inf oder nan nicht erwartet.

Wie können wir NNLS durchführen, um den fehlenden Eintrag aus der Berechnung auszublenden. Effektiv diese

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

zu

übersetzen sollte, wo Maske wie folgt definiert werden kann:

mask = ~np.isnan(A_2) 

Im Allgemeinen können Einträge sowohl von A fehlt und b.

Möglicherweise hilfreich:

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

Antwort

1

Ich glaube, Sie die Maske berechnen kann zuerst (bestimmen, welche Punkte Sie enthalten sein sollen) und dann NNLS ausführen. Angesichts der Maske

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

Sie überprüfen können, ob ein Punkt aufzunehmen, indem geprüft wird, ob alle Werte in einer Spalte sind Truenp.all entlang der ersten Achse verwendet wird.

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

Diese kann dann als Spaltenmaske für A verwendet werden.

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

Dieselbe Idee kann für b verwendet werden, um eine Reihe Maske zu konstruieren.

+0

Vielen Dank. Dies ist perfekt! –