曲线拟合度分析

曲线拟合度分析

本文分析几种拟合度指标的性能。

几种拟合度评价指标

对于序列 Y i ,其拟合值为 y i 。序列 Y i 的平均值为 Y ¯ ,拟合值的平均值为 y ¯ 。序列 Y i 的方差为 S ,拟合值的平均值为 s

拟合优度R^2

R 2 = 1 i = 1 n ( y i Y i ) 2 i = 1 n ( Y i Y ¯ ) 2

范围 [ , 1 )

拟合度E

本文提出一种新的拟合程度度量 E ,公式如下:

Z = ( 1 n i = 1 n ( | y i Y i | | Y i | + ε ) p ) 1 p + 1

E = 1 Z 1 Z + 1

其中 p > 0 ,一般 p = 2 ε 取一个小数如 10 10 E 范围在 [ 0 , 1 )

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

观察 E 随幅度的变化。

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')

E

结论

E [ 0 , 1 ) 中变化,可以比较好表示曲线的拟合情况。

猜你喜欢

转载自blog.csdn.net/weixin_42028364/article/details/81586621