曲线拟合度分析
本文分析几种拟合度指标的性能。
几种拟合度评价指标
对于序列 ,其拟合值为 。序列 的平均值为 ,拟合值的平均值为 。序列 的方差为 ,拟合值的平均值为 。
拟合优度R^2
范围
拟合度E
本文提出一种新的拟合程度度量
,公式如下:
其中 ,一般 , 取一个小数如 , 范围在
python实现代码
import numpy as np
def R2_fun(y, y_forecast, testing):
# 拟合优度R^2
y_mean=np.mean(y)
return 1 - (np.sum((y_forecast - y) ** 2)) / (np.sum((y - y_mean) ** 2))
def E_fun(y, y_forecast, testing, error_power):
# 拟合度E
y_e = np.abs(y[-testing:] - y_forecast[-testing:]) / (np.abs(y[-testing:]) + 10**-10)
y_sum = np.sum((y_e) ** error_power) / testing + 1
return 1 - ((y_sum) ** (1 / error_power) - 1) / (1 + (y_sum) ** (1 / error_power))
实验
1
用正弦曲线来做实验。取两条相位相同但是幅度不一样的曲线做对比。取n条幅度不一样的正弦曲线作为拟合曲线。
import matplotlib.pyplot as plt
n= 1000
b = 1
c = 0
A = np.linspace(0.5, 1.5, n)
x = np.linspace(0, 1, n)
y = np.sin(x) * b
y_forecast = [A[i] * np.sin(x) * b + c for i in range(n)]
R2 = [R2_fun(y, y_forecast[i], n) for i in range(n)]
E = [E_fun(y, y_forecast[i], n, 2) for i in range(n)]
fig= plt.figure()
plt.plot(A, R2, 'r')
plt.plot(A, E, 'b')
2
观察 随幅度的变化。
A = np.linspace(-100, 100, n)
y_forecast = [A[i] * np.sin(x) * b + c for i in range(n)]
E = [E_fun(y, y_forecast[i], n, 2) for i in range(n)]
fig= plt.figure()
plt.plot(A, E, 'b')
结论
在 中变化,可以比较好表示曲线的拟合情况。