如何将数据权重包含到 Scipy NNLS 函数中?

How to include data weight to Scipy NNLS function?

我想使用scipy nnls 函数,但是不支持添加数据权重。

import numpy as np
from scipy.optimize import nnls 

A = np.array([[60, 90, 120], 
              [30, 120, 90]])

b = np.array([67.5, 60])


W = np.array([2, 3])

所以我想知道如何将这个 W 矩阵添加到非负最小二乘中?

所以如果我理解正确的话,你是在试图最小化 Σ Wᵢ(Axb)²,受限于 xᵢ ≥ 0 对于所有 i,而不仅仅是 Σ(Axb)²。这相当于最小化 Σ (diag(sqrt(W))Ax − diag( sqrt(W))b)², 其中 sqrt(W) 表示 W 的逐元素平方根。这个你可以直接用scipy.optimize.nnls解决。

请注意,在您的示例中,这变得相当乏味,因为可以找到具有正条目和 Ax = 的 x b,这意味着加权案例也变得微不足道。

这会产生实际差异的示例,请考虑以下内容,我们将大部分权重放在第一个坐标上:

In [48]: A
Out[48]:
array([[ -40,   90, -120],
       [  30,  120,  -90]])

In [49]: b
Out[49]: array([67.5, 60. ])

In [50]: W = np.array([1000, 3])

In [51]: A @ nnls(A, b)[0]
Out[51]: array([53.1, 70.8])

In [52]: A @ nnls(np.sqrt(W)[:, None] * A, np.sqrt(W) * b)[0]
Out[52]: array([67.3806366 , 89.84084881])