python运用最小二乘法(scipy.optimize.leastsq)进行数据拟合与回归

拟合与回归

  • 拟合:指把数据集按照其规律方程化的过程,拟合的方法很多。
  • 回归:拟合的方法之一,有线性回归和非线性回归。当指线性回归时,即是求解最小二乘解。

最小二乘法(Leaest Square Method)

给定数据点集 ( x i , y i ) , i ∈ ( 1 , 2 , . . . , m ) (x_i, y_i), i∈(1, 2,...,m) (xi,yi),i(1,2,...,m)

  • 拟合函数 h ( x ) h(x) h(x)
  • i i i点数据点残差: h ( x i ) − y i h(x_i)-y_i h(xi)yi
  • 残差平方和: ∑ 1 m ( h ( x i ) − y i ) 2 \sum_{1}^{m}(h(x_i)-y_i)^2 1m(h(xi)yi)2

其中, h ( x ) h(x) h(x)为线性方程。假设 h ( x ) = k 0 + k 1 x h(x) = k_0 + k_1x h(x)=k0+k1x

  • 平方损失函数: Q ( k ) = ∑ 1 m ( k 0 + k 1 x i − y i ) 2 Q(k) = \sum_{1}^{m}(k_0 + k_1x_i-y_i)^2 Q(k)=1m(k0+k1xiyi)2

至此, 最小二乘法就是要求解当 Q ( k ) Q(k) Q(k)最小的情况下, k 0 k_0 k0 k 1 k_1 k1的值,从而求出拟合函数 h ( x ) = k 0 + k 1 x h(x)=k_0 + k_1x h(x)=k0+k1x。对未知数分别求偏导,令等式等于0,联立求解即可。

∂ Q ∂ k 0 = 2 ∑ 1 m ( k 0 + k 1 x i − y i ) ∂ Q ∂ k 1 = 2 ∑ 1 m ( k 0 + k 1 x i − y i ) x i \frac{\partial{Q}}{\partial{k_0}}=2 \sum_{1}^{m}(k_0 + k_1x_i-y_i) \\ \frac{\partial{Q}}{\partial{k_1}}=2 \sum_{1}^{m}(k_0 + k_1x_i-y_i)x_i k0Q=21m(k0+k1xiyi)k1Q=21m(k0+k1xiyi)xi

使用scripy.optimize的leastsq求解拟合方程

import numpy as np
from scipy.optimize import leastsq
"""target Func"""
def real_func(x):
    return np.sin(2 * np.pi * x)
"""gen polynomial func"""
def fit_func(p, x):
    f = np.poly1d(p)
    return f(x)
 """残差函数"""
def error_func(p, y ,x):
    ret = fit_func(p, x) - y
    return ret

x = np.linspace(0, 1, 9) ##在0~1生成等间距的9个数
x_point = np.linspace(0, 1, 1000) ##为了图形的连续性,画图的点要尽可能多

y0 = real_func(x) ## 生成xi对应的yi
y1 = [np.random.normal(0, 0.1) + y for y in y0] ##生成均值为为0方差为1的正态分布数并返回一个值作为噪声加入 

n = 9
p_init = np.random.randn(n)
plsq = leastsq(error_func, p_init, args=(y1, x))

plt.plot(x_point, real_func(x_point), label='real')
plt.plot(x_point, fit_func(plsq[0], x_point), label='fitted curve')
plt.plot(x, y1, 'bo', label='with noise')
plt.legend()
plt.show()

python运用最小二乘法(scipy.optimize.leastsq)进行数据拟合与回归_第1张图片

  • 拟合结果跟原函数有所偏差,原因是由于在原数据中加入了噪声干扰,导致了过拟合(overfitting)。过拟合会导致模型失去或大大降低预测能力。

  • 纠正过拟合:在模型中加入惩罚项,常用L1正则化或L2正则化,并且给惩罚项乘以一个常数,作为惩罚系数,以表示惩罚项的权重大小。即损失函数改写为: Q ( k ) = ∑ 1 m ( k 0 + k 1 x i − y i ) 2 + λ ∣ ∣ w ∣ ∣ 2 Q(k) = \sum_{1}^{m}(k_0 + k_1x_i-y_i)^2+\lambda ||w||^2 Q(k)=1m(k0+k1xiyi)2+λw2

    • L1正则化(L1范数): 拟合函数所有参数之和
    • L2正则化(L2范数): 拟合函数所有参数的平方和
  • 在本例中以L2正则化作为惩罚项, 即残差函数改为

    def error_func(p, y ,x):
        ret = fit_func(p, x) - y
        ret = np.append(ret, np.sqrt(0.0001) * p)
        return ret
    

    其中,惩罚系数为0.01, 拟合情况为:
    python运用最小二乘法(scipy.optimize.leastsq)进行数据拟合与回归_第2张图片

  • 若惩罚系数过大,会出现欠拟合(underfitting)。欠拟合无法正确反映数据特征。

  • 以下分别为惩罚系数数为0.1和1的情况
    python运用最小二乘法(scipy.optimize.leastsq)进行数据拟合与回归_第3张图片python运用最小二乘法(scipy.optimize.leastsq)进行数据拟合与回归_第4张图片
    增大噪声,改变惩罚项系数,可以看到结果较为明显:
    python运用最小二乘法(scipy.optimize.leastsq)进行数据拟合与回归_第5张图片

你可能感兴趣的:(python运用最小二乘法(scipy.optimize.leastsq)进行数据拟合与回归)