目前,我正在比较几种传统的方法来选择一系列点的指数趋势。在我所在的行业中,选择趋势时通常不考虑拟合度,这意味着常用的方法是简单地测量年/年变化,并在一段时间内对这些结果取平均值。这会产生一个因子,但不会产生拟合。所以很难将它与指数回归或其他方法进行比较。所以我的问题是:
如果我为指数曲线预先选择了一个固定的趋势因子,是否有一个简单的方法可以优化“截距”值,使一组数据的总体拟合的平方误差最小?请考虑以下问题:
import numpy as np
from sklearn.metrics import r2_score
from scipy.optimize import curve_fit
# Define exponential function
def ex(x,a,b):
return a*b**x
# Seed data with normally distributed error
x=np.linspace(1,20,20)
np.random.seed(100)
y=ex(x,100,1.01)+3*np.random.randn(20)
# Exponential regression for trend value, fitted values, and r_sq measure
popt, pcov = curve_fit(ex, x, y)
trend,fit,r_sq=(popt[1])-1, ex(x,*popt), r2_score(y,ex(x,*popt))
# Mean Yr/Yr change as an alternative measure of trend
trend_yryr=np.mean(np.diff(y)/y[1:])
print(trend)
print(trend_yryr)
平均年/年变化为数据生成了一个不同的趋势值,我想将其与指数回归的选定趋势进行比较。我的目标是找到截距,使数据上的替代趋势值的平方误差最小,并测量该平方误差以进行比较。感谢您的帮助。
1条答案
按热度按时间mspsb9vt1#
在使用
curve_fit
时,修复参数的一种方法是传递一个lambda函数,该函数对您要修复的参数进行硬编码。popt
是array([100.24989416, 1.00975864])
,而popt2
是array([99.09513612])
。将结果绘制为:您可以使用
lmfit
来完成此操作,这可能会更优雅一点,但这基本上取决于您自己。这两种方法的输出基本上是相同的,因此我不再重复