如何在Python中重新创建“Excel Power Trendline”并获取系数?
在Excel中,此数据......
x = [5.5, 6.0, 6.5, 7, 9]
y = [64.0575, 69.656, 75.781, 82.7023, 111.156866]
...创建一个产生回归公式的趋势线:
y = 9.2347 * (x ^ 1.1294)
我想在Python中这样做,所以我可以在我的软件中使用公式中的系数。
谢谢!
答案 0 :(得分:1)
我意识到这个问题是2年,目前3个月,但目前的答案还不完整。这是一个完整的答案。
首先必须了解动力公式的结构。
y = some_number*x^(-another_number)
示例:
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
x = [5.5, 6.0, 6.5, 7, 9]
y = [64.0575, 69.656, 75.781, 82.7023, 111.156866]
popt, pcov = curve_fit(lambda fx,a,b: a*fx**-b, x, y)
power_y = popt[0]*x**-popt[1]
plt.scatter(x, y, label='actual data')
plt.plot(x, power_y, label='power-fit')
plt.legend()
plt.show()
用于说明功率曲线的更好示例可能是:
x = [5.5, 6.0, 6.5, 7, 9]
y = [100, 80, 40, 10, 5]
popt, pcov = curve_fit(lambda fx,a,b: a*fx**-b, x, y)
power_y = popt[0]*x**-popt[1]
plt.scatter(x, y, label='actual data')
plt.plot(x, power_y, label='power-fit')
plt.legend()
plt.show()
如果你想显示一条平滑的线而不是锯齿状的线,请导入numpy并执行此操作:
# make the line smooth instead of jagged
import numpy as np
x = [5.5, 6.0, 6.5, 7, 9]
y = [100, 80, 40, 10, 5]
popt, pcov = curve_fit(lambda fx,a,b: a*fx**-b, x, y)
x_linspace = np.linspace(min(x), max(x), 100)
power_y = popt[0]*x_linspace**-popt[1]
plt.scatter(x, y, label='actual data')
plt.plot(x_linspace, power_y, label='smooth-power-fit')
plt.legend()
plt.show()
所有这一切的关键是使用scipy.optimize.curve_fit
找到正确的系数,并以数学方式了解幂函数的结构。
答案 1 :(得分:0)
如果不确切知道'Power Trendline'是什么,我会假设您可以通过以下方式解决您的问题:
x = [5.5, 6.0, 6.5, 7, 9]
y = []
def formula(arg):
return (9.2347 * (arg ** 1.1294))
for number in x:
y.append(formula(x))
答案 2 :(得分:0)
创建一个函数来定义你想要适合的等式,然后使用scipy中的curvefit(funx,x,y)来获得基于你的x和y参数的拟合值。
def func(x, C, m): return C*x**m
popt, pcov = scipy.optimize.curve_fit(func, x, y)
popt将返回func中的C和m值,pcov我认为是界限但我不太确定。
希望这有点帮助。