【问题标题】:linalg.lstsq with fixed slope?linalg.lstsq 具有固定斜率?
【发布时间】:2014-06-26 12:06:05
【问题描述】:

假设我们有两个数据数组: x = [1,2,3] y = [2,4,6] 显然,线性拟合将返回 2 的斜率和 0 的截距,当然,Numpy linalg.lstsq()polyfit() 中的两个例程都是成功的。但他们认为斜率和截距是搜索的参数。

是否可以保持斜率固定并只定义截距?

【问题讨论】:

    标签: python numpy least-squares


    【解决方案1】:

    如果拟合方程为y = a*x + b,则在给定固定斜率a = A 的情况下,您可以找到最适合您数据的截距b,如下所示:

    b = np.mean(y - A*x)
    

    如果您有一个固定的截距 b = B 并希望找到最适合您的数据的斜率,则数学运算结果为:

    a = np.dot(X, Y-B) / np.dot(X, X)
    

    【讨论】:

    • 是的,对于一个快速的答案(我实际使用过),但我正在考虑一些可以利用这些例程中的算法的东西。
    • 我很确定没有默认的内置方法来修复 fit 中的某些参数,尽管如果您知道它在内部是如何工作的,这很简单。如果你能推荐一个接口,我可以为下一个 numpy 版本整理一个 PR...
    【解决方案2】:

    你可以使用scipy.optimize.fsolve:

    X = np.array([1, 2, 3])
    Y = np.array([2, 4, 6])
    s = 2
    
    def f(i):
        """Fixed slope 1-deg polynomial residuals"""
        return ((Y - (s*X + i))**2).sum()
    

    它的性能和polyfit差不多:

    In [37]: np.polyfit(X, Y, 1)
    Out[37]: array([  2.00000000e+00,   2.30755522e-15])
    
    In [38]: fsolve(f, x0=1)
    Out[38]: array([  1.63883763e-16])
    

    以及改变坡度:

    In [39]: s = 4
    
    In [40]: fsolve(f, x0=1)
    Out[40]: array([-3.99075568])
    

    我们得到一个新的最优值

    【讨论】:

      猜你喜欢
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多