【问题标题】:How to add regularization in Scipy Linear Programming (Non-negative Least-Squares)如何在 Scipy 线性规划(非负最小二乘)中添加正则化
【发布时间】:2016-02-16 12:26:53
【问题描述】:

这是我使用 Scipy's NNLS 的 LP 代码:

import numpy as np
from numpy import array
from scipy.optimize import nnls

def by_nnls(A=None, B=None):
    """ Linear programming by NNLS """
    #print "NOF row = ", A.shape[0]
    A = np.nan_to_num(A)
    B = np.nan_to_num(B)

    x, rnorm = nnls(A,B)
    x = x / x.sum()
    # print repr(x)
    return x

B1 = array([  22.133,  197.087,   84.344,    1.466,    3.974,    0.435,
          8.291,   45.059,    5.755,    0.519,    0.   ,   30.272,
         24.92 ,   10.095])
A1 = array([[   46.35,    80.58,    48.8 ,    80.31,   489.01,    40.98,
           29.98,    44.3 ,  5882.96],
       [ 2540.73,    49.53,    26.78,    30.49,    48.51,    20.88,
           19.92,    21.05,    19.39],
       [ 2540.73,    49.53,    26.78,    30.49,    48.51,    20.88,
           19.92,    21.05,    19.39],
       [   30.95,  1482.24,   100.48,    35.98,    35.1 ,    38.65,
           31.57,    87.38,    33.39],
       [   30.95,  1482.24,   100.48,    35.98,    35.1 ,    38.65,
           31.57,    87.38,    33.39],
       [   30.95,  1482.24,   100.48,    35.98,    35.1 ,    38.65,
           31.57,    87.38,    33.39],
       [   15.99,   223.27,   655.79,  1978.2 ,    18.21,    20.51,
           19.  ,    16.19,    15.91],
       [   15.99,   223.27,   655.79,  1978.2 ,    18.21,    20.51,
           19.  ,    16.19,    15.91],
       [   16.49,    20.56,    19.08,    18.65,  4568.97,    20.7 ,
           17.4 ,    17.62,    25.51],
       [   33.84,    26.58,    18.69,    40.88,    19.17,  5247.84,
           29.39,    25.55,    18.9 ],
       [   42.66,    83.59,    99.58,    52.11,    46.84,    64.93,
           43.8 ,  7610.12,    47.13],
       [   42.66,    83.59,    99.58,    52.11,    46.84,    64.93,
           43.8 ,  7610.12,    47.13],
       [   41.63,   204.32,  4170.37,    86.95,    49.92,    87.15,
           51.88,    45.38,    42.89],
       [   81.34,    60.16,   357.92,    43.48,    36.92,    39.13,
         1772.07,    68.43,    38.07]])

用法:

In [9]: by_nnls(A=A1,B=B1)
Out[9]:
array([ 0.70089761,  0.        ,  0.06481495,  0.14325696,  0.01218972,
        0.        ,  0.02125942,  0.01906576,  0.03851557])

我的问题是如何在 LP 系统中添加regularization 因子? 我对使用 Scipy 以外的解决方案持开放态度。

【问题讨论】:

    标签: python numpy scipy linear-algebra


    【解决方案1】:

    您可以通过使用包含每个变量权重平方根的对角矩阵扩展A 矩阵并向b 向量添加零来表达正则化(假设为典型的对角Tikhonov)最小二乘问题。

    lamb = 1
    n_variables = A1.shape[1]
    
    A2 = concatenate([A1, sqrt(lamb)*eye(n_variables)])
    B2 = concatenate([B1, zeros(n_variables)])
    
    by_nnls(A=A2, B=B2)
    

    尝试将新的成本函数扩展为 sum,您会发现它与在其中添加 norm(lambda * x) ** 2 项完全相同。

    【讨论】:

    • lambda分数如何选择?
    • 这是一个不同且复杂的问题。尝试谷歌搜索“正则化参数选择”。您能做的最好的事情就是拥有一个真正的x 并交叉验证您的模型。
    • 你介意看看我的相关问题吗? stackoverflow.com/questions/35405183/…
    • 关于其他评论(我不能再编辑它了),你不需要有一个真正的xground 来交叉验证你的模型。实际上,这只有在这是一个估计(而不是预测)问题时才有意义。
    猜你喜欢
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多