Python:线性curve_fit总是产生斜率,y截距为1

时间:2017-04-17 23:11:32

标签: python matplotlib curve-fitting linear

我正在尝试对某些数据进行线性拟合,但我无法在python中获得curve_fit,只能给出斜率和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

我也尝试过给curve_fit一个“猜测”,但是当我这样做时它会给我一个溢出错误,我猜这是因为数字太大了。任何建议都将受到高度赞赏。非常感谢!

3 个答案:

答案 0 :(得分:1)

我通过使用scipy basinhopping而不是curve_fit进行大量迭代,在Excel中获得了一些东西作为Excel的线性拟合。运行迭代需要一些时间,它还需要一个错误函数,但它是在不缩放原始数据的情况下完成的。 Basinhopping docs.

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

def func( x0, x_data, y_data ):

    error = 0
    for x_val, y_val in zip(x_data, y_data): 
        error += (y_val - (x0[0]*x_val + x0[1]))**2

    return error

x_data = [290., 300., 310.]
y_data = [1.87e+21, 2.07e+21, 2.29e+21]
a = 1
b = 1
x0 = [a, b]

minimizer_kwargs = { 'method': 'TNC', 'args': (x_data, y_data) }

res = basinhopping(func, x0, niter=1000000, minimizer_kwargs=minimizer_kwargs)

print res

这给出了x:数组([7.72723434e + 18,-2.38554994e + 20])但是如果你再试一次,你会发现这有非独特结果的问题,虽然它会给出类似的球场值。

以下是适合Excel解决方案的比较。

enter image description here

答案 1 :(得分:1)

不使用curve_fit的另一种方法是使用numpy' polyfit

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()

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

enter image description here

答案 2 :(得分:0)

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

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]

然后撤消转换。

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