QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1616|回复: 0
打印 上一主题 下一主题

多项式函数拟合sin函数(最小二乘法求解参数及其正则化)

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-4-25 16:12 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    多项式函数拟合sin函数(最小二乘法求解参数及其正则化)* f: o* [' H2 ^( O

      k) S( Q) G* n  J7 L0 Z  u0 W1.统计学习是关于计算机基于数据构建概率统计模型并运用模型对数据进行分析与预测的一门学科。统计学习包括监督学习、非监督学习、半监督学习和强化学习。9 M# q( h3 a; t- E6 W
    2.统计学习方法三要素——模型、策略、算法,对理解统计学习方法起到提纲挈领的作用。
    0 _, V* c# A8 f5 r, }3.本书主要讨论监督学习,监督学习可以概括如下:从给定有限的训练数据出发, 假设数据是独立同分布的,而且假设模型属于某个假设空间,应用某一评价准则,从假设空间中选取一个最优的模型,使它对已给训练数据及未知测试数据在给定评价标准意义下有最准确的预测。; B) Z- _' [7 |. n! f
    4.统计学习中,进行模型选择或者说提高学习的泛化能力是一个重要问题。如果只考虑减少训练误差,就可能产生过拟合现象。模型选择的方法有正则化与交叉验证。学习方法泛化能力的分析是统计学习理论研究的重要课题。/ x, D  Z- y# Z1 p% [5 u" p6 ^
    5.分类问题、标注问题和回归问题都是监督学习的重要问题。本书中介绍的统计学习方法包括感知机、K近邻法、朴素贝叶斯法、决策树、逻辑斯谛回归与最大熵模型、支持向量机、提升方法、EM 算法、隐马尔可夫模型和条件随机场。这些方法是主要的分类、标注以及回归方法。它们又可以归类为生成方法与判别方法。! \/ U# e# a9 c+ W
    . v4 E8 x$ A7 ^

    , f$ ]6 ^* x; m) L6 N5 ] 1.png 7 O7 l2 l! e1 `. U4 Y

    ) i' j' M7 y$ b0 n 2.png
    , ~! P) u" c9 ]/ `import numpy as np
    ) i2 E* X% T# L- ?1 W' b# X( N( Qimport matplotlib.pyplot as plt
    : l+ @, ^  l" ^5 Kfrom scipy.optimize import leastsq* m+ r, L' w& x/ e6 ^& f
    + v2 v; p: n; D3 ^! t

    ( n, v9 c% _1 t' K5 X# 我们要拟合的目标函数% q- E, E6 ]2 O8 j0 l+ U5 H  n
    def real_func(x):
    " @2 `, j9 K7 B5 h9 f% c8 R! m3 C  K    return np.sin(2*np.pi*x)
    3 a& N  d+ Z& \9 q# l  [* t/ Z% U" q$ y, u4 j0 G3 r
    ! C: z. C& o4 B7 x" v9 _1 A
    # 我们自己定义的多项式函数
    / s4 U9 a* c% k! u' e! o1 ydef fit_func(p, x):
    $ w5 z( K3 r0 l! a    f = np.poly1d(p)  # np.poly1d([2,3,5,7])返回的是函数,2x3 + 3x2 + 5x + 7
    7 f. k* f% g9 b8 n' w6 J    ret = f(x)# w$ u2 B; {7 c1 h
        return ret: `: _4 G# r5 ^, M0 M) W" d
    ; Q# A3 x0 V% a, c8 Y0 k

    7 C. u& B3 V- S" K/ s  W0 w! l) K# 计算残差
    0 {& L; P# S# O7 |def residuals_func(p, x, y):9 D0 g0 l4 [# x% A
        ret = fit_func(p, x) - y9 ?. ~3 }3 l2 f3 Z
        return ret
    & ^& d, ?, X1 |( R5 W0 x6 z( N
    / Z; p" p& t' ^4 L7 M
    , l3 U: h: d# a: }5 a: Hdef fitting(M=0):
    1 J9 D" c8 n6 H/ q9 C+ H* c    """
    * b9 G' I, L/ B, i+ {8 e        M    为 多项式的次数
    - s) l# U$ W8 }+ ~    """) E8 x  u3 I8 A
        # 随机初始化多项式参数  _) ~  ^; a: f* z
        p_init = np.random.rand(M + 1)  # 返回M+1个随机数作为多项式的参数
    ' k& z2 u7 l; Z9 x8 |! z    # 最小二乘法:具体函数的用法参见我的博客:残差函数,残差函数中参数一,其他的参数
    0 v! D" j; _* a4 i9 G- G    p_lsq = leastsq(residuals_func, p_init, args=(x, y))4 D) N* G3 \8 E0 E2 E
        # 求解出来的是多项式当中的参数,就是最小二乘法中拟合曲线的系数
    0 k" @4 Y6 Q% u+ @) E4 ^    # print('Fitting Parameters:', p_lsq[0])
    2 V) \5 c* R. p+ t3 V$ [    return p_lsq[0]
    $ s$ A9 K( ^) G; @# ?
    7 V+ @8 w6 d" c5 \1 D; \+ }
    $ L1 x6 `% B% G* }5 D! O/ D9 r# 书中10个点,对y加上了正态分布的残差
    ; D7 N) D; L/ J* Zx = np.linspace(0, 1, 10)
    ; L: n" j* Q9 [8 ?! Ry_old = real_func(x)
    & |( w. h% {3 Q! [y = [np.random.normal(0, 0.1) + yi for yi in y_old]; b, J# B/ f4 c

    * D3 q6 v' r6 }, z" J9 l, d9 m1 S( {4 {( E( i4 G! I' I& ]0 [4 R
    x_real = np.linspace(0, 1, 1000)
    6 n: X" L: C# ~+ n0 `8 Yy_real = real_func(x_real)" \' z& h, Z7 D, B8 l1 ?
    5 w3 H6 c5 D) N0 F* s# ^, a

    & Y8 w" ~6 v. k& f6 Wplt.plot(x_real, y_real, label="real")+ b: |# |( F2 ~5 U" N
    plt.plot(x, y, 'bo', label='point')
    ' j- b# c3 s4 C. g1 F- Q#  fiitting函数中args=(x, y)是条用的是上面定义的10个点的全局变量x,y) V- X* ?+ ^: R6 c) G1 ~
    plt.plot(x_real, fit_func(fitting(9), x_real), label="fitted curve")& U- v# c9 T0 z4 m
    plt.legend()
    6 ~9 b: k8 }% o2 }5 r- Q- vplt.show()
    ( b; X  F& o8 P) ~2 H
    9 {) l* B: o3 o" c+ `, ^$ n# I+ BM=0+ B; s) z& I9 g8 p3 Q

    ; @. ?) q3 R2 u- K) Y! b 3.png
    3 a* Z5 I/ _2 B# \; M" L* w* sM=1
    $ B8 \& s% @* \# n% X) B5 s  p 4.png
    5 ]& x2 f3 q& ^; dM=3
    ! h$ N8 W# Q. X. L0 ]- r/ K7 g/ D3 i5 B& r- @/ a. w; E. R
    5.png
    + |% u- x7 T9 |/ [; j/ A$ O) ?
    7 Y) Z# b( `* Z7 ~M=9* N# S3 J$ N; P) Y; W9 Q6 M
    6.png
    7 I) y% g7 l, a' d' ^ 7.png
      Y; G) T$ j. \0 g" R& u# y# M( r4 k9 N9 t& m: b; X
    W是参数,就是最小二乘法求得到的系数
    ' Y; c' q0 i7 y8 L+ _lambda是regularization,是自定义的系数。: a* A! k2 {, f/ g' v( V9 u5 J
    import numpy as np
    2 L# ^: i4 m$ e" [7 T4 ]import matplotlib.pyplot as plt
    ) ?  Q5 x, y# m* }! y$ |from scipy.optimize import leastsq
    1 p/ M8 M9 |5 P# p  J+ z! {6 e1 `
    " Z, \5 ^( |4 ]/ ^0 y; n- T* a: H0 o1 n: \
    # 我们要拟合的目标函数3 B) t3 @& m  `1 S* z: k# q( i
    def real_func(x):9 M2 A  k' G+ I2 v' ?) l2 C
        return np.sin(2*np.pi*x)
    + X& R2 C+ o+ X  S* o6 W+ g2 {8 a) x; |; L" u# ?

    / c! M9 e3 Y. Q# 我们自己定义的多项式函数8 I. p( O6 ]7 U3 L* L, n  j& f
    def fit_func(p, x):: [! Y: [, P! d% }- E3 ~. x4 G
        f = np.poly1d(p)  # np.poly1d([2,3,5,7])返回的是函数,2x3 + 3x2 + 5x + 7
    ! \6 [, P+ v1 @5 M3 G2 {    ret = f(x)
    : q: Q( y, S( S- B( l: {0 T    return ret5 _/ j/ w; H4 F6 X4 C* q/ q

    - W- R/ ^2 \( T' R- |& E- ~% ]! H1 a# h8 c
    # 计算残差" _2 d8 e% }( i( {1 b$ D6 b) f9 \
    def residuals_func(p, x, y):- `5 E/ Q: [* ?# W7 w
        ret = fit_func(p, x) - y: x4 U& m9 A4 [9 z
        return ret
      M& P2 p" e! u5 U. L9 \9 h( Q1 ]5 m) ?' L! U( `

    / R  g& E7 N5 X# G8 R3 e6 B- d# 返回残差和正则项
    " W" q0 d$ N8 f( H$ }' {1 Odef residuals_func_regularization(p, x, y):* T5 S+ I/ t9 h# C- y$ s, A
        ret = fit_func(p, x) - y
    ; q. j+ u2 B1 h$ ^" |9 V2 {" L, a1 z    ret = np.append(ret,! ^6 U( b* v1 F( d* z1 i; d& ]* x) U
                        np.sqrt(0.5 * regularization * np.square(p)))  # L2范数作为正则化项% o" T, V. ~3 Q
        return ret  s& W8 _! z+ A4 t' J
    / j0 @  l9 a, I1 }; V

    4 E% V6 B2 s( |2 ?" Hdef fitting(M=0):
    . @$ T  q, ^" y5 [$ ?8 ~    """
    8 Z* J  p+ @$ D6 k3 `        M    为 多项式的次数' ?* f9 o8 b2 S' R  o" d' K# l
        """8 g0 |3 ^% g) ^' O
        # 随机初始化多项式参数
    5 V8 O2 R! t8 u- `+ A! s    p_init = np.random.rand(M + 1)  # 返回M+1个随机数作为多项式的参数
    : A0 {% [. d# J" n) Z4 {    # 最小二乘法:具体函数的用法参见我的博客:残差函数,残差函数中参数一,其他的参数% k$ [- {$ M! |$ s* D- ]9 E
        p_lsq = leastsq(residuals_func, p_init, args=(x, y))
    ! W) z! ?- D4 W/ R6 A    # 求解出来的是多项式当中的参数,就是最小二乘法中拟合曲线的系数, k; E. E2 s" l* s
        # print('Fitting Parameters:', p_lsq[0])+ [) L7 W3 F% f0 E8 H$ t  ?; K
        return p_lsq[0]
    ' R) N) G3 r6 m" Q; J+ w* m! p8 D1 E" S8 T6 u5 D! j0 @

    9 x: f9 U% ?* _) |# 书中10个点,对y加上了正态分布的残差
    ) I( z5 D9 n( L0 |1 ]; hx = np.linspace(0, 1, 10)$ r' a$ {/ M  q) Z8 J
    y_old = real_func(x)% f1 ]8 X  R7 {& e: C6 U6 F
    y = [np.random.normal(0, 0.1) + yi for yi in y_old]
    , D5 ]$ O) ?2 b
    1 o% y, t' g- y9 n& k- N. n/ i6 D( ?- l. Y% }5 s
    x_real = np.linspace(0, 1, 1000)0 o# _5 u/ h( A  k+ U! A* c; ^
    y_real = real_func(x_real)/ X. O/ g# _2 L# @0 {9 k

    1 x1 Q# a0 e+ R& F1 B& k. d/ q% b% `. f. [) ]0 P
    # # 画出10个散点,sin图像,和拟合的曲线; p, l! u6 }( C- e1 t2 p5 x9 d
    # plt.plot(x_real, y_real, label="real")
    / @: A/ W! V2 j4 T# plt.plot(x, y, 'bo', label='point')
    6 a; @3 E' x) X# plt.plot(x_real, fit_func(fitting(9), x_real), label="fitted curve")
    ( u; |; `8 }# K$ X4 D2 S# plt.legend()
    $ i% G! a. z' E3 {# plt.show()
    ! z% q0 S# p- h3 R
    2 U9 D+ t4 W2 m$ h: W4 t" `1 q. U! J
    # 画出添加正则项的曲线
    4 ?' X; @* ^- N6 Z/ k% |. _regularization = 0.00012 y, V6 A  r/ c9 g' N
    p_init = np.random.rand(9 + 1)
    ; @3 D" J% Y6 bp_lsq_regularization = leastsq(
    9 D! x. H7 s& h/ H    residuals_func_regularization, p_init, args=(x, y))( g  o) |, @! b  \5 u- x

    ; J$ A6 ^2 g* ~
    7 M( V5 g1 o, P4 M& f. C- {/ r# 画出原sin图像,不加正则项的图像,加上正则项的图像,10个点的散点图& G" L! F. d8 Y: z/ C; s, O
    # 不加正则项和加上正则项都是9次方,10个系数6 x) r3 F& G" I& q% o- w6 ^5 @
    plt.plot(x_real, real_func(x_real), label='real')
    ' {4 D4 g* z8 O; B  j' ?$ dplt.plot(x_real, fit_func(fitting(9), x_real), label='fitted curve')
    ( n2 c" Z! j3 T& K+ fplt.plot(  e. i# s3 C4 w! R$ d6 O3 F
        x_real,$ o% o  i4 D+ {
        fit_func(p_lsq_regularization[0], x_real),1 i  o5 a6 g9 y) R3 ]5 `# K& f* A
        label='regularization')
    ; F6 c3 V; Y6 i' o/ Tplt.plot(x, y, 'bo', label='noise')# @3 G; @/ q$ I  w: v
    plt.legend()
    : _% D" h3 x; K, |. k1 Y1 n9 N6 }plt.show()
    6 i2 I, b8 R$ e9 J9 w/ B$ g
    ( J6 X7 Z; S* E" R, x  e 8.png
    2 ~) W+ I  }) w8 \  j  i
    & Z1 z) l  J, a  G1 v( d) E: D# f: E# g: D- Y0 u9 e
    : r. t7 R- v1 A) a0 _! E+ i0 t
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-9-10 15:12 , Processed in 0.369074 second(s), 54 queries .

    回顶部