如何更准确地逼近一组点?

How to more accurately approximate a set of points?

我想估算 python 中的债券收益率。但问题出现了,哪条曲线更好地描述了这一点?

import numpy as np
import matplotlib.pyplot as plt

x = [0.02, 0.22, 0.29, 0.38, 0.52, 0.55, 0.67, 0.68, 0.74, 0.83, 1.05, 1.06, 1.19, 1.26, 1.32, 1.37, 1.38, 1.46, 1.51, 1.61, 1.62, 1.66, 1.87, 1.93, 2.01, 2.09, 2.24, 2.26, 2.3, 2.33, 2.41, 2.44, 2.51, 2.53, 2.58, 2.64, 2.65, 2.76, 3.01, 3.17, 3.21, 3.24, 3.3, 3.42, 3.51, 3.67, 3.72, 3.74, 3.83, 3.84, 3.86, 3.95, 4.01, 4.02, 4.13, 4.28, 4.36, 4.4]
y = [3, 3.96, 4.21, 2.48, 4.77, 4.13, 4.74, 5.06, 4.73, 4.59, 4.79, 5.53, 6.14, 5.71, 5.96, 5.31, 5.38, 5.41, 4.79, 5.33, 5.86, 5.03, 5.35, 5.29, 7.41, 5.56, 5.48, 5.77, 5.52, 5.68, 5.76, 5.99, 5.61, 5.78, 5.79, 5.65, 5.57, 6.1, 5.87, 5.89, 5.75, 5.89, 6.1, 5.81, 6.05, 8.31, 5.84, 6.36, 5.21, 5.81, 7.88, 6.63, 6.39, 5.99, 5.86, 5.93, 6.29, 6.07]

a = np.polyfit(np.power(x,0.5), y, 1)
y1 = a[0]*np.power(x,0.5)+a[1]

b = np.polyfit(np.log(x), y, 1)
y2 = b[0]*np.log(x) + b[1]

c = np.polyfit(x, y, 2)
y3 = c[0] * np.power(x,2) + np.multiply(c[1], x) + c[2]

plt.plot(x, y, 'ro', lw = 3, color='black')
plt.plot(x, y1, 'g', lw = 3, color='red')
plt.plot(x, y2, 'g', lw = 3, color='green')
plt.plot(x, y3, 'g', lw = 3, color='blue')
plt.axis([0, 4.5, 2, 8])
plt.rcParams['figure.figsize'] = [10, 5]

抛物线在结束时也下降 (蓝色),对数在开始时太快趋于零 (绿色) ,并且平方根有一个奇怪的驼峰(red)。还有其他更准确的近似方法吗?还是我已经做得很好了?

你的身材看起来真不错!如果您想获得更多信息来比较哪个拟合更好,您可以查看残差之和和系数的协方差。

a,residuals,cov = np.polyfit(np.power(x,0.5), y, 1, full=True, cov=True)

残差是最小二乘拟合的残差平方和。 cov 矩阵是多项式系数估计值的协方差。该矩阵的对角线是每个系数的方差估计。

您需要在 google 上搜索“不同类型的错误度量”。这些将帮助您确定最合适的人选。最常用的是均方根误差 (RMSE) 或平均绝对百分比误差 (MAPE)。您还可以阅读有关相对均方根误差 (rRMSE) 的信息。错误度量的选择取决于手头的问题。