網站首頁 編程語言 正文
導讀
曲線擬合的應用在生活中隨處可見,不知道大家是否還記得物理實驗中的自由落體運動中下降高度與時間關系之間的探究,在初速度為0的情況下,我們想要探究下降高度與時間的關系。
我們當時采用的方法是通過設置不同的下降時間來記錄下降的高度,測量記錄多組數據之后,再利用二維坐標系將記錄的點繪制到坐標系當中去,然后保證繪制的曲線到這些點的距離之和最小,最終得到的曲線就是h與t的關系。
繪制出h和t的關系之后,我就可以知道任意取值t在初速度為0的情況下,下降高度h對應的值。除此之外,曲線擬合的應用還有很多例如房價預測、經濟預測、股價預測等。
不知道,大家有沒有思考過,為什么我們可以通過測量值來繪制出t和h的關系曲線呢?這里面用到的邏輯究竟是什么呢?其實關于曲線的擬合通常有兩種解決方案:
- 我們已經知道了自變量(x)和因變量(y)的關系,只是不知道參數,通過觀察值來計算出參數,就能計算出自變量和因變量之間的關系
- 利用萬能函數逼近器神經網絡來擬合曲線,通過定義代價函數,利用已有觀察值的輸入值來計算出預測值,再計算出預測值與觀測值的輸出值之間的差距,在通過反向傳播,來計算出神經網絡的參數
下面我們主要探討如何利用方法1來實現曲線的擬合
曲線擬合
曲線擬合還可以分為兩種情況,第一種就是沒有約束的曲線擬合,第二種就是帶有約束條件的曲線擬合。scipy中提供了curve_fit函數使用非線性的最小二乘法用來擬合沒有約束條件的曲線,提供了least_squares函數用來擬合帶有約束條件的曲線。
- 沒有約束條件的曲線擬合
- 帶約束條件的曲線擬合
有時候在求解曲線參數的時候,會對參數的邊界做出一些限制,下面就展示了在對參數的邊界做出限制的情況下如何來求解的問題。我們使用jac矩陣結合最小二乘法來計算曲線的參數
import numpy as np
from scipy.optimize import least_squares
import matplotlib.pyplot as plt
def model(x,u):
"""定義擬合的曲線
:param x:輸入值自變量
:param u:輸入值函數的參數
:return:返回值因變量
"""
return x[0] * (u ** 2 + x[1] * u) / (u ** 2 + x[2] * u + x[3])
def fun(x,u,y):
return model(x,u) - y
def jac(x,u,y):
J = np.empty((u.size,x.size))
den = u ** 2 + x[2] * u + x[3]
num = u ** 2 + x[1] * u
J[:,0] = num / den
J[:,1] = x[0] * u / den
J[:,2] = -x[0] * num * u / den ** 2
J[:,3] = -x[0] * num / den ** 2
return J
#輸入值自變量
u = np.array([4.0, 2.0, 1.0, 5.0e-1, 2.5e-1, 1.67e-1, 1.25e-1, 1.0e-1,
8.33e-2, 7.14e-2, 6.25e-2])
#輸入值因變量
y = np.array([1.957e-1, 1.947e-1, 1.735e-1, 1.6e-1, 8.44e-2, 6.27e-2,
4.56e-2, 3.42e-2, 3.23e-2, 2.35e-2, 2.46e-2])
#函數的參數
x0 = np.array([2.5, 3.9, 4.15, 3.9])
#利用jac矩陣結合最小二乘法來計算曲線的參數,設置參數的取值在(0,100)之間
res = least_squares(fun, x0, jac=jac, bounds=(0, 100), args=(u, y), verbose=1)
#需要預測值得輸入值
u_test = np.linspace(0, 5)
#利用計算的曲線參數來計算預測值
y_test = model(res.x, u_test)
plt.plot(u, y, 'o', markersize=4, label='data')
plt.plot(u_test, y_test, label='fitted model')
plt.xlabel("u")
plt.ylabel("y")
plt.legend(loc='lower right')
plt.show()
總結
原文鏈接:https://blog.csdn.net/sinat_29957455/article/details/124553246
相關推薦
- 2022-04-11 Python - logging.Formatter 的常用格式字符串
- 2022-10-14 Mybatis一對多使用PageHelper分頁遇到的問題
- 2022-06-28 C#反射調用dll文件中的方法操作泛型與屬性字段_C#教程
- 2022-07-09 利用go語言判斷是否是完全二叉樹_Golang
- 2022-08-06 python?sns.countplot()?繪畫條形圖詳情_python
- 2022-08-23 .net?core中的System.Buffers命名空間_基礎應用
- 2022-09-09 python中.format()方法使用詳解_python
- 2022-02-28 Module not found: Error: Can't resolve 'sass-loade
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支