如何将数据权重包含到 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ᵢ(Ax − b)ᵢ²,受限于 xᵢ ≥ 0 对于所有 i,而不仅仅是 Σᵢ(Ax − b)ᵢ²。这相当于最小化 Σᵢ (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])
我想使用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ᵢ(Ax − b)ᵢ²,受限于 xᵢ ≥ 0 对于所有 i,而不仅仅是 Σᵢ(Ax − b)ᵢ²。这相当于最小化 Σᵢ (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])