【问题标题】:How to include data weight to Scipy NNLS function?如何将数据权重包含到 Scipy NNLS 函数中?
【发布时间】:2020-04-18 00:20:07
【问题描述】:

我想使用 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 矩阵添加到非负最小二乘中?

【问题讨论】:

    标签: python numpy scipy mathematical-optimization least-squares


    【解决方案1】:

    因此,如果我正确理解了这个问题,那么您正在尝试最小化 Σ Wᵢ(Ax - b em>)²,对于所有 ixᵢ ≥ 0 约束,而不仅仅是 Σ(Ax - b)²。这相当于最小化 Σ (diag(sqrt(W))Ax - diag(sqrt(W))b)²,其中 sqrt(W) 表示 W 的元素平方根.这个你可以直接用scipy.optimize.nnls解决。

    请注意,在您的示例中,这变得相当无聊,因为可以找到带有正条目且 Ax = bx ,这意味着加权的情况也变得微不足道。

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

    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])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 2017-12-01
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多