1

我正在使用 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 不期望 a infor nan

我们如何执行 NNLS,从计算中屏蔽掉丢失的条目。实际上,这应该转化为

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

其中掩码可以定义为:

mask = ~np.isnan(A_2)

A通常,和都可能缺少条目b

可能有帮助:

[1]如何在 Scipy NNLS 函数解决方案中包含约束,使其总和为 1

4

1 回答 1

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构造行掩码。

于 2017-03-21T12:08:01.460 回答