曲线拟合度分析

曲线拟合度分析

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

  • 曲线拟合度分析
    • 几种拟合度评价指标
      • 拟合优度R2R2R^2
      • 拟合度EEE
    • python实现代码
    • 实验
      • 1
      • 2
    • 结论

几种拟合度评价指标

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

拟合优度 R2 R 2

R2=1ni=1(yiYi)2ni=1(YiY¯)2 R 2 = 1 − ∑ i = 1 n ( y i − Y i ) 2 ∑ i = 1 n ( Y i − Y ¯ ) 2

范围 [,1) [ − ∞ , 1 )

拟合度 E E

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

Z=kni=1(|yiYi|p)ni=1(|YiY¯|p)+ε Z = k ∑ i = 1 n ( | y i − Y i | p ) ∑ i = 1 n ( | Y i − Y ¯ | p ) + ε

E=1Z1p+1 E = 1 Z 1 p + 1

其中 p>0 p > 0 ,一般 p=2 p = 2 k=1 k = 1 ε ε 取一个小数如 250 2 − 50 E E 范围在 (0,1] ( 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, error_k, error_epsilon):
    # 拟合度E
    y_mean=np.mean(y[-testing:])
    z = (np.sum((abs(y_forecast[-testing:] - y[-testing:])) ** error_power)) / (np.sum((abs(y[-testing:] - y_mean)) ** error_power) + error_epsilon) * error_k
    return 1 / (1 + (z) ** (1 / error_power))

实验

1

用正弦曲线来做实验。取两条相位相同但是幅度不一样的曲线做对比。取n条幅度不一样的正弦曲线作为拟合曲线。

import matplotlib.pyplot as plt

n= 1000
b = 10
c = 100
A = np.linspace(0.5, 1.5, n)
error_power = 2
k = 1
error_epsilon = 2 ** -50

x = np.linspace(0, 1, n)
y = np.sin(x) * b + c
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, error_power, k, error_epsilon) for i in range(n)]

fig= plt.figure()
plt.plot(A, R2, 'r')
plt.plot(A, E, 'b')

曲线拟合度分析_第1张图片

2

观察 E E 随幅度的变化。

A = np.linspace(-2, 2, n)
y_forecast = [A[i] * np.sin(x) * b + c for i in range(n)]
E = [E_fun(y, y_forecast[i], n, error_power, k, error_epsilon) for i in range(n)]

fig= plt.figure()
plt.plot(A, E, 'b')

曲线拟合度分析_第2张图片

结论

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

你可能感兴趣的:(算法,拟合)