【问题标题】:Understanding scipy's least square function with IRLS用 IRLS 理解 scipy 的最小二乘函数
【发布时间】:2013-10-27 23:33:22
【问题描述】:

我在理解这个函数的工作原理时遇到了一些麻烦。

a, b = scipy.linalg.lstsq(X, w*signal)[0]

我知道信号是代表信号的数组,目前w 只是[1,1,1,1,1...]

我应该如何操纵Xw 来模仿加权最小二乘法或迭代重新加权最小二乘法?

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

    如果您将 X 和 y 与 sqrt(weight) 相乘,则可以计算加权最小二乘。 您可以通过以下链接获取公式:

    http://en.wikipedia.org/wiki/Linear_least_squares_%28mathematics%29#Weighted_linear_least_squares

    这是一个例子:

    准备数据:

    import numpy as np
    np.random.seed(0)
    N = 20
    X = np.random.rand(N, 3)
    w = np.array([1.0, 2.0, 3.0])
    y = np.dot(X, w) + np.random.rand(N) * 0.1
    

    OLS:

    from scipy import linalg
    w1 = linalg.lstsq(X, y)[0]
    print w1
    

    输出:

    [ 0.98561405  2.0275357   3.05930664]
    

    WLS:

    weights = np.linspace(1, 2, N)
    Xw = X * np.sqrt(weights)[:, None]
    yw = y * np.sqrt(weights)
    print linalg.lstsq(Xw, yw)[0]
    

    输出:

    [ 0.98799029  2.02599521  3.0623824 ]
    

    通过 statsmodels 检查结果:

    import statsmodels.api as sm
    mod_wls = sm.WLS(y, X, weights=weights)
    res = mod_wls.fit()
    print res.params
    

    输出:

    [ 0.98799029  2.02599521  3.0623824 ]
    

    【讨论】:

    • 谢谢!为什么使用 sqrt(重量)?是因为它会在错误计算中平方吗?
    • 当X是一个矩阵时,有没有一种简单的方法来概括它?
    【解决方案2】:

    w 的元素平方根创建一个对角矩阵W。那我想你只是想要:

    scipy.linalg.lstsq(np.dot(W, X), np.dot(W*signal))
    

    关注http://en.wikipedia.org/wiki/Linear_least_squares_(mathematics)#Weighted_linear_least_squares

    【讨论】:

      猜你喜欢
      • 2018-05-16
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 2011-04-27
      • 2019-07-19
      • 2020-05-30
      相关资源
      最近更新 更多