Python 用Numpy多边形拟合曲线,用平方根估计函数常数

Python 用Numpy多边形拟合曲线,用平方根估计函数常数,python,numpy,curve-fitting,Python,Numpy,Curve Fitting,首先,很抱歉我的英语很差,谢谢你点击这个问题 我已经有了x和y数据集,所以我想用我的数据集进行曲线拟合 估算模型为 那个么我怎样才能用多元拟合来估计这个模型的常数呢 我知道 np.polyfit(x,y,1) 表示线性方程估计。(1表示线性) 但是,我如何在我的数据集中使用另一个方程(如三个或更多常数的平方根)进行估算呢 a*np.sqrt(x-b) + c ~ y <=> np.sqrt(x-b) ~ (y-c)/a # not entirely true, bu

首先,很抱歉我的英语很差,谢谢你点击这个问题

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

估算模型为

那个么我怎样才能用多元拟合来估计这个模型的常数呢

我知道

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

你想做的是

    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

您可以使用
scipy.optimize.curve\u 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,x,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')
这会给你

数组
popt
(a、b、c)
值的列表


更新

在使用reaver lover提供的真实数据集测试了
curve_fit
之后,我惊讶地发现
curve_fit
在这个相对简单的回归任务中可能会失败

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

def func(x,a,b,c):
    print('%.3f, %.3f, %.3f' % (a,b,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, pcov = curve_fit(func,x,y_true)
popt = [2.252, 5.000, 6.908]
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')
运行此脚本,您将发现系数列表
(a,b,c)
在优化接近结束时以某种方式变为
(nan,nan,nan)
。但是,
曲线拟合
找到的最后一个
(a,b,c)
不是
(nan,nan,nan)
,已经足够好了,如图中所示


我真的不明白为什么
曲线拟合
会失败。

你可以使用
scipy.optimize.curve\u-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,x,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')
这会给你

数组
popt
(a、b、c)
值的列表


更新

在使用reaver lover提供的真实数据集测试了
curve_fit
之后,我惊讶地发现
curve_fit
在这个相对简单的回归任务中可能会失败

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

def func(x,a,b,c):
    print('%.3f, %.3f, %.3f' % (a,b,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, pcov = curve_fit(func,x,y_true)
popt = [2.252, 5.000, 6.908]
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')
运行此脚本,您将发现系数列表
(a,b,c)
在优化接近结束时以某种方式变为
(nan,nan,nan)
。但是,
曲线拟合
找到的最后一个
(a,b,c)
不是
(nan,nan,nan)
,已经足够好了,如图中所示


我真的不明白为什么曲线拟合会失败。

我想问另一个问题,但你呢?对于另一个问题,这个问题有xsry的b次方,但是呢?这个有x的b次方谢谢你回答我,但我已经有了x,y数据,比如
x=[5,11,15,44,60,70,75,100,120,200]y=[2.492,8.330,11.000,19.394,24.466,27.777,29.878,26.952,35.607,46.966]
那么我如何应用这些数据呢?@reaverlover欢迎你,我在你的数据上测试了
曲线拟合
,我惊讶地发现
曲线拟合
在这项任务中失败了。我已经更新了我的帖子,也许有人可以帮我们解决这个问题。谢谢你的回答,但我已经有了x,y数据,比如
x=[5,11,15,44,60,70,75,100,120,200]y=[2.492,8.330,11.000,19.394,24.466,27.777,29.878,26.952,35.607,46.966]
那么我如何应用这些数据呢?@reaverlover欢迎你,我对您的数据进行了
curve\u-fit
测试,我惊讶地发现
curve\u-fit
未能完成此任务。我已经更新了我的帖子,也许有人可以帮我们解决这个问题。