Python 使用掩码的Scipy NNLS

Python 使用掩码的Scipy NNLS,python,numpy,optimization,scipy,lmfit,Python,Numpy,Optimization,Scipy,Lmfit,我正在使用scipy执行非负最小二乘。一个简单的例子如下: 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)。大概 A_2 = A.copy() A_2[

我正在使用scipy执行非负最小二乘。一个简单的例子如下:

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
)。大概

A_2 = A.copy()
A_2[0,2] = np.NaN
当然,在A_2,b上运行NNLS将不起作用,因为scipy不希望出现
inf
nan

我们如何执行NNLS来掩盖计算中缺少的条目。实际上,这应该转化为

Minimize |(A_2.x- b)[mask]|
其中,掩码可定义为:

mask = ~np.isnan(A_2)
通常,
A
b
中的条目都可能丢失

可能有帮助:


[1]

我认为您可以先计算掩码(确定要包括哪些点),然后执行NNLS。假面

In []: mask
Out[]: 
array([[ True,  True, False,  True],
       [ True,  True,  True,  True]], dtype=bool)
通过沿第一个轴使用
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
来构造行掩码。

谢谢。这太完美了!