Python 拟合幂律进行外推

Python 拟合幂律进行外推,python,data-fitting,power-law,Python,Data Fitting,Power Law,我正在试图找出如何插值函数,我希望能够在插值范围之外进行小范围的外推。有一些背景理论使我期望因变量x的大值的行为将逐渐收敛到−A·x−n行为(可能有一些偏移)。我想找到最合适的幂律,但只适用于x的大值。有没有一种用Python实现这一点的好方法 我试着用对数线性化的幂律来做最小二乘法,但它给了我一个不合适的拟合——我怀疑这是因为编码错误,而不是数学错误。我想在幂律中引入一个偏移量,这样对数方程就是ln(−y) =ln(A)−N ln(x)−x0)。到目前为止,我得到的是: X_asymptote

我正在试图找出如何插值函数,我希望能够在插值范围之外进行小范围的外推。有一些背景理论使我期望因变量x的大值的行为将逐渐收敛到−A·x−n行为(可能有一些偏移)。我想找到最合适的幂律,但只适用于x的大值。有没有一种用Python实现这一点的好方法

我试着用对数线性化的幂律来做最小二乘法,但它给了我一个不合适的拟合——我怀疑这是因为编码错误,而不是数学错误。我想在幂律中引入一个偏移量,这样对数方程就是ln(−y) =ln(A)−N ln(x)−x0)。到目前为止,我得到的是:

X_asymptote=[]
for i in aX_vals1:
    if i>20*lab_inc(T-1):
        X_asymptote.append(i)
VT1_optimized_asymptote=[]
for i in X_asymptote:
    a=aX_vals1.index(i)
    VT1_optimized_asymptote.append(VT1_optimized_val[a])
#Converting to logs. Note the minus sign! You'll need to put this back in in the unravelling.

X_asymptote_logs=[]
for i in X_asymptote:
    X_asymptote_logs.append(np.log(i))
X_asymptote_logs_array=np.asarray(X_asymptote_logs)

VT1_optimized_asymptote_logs=[]
for i in VT1_optimized_asymptote:
    VT1_optimized_asymptote_logs.append(np.log(-i))
    #VT1_optimized_asymptote_logs.append(-1*np.log(i))
VT1_optimized_asymptote_logs_array=np.asarray(VT1_optimized_asymptote)


#Linear fit
fitfunc=lambda p,x:p[0]+p[1]*x
errfunc=lambda p,x,y:(y-fitfunc(p,x)) 

out=scipy.optimize.leastsq(errfunc,[-4,5],args=(X_asymptote_logs_array,VT1_optimized_asymptote_logs_array),full_output=1)
pfinal=out[0]
covar=out[1]

index=pfinal[1]
amp=np.exp(pfinal[0])

xnew=np.linspace(X_asymptote_logs[0],aX_vals1_array[len(aX_vals1_array)-1],100)
ynew=VT1_optimized(xnew)
plt.title("Optimized value function, linear extrapolation")
plt.plot(aX_vals1_array, VT1_optimized_val_array, 'o', xnew, ynew, '-')
plt.ylabel('Value function with optimized asset allocation')
plt.xlabel('ratio X/Y')
plt.show()
谁能帮我一下吗

非常感谢您的帮助

更新:我有一个务实的解决方案。我刚刚拟合了整个数据范围的幂律。它似乎工作得非常好,代码现在确实需要我想要的,但不是我希望通过此评论理解的方式。我现在拥有的代码是:

#Linear fit
fitfunc=lambda p,x:p[0]+p[1]*(x)
errfunc=lambda p,x,y:(y-fitfunc(p,x)) 

out=scipy.optimize.leastsq(errfunc,[-4,5],args=(np.asarray(X_asymptote_logs),np.asarray(VT1_optimized_asymptote_logs)),full_output=1)
pfinal=out[0]
covar=out[1]

index=pfinal[1]
amp=np.exp(pfinal[0])
print(index,amp)

def VPL(X):
    return -(amp*(X)**(index))

def VT1_optimized1(X):
    if aX_vals1_array[len(aX_vals1_array)-1]>=X:
        VT1_op=scipy.interpolate.UnivariateSpline(aX_vals1_array,VT1_optimized_val_array,k=3,s=0,check_finite=True)
        return VT1_op(X)
    if X>aX_vals1_array[len(aX_vals1_array)-1]:
        VT1_asymptote=scipy.interpolate.UnivariateSpline(aX_vals1_array,VT1_optimized_val_array,k=5,s=0,check_finite=True)
        return VPL(X)


xnew=np.linspace(aX_vals1_array[0],aX_vals1_array[len(aX_vals1_array)-1]*2,100)

y0=[]
for i in xnew:
    y0.append(VT1_optimized1(i))
ynew=np.asarray(y0)
plt.title("Optimized value function, linear extrapolation")
plt.plot(np.asarray(aX_vals1), np.asarray(VT1_optimized_val), 'o', xnew, ynew, '-')
plt.ylabel('Value function with optimized asset allocation')
plt.xlabel('X')
plt.show()

#This seems to work almost too well! Let's check the asset allocation.




# Plotting
# xnew=np.linspace(aX_vals1_array[0],aX_vals1_array[len(aX_vals1_array)-1],100)
# ynew=VT1_optimized(xnew)
# plt.title("Optimized value function, linear extrapolation")
# plt.plot(aX_vals1_array, VT1_optimized_val_array, 'o', xnew, ynew, '-')
# plt.ylabel('Value function with optimized asset allocation')
# plt.xlabel('ratio X/Y')
# plt.show()


# xnew=np.linspace(aX_vals1_array[0],(aX_vals1_array[len(aX_vals1_array)-1]),100)
# y0=[]
# for i in xnew:
#     y0.append(VT1_optimized1(i))
# ynew=np.asarray(y0)
# plt.title("Optimized value function, lin. extrapolation")
# plt.plot(aX_vals1_array, VT1_optimized_val_array, 'o', xnew, ynew, '-')
# plt.ylabel('asset allocation')
# plt.xlabel('X')
# plt.show()
# exit()

这个问题更多的是关于数学,而不是任何特定的语言。我并不真正关心数学。我很可能犯了一个数学错误!但我希望能够在python中实现部分拟合,以了解这一点!酷,那你能更新你的问题吗?事实上,编辑后我想我明白你的意思了。我仍然倾向于认为这是一个编码问题,因为我只是想看看做部分拟合的合理方法是什么。我想数学上的问题是如何将这两个东西缝合在一起,而我想我只是问你如何实现给定的缝合。是的,一些数据会很好。提示:使用
zip
避免一半的循环和
\uu.index()
部分不会真正增加可读性。