我正在使用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)


现在,我遇到的情况是Ab中的某些条目可能会丢失(np.NaN)。就像是,

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


当然,在A_2,b上运行NNLS将不起作用,因为scipy不会期望infnan

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

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


其中mask可以定义为:

mask = ~np.isnan(A_2)


通常,Ab都可能缺少条目。

可能有帮助:

[1] How to include constraint to Scipy NNLS function solution so that it sums to 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构造行掩码。

关于python - Scipy NNLS使用 mask ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42923858/

10-12 21:06