- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563425 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174250
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
多项式函数拟合sin函数(最小二乘法求解参数及其正则化)
' x1 P( [9 t* R/ _
% j w* z5 [8 N2 u p1.统计学习是关于计算机基于数据构建概率统计模型并运用模型对数据进行分析与预测的一门学科。统计学习包括监督学习、非监督学习、半监督学习和强化学习。
0 j+ e( g/ _4 }/ i2.统计学习方法三要素——模型、策略、算法,对理解统计学习方法起到提纲挈领的作用。
+ `% `" p r3 W1 T3.本书主要讨论监督学习,监督学习可以概括如下:从给定有限的训练数据出发, 假设数据是独立同分布的,而且假设模型属于某个假设空间,应用某一评价准则,从假设空间中选取一个最优的模型,使它对已给训练数据及未知测试数据在给定评价标准意义下有最准确的预测。- F6 R1 q& Q+ k9 N. U* s' d
4.统计学习中,进行模型选择或者说提高学习的泛化能力是一个重要问题。如果只考虑减少训练误差,就可能产生过拟合现象。模型选择的方法有正则化与交叉验证。学习方法泛化能力的分析是统计学习理论研究的重要课题。
/ z+ X0 z: L' j" w5.分类问题、标注问题和回归问题都是监督学习的重要问题。本书中介绍的统计学习方法包括感知机、K近邻法、朴素贝叶斯法、决策树、逻辑斯谛回归与最大熵模型、支持向量机、提升方法、EM 算法、隐马尔可夫模型和条件随机场。这些方法是主要的分类、标注以及回归方法。它们又可以归类为生成方法与判别方法。5 |* q# N+ C0 Z& d* b* j: s4 s* s N
$ V( S2 P& K/ [$ ^( x% q8 i! C
* @( O" e9 F+ M0 Y6 r4 k& s; h
* h* b {+ o/ d
" f" w( r" C" w3 {
$ p( }* l7 s+ h/ `/ G/ i5 J9 g
import numpy as np" M- d" L0 t/ ~6 @" n
import matplotlib.pyplot as plt% T1 F `+ x) m0 }+ z( V4 v
from scipy.optimize import leastsq
- ~+ }! O# r: U# C. S4 H) f q
+ ]; H/ c( Y, i/ L* r/ _7 G/ r; U
# 我们要拟合的目标函数
' L4 B- l% P2 }9 g/ K+ |def real_func(x):8 P# K2 F+ y; E& E6 @3 u: |
return np.sin(2*np.pi*x)
) Q/ R" z& K3 w+ _/ w
4 M$ N1 P5 P0 Y& K0 A; ~( o2 f! R. d" L' d% B+ h8 T4 a7 p) r) [
# 我们自己定义的多项式函数
/ _0 m1 i) P2 Ddef fit_func(p, x):7 B, I- ?* {* p$ Y! ?7 w9 ?2 q& a+ G& l
f = np.poly1d(p) # np.poly1d([2,3,5,7])返回的是函数,2x3 + 3x2 + 5x + 7
' `8 ~+ x1 f$ @; \2 _# E ret = f(x)
( S" y2 C4 k* f* B6 Y2 O, z return ret$ h& S1 x( b+ R" H( l: U2 z
) u( n- F1 A' U3 o' v8 ^$ P" \
2 F* ]5 g& t: H: l, x# q# 计算残差
: P$ l* `% _4 Y5 t) Ldef residuals_func(p, x, y):, T) c. H# |9 d% F L+ e4 ?
ret = fit_func(p, x) - y
! ?- ?& X; V' ` return ret
8 x* @) d0 B. t' ?; J
: |0 f0 E( g+ f& [2 G1 _$ p# i( E; R8 F8 v1 b$ p
def fitting(M=0): ?4 J$ c4 S2 `7 e) H' b) u
"""
# S; f! b, M3 f; y' m7 s% d+ c M 为 多项式的次数, {" S9 v1 _5 B6 u/ S8 Y( m3 _& P- b7 s* m
"""
2 S" z( y( j4 b9 P, ~9 h6 g # 随机初始化多项式参数, g) S6 O" b% I1 A3 \5 ]/ |" m' P
p_init = np.random.rand(M + 1) # 返回M+1个随机数作为多项式的参数
: L9 W7 a9 G d # 最小二乘法:具体函数的用法参见我的博客:残差函数,残差函数中参数一,其他的参数! O2 A) `+ ~; k/ e# n' V( w5 s
p_lsq = leastsq(residuals_func, p_init, args=(x, y))- n5 c+ q3 ^* |
# 求解出来的是多项式当中的参数,就是最小二乘法中拟合曲线的系数" \4 T' ]4 Z G7 ]+ W
# print('Fitting Parameters:', p_lsq[0])2 f5 m0 H& X3 [. O' p, c& z
return p_lsq[0]3 v: l5 _% p7 E
$ o3 G2 ^" e9 ~7 I4 ~
. X. ?% V( G$ C2 ^, T# 书中10个点,对y加上了正态分布的残差; |! N$ }8 g$ T8 I
x = np.linspace(0, 1, 10), ~# L4 n" _& g
y_old = real_func(x)- F R4 z. S& C) k2 }
y = [np.random.normal(0, 0.1) + yi for yi in y_old]
9 y [! t& i$ A. S" Q; u
; J9 j" W/ X7 ~
+ N% M$ d% R" Y/ f# ~x_real = np.linspace(0, 1, 1000)% C* l$ x7 F9 f" ]* m; V$ [
y_real = real_func(x_real)
6 R5 y) Z! z7 ?' M5 D3 V
4 w4 \4 L: Q p9 P! H* `! E6 T
1 z' V1 n$ p- S* Bplt.plot(x_real, y_real, label="real")
; {5 ]( p4 R/ z1 V6 I; E( Q: Bplt.plot(x, y, 'bo', label='point')
/ P4 i6 W8 W5 n; h2 ]8 `" r# fiitting函数中args=(x, y)是条用的是上面定义的10个点的全局变量x,y
! G, }2 Y8 ]% _' Tplt.plot(x_real, fit_func(fitting(9), x_real), label="fitted curve")
7 b3 U+ m5 v; e& j8 Zplt.legend()
3 r' n# w. ?# F( W0 T" Wplt.show()
& Z: R/ ?2 R o6 ]" B
5 ^# r, {6 H* F. FM=0
! C8 H) S- B% e& {# ~1 g' r- X& ~5 i3 h& W; a- j
7 p/ @; F0 s: K) S6 u' u. ]
M=19 S9 w' h$ ?2 d/ k7 {- Y
1 u# f, ^: B9 |* e+ U5 |- M" t" g) e
M=3) V0 H# t& S4 Q' Z
! k D9 T7 H$ W# d
5 n) P, E5 }1 `+ {' B
$ i! d& c* G; X8 g8 D! \' {
M=9
" c% x& N, p- `* P: N* o( Q
( Y' d- F: R7 I; M( g: O4 _
* ], J/ v9 C0 D
) p) r' v- N3 @3 A+ QW是参数,就是最小二乘法求得到的系数
- u/ e7 ~" o3 Y0 k" X7 i$ slambda是regularization,是自定义的系数。
% y2 L/ c7 W, R2 H9 G- m4 W5 z8 Mimport numpy as np& t& G+ k$ t. D" H
import matplotlib.pyplot as plt n6 `) r e- `4 S; n
from scipy.optimize import leastsq
$ r# R2 J! J' w* l, ~) Y2 F4 k
1 U: e6 {2 z0 e# |
' n ?: {/ J: X' D# 我们要拟合的目标函数
: Z- D; T( S3 D9 e0 _def real_func(x):
% T. o: N; H) l% |6 @ return np.sin(2*np.pi*x)
& d2 x. k4 w/ O
/ o5 |9 A% ^8 l
) {9 m) ~9 d9 ^ k5 n# 我们自己定义的多项式函数
6 w9 ~9 S- k8 u/ x7 D E4 Ldef fit_func(p, x):
# \5 h) B' w6 O) \. W; V; e f = np.poly1d(p) # np.poly1d([2,3,5,7])返回的是函数,2x3 + 3x2 + 5x + 7
' X& ^, P/ ?. _, K ret = f(x)
* Q b0 s' o5 L& x+ c1 Y return ret, y5 z4 K% }0 ?- p3 D
% H! B& ^; w: ?# N
7 E' `0 b' c5 Z2 o5 t9 J. t
# 计算残差
2 t) ?! i' V. [1 Rdef residuals_func(p, x, y):/ G" G3 `6 V! A
ret = fit_func(p, x) - y' Z. q* r0 r$ m. ~+ B ]
return ret& v1 @. V$ L6 Z- \2 O/ g2 ^
+ ~, U: Y& [5 \3 K' |* G0 s2 i
, |# p% J0 R. F& ~! e( y# I2 G+ r# 返回残差和正则项8 V/ \. u9 _2 Y/ q( s5 @/ s/ @
def residuals_func_regularization(p, x, y):* V {0 @8 p- z+ A/ J. r8 o
ret = fit_func(p, x) - y
& e3 B4 U! H" |+ {9 R ret = np.append(ret,- G+ Y" \; _* C
np.sqrt(0.5 * regularization * np.square(p))) # L2范数作为正则化项% R1 F; Y# ?# X$ j
return ret% [* m d7 c( ~4 G, T5 [
8 I( G2 B; G( h, k) L; f2 G& S
' f9 G1 A' v: o4 vdef fitting(M=0):
C/ m0 W6 w7 e$ p8 D """
V2 y& ^9 L' n/ { M 为 多项式的次数% E4 ~) c, T" m) v! c% K
"""/ ]6 T& S$ J2 Q% V, y0 e+ U: G# h
# 随机初始化多项式参数
0 v& o! {/ z. R" O- C7 a% G p_init = np.random.rand(M + 1) # 返回M+1个随机数作为多项式的参数
- j$ r2 {! D+ f; h) _ # 最小二乘法:具体函数的用法参见我的博客:残差函数,残差函数中参数一,其他的参数
# A+ Z$ g% y1 e! ] H9 Z p_lsq = leastsq(residuals_func, p_init, args=(x, y))
& H, L _+ q' Y # 求解出来的是多项式当中的参数,就是最小二乘法中拟合曲线的系数5 `% ~8 {( S; h5 ^+ U: ]9 x9 e
# print('Fitting Parameters:', p_lsq[0])! ]( A: B! a- H0 @) f" P) k! Q, y
return p_lsq[0]
" T2 j: `. A8 Q! J$ O2 B' h1 B" A9 ?9 v4 H# D
0 U( [$ F1 T4 i) |) v# ]9 J# 书中10个点,对y加上了正态分布的残差+ p; l, q; A: V" z6 m/ a
x = np.linspace(0, 1, 10)
( K; X; t4 g6 j7 u: p1 @! L8 ~y_old = real_func(x)+ c! E; w, x S8 c4 C- w
y = [np.random.normal(0, 0.1) + yi for yi in y_old]
2 T) W$ c& ]2 H9 ^0 p2 y
( ^* G# x2 t9 i" l* y9 {4 ?# s& O& [1 d s" Q% u( x
x_real = np.linspace(0, 1, 1000)# F0 ~5 l4 T* q- d7 Y
y_real = real_func(x_real)
7 H& T, U- `3 I$ G& i, w5 N2 K
( v; C& j; d8 C+ [& z; T) ^8 G& |& z0 B! _. P7 a
# # 画出10个散点,sin图像,和拟合的曲线
+ b- X4 r3 {' ~+ X+ {# plt.plot(x_real, y_real, label="real")) c4 T2 Q/ ?( ~# A, |" t7 }& n( r
# plt.plot(x, y, 'bo', label='point')- I; z4 S4 b1 W6 o
# plt.plot(x_real, fit_func(fitting(9), x_real), label="fitted curve")
- \3 }+ ` t+ H* ^: N% j. z# plt.legend()
/ Q1 `) B5 H& O) K5 r# plt.show()' ]6 {( C# E' W( r" e$ c
/ b1 M" E' J* J. W% e1 z2 k3 l7 z+ m$ R
- |) V! y* D% Z) G* v# 画出添加正则项的曲线
4 G% @& I, C$ M' B8 g- Aregularization = 0.0001" X: i. w- W @" g: p* X
p_init = np.random.rand(9 + 1)
& s7 d; `; R5 j% Z& C3 ep_lsq_regularization = leastsq(8 O4 L1 D: e1 v! \3 |
residuals_func_regularization, p_init, args=(x, y))
7 F. I9 ]. V. j% M+ ?* B: n. _4 [7 @# }6 ]9 ]% E! W
. e; Q6 F9 p) u
# 画出原sin图像,不加正则项的图像,加上正则项的图像,10个点的散点图5 u d% H8 V; c3 ]3 }
# 不加正则项和加上正则项都是9次方,10个系数# x3 i/ o5 F4 F$ B7 D/ h
plt.plot(x_real, real_func(x_real), label='real') H8 d/ p8 M% [# w6 H
plt.plot(x_real, fit_func(fitting(9), x_real), label='fitted curve')
* a( F3 U, Y9 w$ k# Lplt.plot(
& h, o, W+ l4 N6 a x_real,
- y8 Z* T+ f* @- R/ x" |1 T fit_func(p_lsq_regularization[0], x_real),4 \1 @! T0 K9 }+ a l/ [
label='regularization')
1 B0 k+ a* M. m: D/ O: G( `5 uplt.plot(x, y, 'bo', label='noise')
0 A& w' N. J- e+ a, M7 rplt.legend()5 S! W! g! @4 W* I# O
plt.show()
+ d3 q9 j7 L5 ?! e$ ]' l
# E( s) c7 t; B: s% h+ J5 @
- e1 u8 }" v6 [1 a$ [
$ ~2 L4 G! u5 {; |& b$ w, ^. a) k8 O" J1 P; m. W! h' S* ]4 b
6 V H: e: j* `: c6 ~ |
zan
|