我使用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上运行NNLS,b将无效,因为scipy不期望inf
或nan
。
我们如何执行NNLS屏蔽计算中丢失的条目。实际上,这应该转化为
Minimize |(A_2.x- b)[mask]|
其中mask可以定义为:
mask = ~np.isnan(A_2)
通常,A
和b
都可能缺少参赛作品。
可能有帮助:
[1] How to include constraint to Scipy NNLS function solution so that it sums to 1
答案 0 :(得分:1)
我认为您可以先计算遮罩(确定要包含的点),然后再执行NNLS。给出面具
In []: mask
Out[]:
array([[ True, True, False, True],
[ True, True, True, True]], dtype=bool)
您可以通过检查列中的所有值是否True
沿第一轴使用np.all
来验证是否包含一个点。
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
可以使用相同的构思来构造行掩码。