Python 线性曲线拟合总是产生斜率和y截距为1

Python 线性曲线拟合总是产生斜率和y截距为1,python,matplotlib,curve-fitting,Python,Matplotlib,Curve Fitting,我试图对一些数据进行线性拟合,但在Python中,我无法得到曲线拟合,只能得到斜率和y截距为1的值。下面是我的代码示例: import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit def func(x, a, b): return a*x + b # This is merely a sample of some of my actual data x = [290.

我试图对一些数据进行线性拟合,但在Python中,我无法得到曲线拟合,只能得到斜率和y截距为1的值。下面是我的代码示例:

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

def func(x, a, b):
    return a*x + b

# This is merely a sample of some of my actual data
x = [290., 300., 310.]
y = [1.87e+21, 2.07e+21, 2.29e+21]

popt, pcov = curve_fit(func, x, y)

print popt

我也尝试过给曲线拟合一个“猜测”,但当我这么做的时候,它会给我一个溢出错误,我猜这是因为数字太大。

我通过使用scipy basinhopping而不是曲线拟合进行大量迭代,得到了Excel的线性拟合。运行迭代需要一点时间,还需要一个错误函数,但这是在不缩放原始数据的情况下完成的

这就得到了x:array([7.72723434e+18,-2.38554994e+20]),但是如果你再试一次,你会发现这有一个非唯一结果的问题,尽管它会给出类似的大概值

下面是fit与Excel解决方案的比较


使用以下方法返回确认正确的结果:

x = [290., 300., 310.]
y = [300., 301., 302.]
我猜是震级
≅ 10英寸\
太大,功能无法正常工作

您可以尝试做的是取两边的对数:

def func(x, a, b):
    # might need to check if ≤ 0.0
    return math.log(a*x + b)

# ... code omitted

y = [48.9802253837, 49.0818355602, 49.1828387704]
然后撤消转换


对于简单的线性近似,还有一种简单的确定方法。

不使用曲线拟合的另一种方法是使用numpy

这将系数打印为
[2.10000000e+19-4.22333333e+21]
,并生成以下图表:


当我将y值除以1e21时,得到的拟合值不是1。也许您可以拟合较小的y值,然后缩放结果curve_fit()的默认初始参数均为1.0,因此,当无法进行拟合时,只有初始参数估计值可用,并且所有参数均为1.0,如本例所示。ams,即使除以1e21,我仍然得到1的斜率。我能看看你的代码吗?@ams,即使我把1e21分开,我的斜率仍然是1。我可以看看你的代码吗?你必须使用
曲线拟合吗?
def func(x, a, b):
    # might need to check if ≤ 0.0
    return math.log(a*x + b)

# ... code omitted

y = [48.9802253837, 49.0818355602, 49.1828387704]
import matplotlib.pyplot as plt
import numpy as np

# This is merely a sample of some of my actual data
x = [290., 300., 310.]
y = [1.87e+21, 2.07e+21, 2.29e+21]

xp = np.linspace(290, 310, 100)

z = np.polyfit(x, y, 1)
p = np.poly1d(z)
print (z)

fig, ax = plt.subplots()
ax.plot(x, y, '.')
ax.plot(xp, p(xp), '-')

plt.show()