【问题标题】:How to fit any non-linear functions in python?如何在python中拟合任何非线性函数?
【发布时间】:2021-02-25 23:44:54
【问题描述】:

我已经检查了post1post2post3post4,但没有帮助。
我有一个关于特定植物的data,包括两个变量,称为“年龄”和“高度”。它们之间的相关性是非线性的。 为了拟合模型,我假设的一种解决方案如下:
如果非线性函数是

然后我们可以引入一个新变量k,其中

所以我们将第一个非线性函数更改为多线性回归函数。基于此,我有以下代码:

data['K'] = data["Age"].pow(2)

x = data[["Age", "K"]]
y = data["Height"]

model = LinearRegression().fit(x, y)
print(model.score(x, y)) # = 0.9908571840250205

  1. 我做得对吗?
  2. 如何处理三次函数和指数函数?

谢谢。

【问题讨论】:

    标签: python python-3.x regression


    【解决方案1】:

    希望您在这里没有使用 SKLearn 的宗教热情,因为我要建议的答案是完全忽略它。

    如果您有兴趣进行回归分析,以便完全自主地使用拟合函数,我建议您直接缩减到驱动大量此类工作的最小二乘优化算法,您可以使用scipy

    
    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.optimize import leastsq
    
    x, y = np.array([0,1,2,3,4,5]), np.array([0,1,4,9,16,25])
    
    # initial_guess[i] maps to p[x] in function_to_fit, must be reasonable
    initial_guess = [1, 1, 1] 
    
    def function_to_fit(x, p):
        return pow(p[0]*x, 2) + p[1]*x + p[2]
    
    def residuals(p,y,x):
        return y - function_to_fit(x,p)
    
    cnsts = leastsq(
        residuals, 
        initial_guess, 
        args=(y, x)
    )[0]
    
    fig, ax = plt.subplots()
    ax.plot(x, y, 'o')
    
    xi = np.arange(0,10,0.1)
    ax.plot(xi, [function_to_fit(x, cnsts) for x in xi])
    
    plt.show()
    
    

    现在这是解决方案的一种数字方法,因此我建议您花点时间确保您了解这种方法的局限性 - 但对于此类问题,我发现它们对于非- 线性数据集,如果在可线性化的流形内,则无需尝试手动操作。

    【讨论】:

      【解决方案2】:

      三次多项式

      data['x2'] = data["Age"].pow(2)
      data['x3'] = data["Age"].pow(3)
      
      x = data[["Age", "x2","x3"]]
      y = data["Height"]
      
      model = LinearRegression().fit(x, y)
      print(model.score(x, y))
      

      您可以通过拟合 log(y) 来处理指数数据。 或者找一些可以自动拟合多项式的库 t.ex:https://numpy.org/doc/stable/reference/generated/numpy.polyfit.html

      【讨论】:

        猜你喜欢
        • 2017-09-01
        • 2015-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多