使用Numpy Polyfit进行曲线拟合,用平方根估计函数常数

问题描述

首先,对不起我的英语不好,谢谢您点击此问题。

我已经有x和y数据集,所以我想对数据集进行曲线拟合。

,估计模型为

enter image description here

那我该如何通过polyfit估计该模型的常数?

我知道

np.polyfit(x,y,1)

表示线性方程估计。 (1表示线性)

但是如何在我的数据集中使用另一个方程,如具有三个或更多常数的平方根来估算。

解决方法

你想做的是

    a*np.sqrt(x-b) + c ~ y
<=> np.sqrt(x-b) ~ (y-c)/a     # not entirely true,but close
<=> x - b ~ (y/a - c/a)**2
<=> x ~ (y/a - c/a)** 2 + b

最后一行表示将x近似为y中的二次多项式。所以

np.polyfit(y,x,2)
,

您可以使用scipy.optimize.curve_fit,这是一个如何执行此操作的示例

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def func(x,a,b,c):
    return a * np.sqrt(x - b) + c

x = np.linspace(2,20,100)
y = func(x,2,-2,3)
y_true = y + 0.1*np.random.normal(size=len(x))

popt,pcov = curve_fit(func,y_true)
y_pred = func(x,*popt)

fig,ax = plt.subplots(figsize=(8,6))
ax.scatter(x,y_true,c='r',label='true',s=6)
ax.plot(x,y_pred,c='g',label='pred')
ax.legend(loc='best')

这会给你

result

数组popt(a,c)值的列表。


更新

在使用reaver爱好者提供的真实数据集测试curve_fit之后,我惊讶地发现curve_fit可能无法完成这一相对简单的回归任务。

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def func(x,c):
    print('%.3f,%.3f,%.3f' % (a,c))
    return a * np.sqrt(x - b) + c

x = np.array([5,11,15,44,60,70,75,100,120,200])
y_true = np.array([2.492,8.330,11.000,19.394,24.466,27.777,29.878,26.952,35.607,46.966])

popt,y_true)
popt = [2.252,5.000,6.908]
y_pred = func(x,label='pred')
ax.legend(loc='best')

运行此脚本,您将在优化快要结束时发现系数(a,c)的列表以某种方式变为(nan,nan,nan)。但是,(a,c)找不到的最后一个(nan,nan)不是curve_fit,正如您在图中所看到的那样

output

我真不知道为什么curve_fit会失败。