網站首頁 編程語言 正文
一、背景描述
在一個普通的摸魚早晨,群里居然出現了一個不合時宜頗為突兀的正經問題,原來是一個博士同學需要対實驗數據進行曲線擬合并且批量計算出多項式方程
一般來說,這種問題對于經常做實驗的同學來說并不陌生,通常使用MATLAB或者Origin Pro這類專業的數據計算軟件,甚至Excel也可以實現.
但是作為程序員肯定第一想到的還是使用強大的Python來實現,但是因為本人主要做java開發,python知之甚少,但也知道python強大在各種現成的類庫,所以實現估計并不難,按我們就上手試試?
再來一張圖更直觀的表述下,博士同學就是有多組實驗數據,可以分布在坐標系,例如圖中的各個散點,而他想做的就是將散點擬合為一條曲線,獲得曲線的方程式,從而可以通過輸入其他x坐標的值預測結果數據.這在非常多的地方都有極大的用處
二、前期準備
在開始前還是需要対一些基本概念和類庫進行了解和介紹,因為并不是專業做研究的,所以對于以下名詞只做簡單的描述,達到理解并且可以使用的目的即可
最小二乘法
最小二乘法(又稱最小平方法)是一種數學優化技術。它通過最小化誤差的平方和尋找數據的最佳函數匹配。利用最小二乘法可以簡便地求得未知的數據,并使得這些求得的數據與實際數據之間誤差的平方和為最小
最小二乘法是解決曲線擬合問題最常用的方法。
其基本思路是:事先選定的一組線性無關的函數, 是待定系數 ,擬合準則是使實驗數據(笛卡爾坐標系的坐標數據)與待擬合曲線的距離的平方和最小,稱為最小二乘準則.
總結來說,我們通常就是使用最小二乘法來做曲線擬合,通過計算最小值來獲得多項式的系數與誤差數值.
(關于最小二乘法的原理大家可以自行了解,甚至可以讓你重新感知到數學邏輯之美)
Python類庫
NumPy
NumPy 是一個 Python 包。 它代表 “Numeric Python”。 它是一個由多維數組對象和用于處理數組的例程集合組成的庫。支持大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。
Matplotlib
Matplotlib 是 Python 的繪圖庫。 它可與 NumPy 一起使用,提供了一種有效的 MatLab 開源替代方案。
三、代碼實現
這里我們舉一個例子來展示下,相信下面這道數學題大家一定不陌生.
某公司為合理定價,在試銷期間得到單價x(單位:元)與銷售量y(單位:件)的數據如表:
單價(x) 80 82 84 86 88 90
銷量(y) 90 84 83 80 75 68
如果換做之前,我們肯定就熟練的直接開始列方程解未知數了,但是現在我已經失去了這項能力,那么不妨使用我們準備好的擬合曲線讓程序來幫我們計算下.
話不多說,直接上代碼
import matplotlib.pyplot as plt
import numpy as np
# 準備數據,將(x,y)坐標點進行輸入
x = np.arange(80, 92, 2) # x = 80,82,84,86,88,90
y = np.array([90, 84, 83, 80, 75, 68])
# 使用polyfit方法來擬合,并選擇多項式,這里先使用2次方程
z1 = np.polyfit(x, y, 2)
# 使用poly1d方法獲得多項式系數,按照階數由高到低排列
p1 = np.poly1d(z1)
# 在屏幕上打印擬合多項式
print(p1)
# 求對應x的各項擬合函數值
fx = p1(x)
# 繪制坐標系散點數據及擬合曲線圖
plot1 = plt.plot(x, y, '*', label='origin data')
plot2 = plt.plot(x, fx, 'r', label='polyfit data')
plt.xlabel('x-price')
plt.ylabel('y-amount')
plt.legend(loc=4) # 指定legend的位置,類似象限的位置
plt.title('polyfit')
plt.show()
plt.savefig('polyfit.png')
代碼其實比較簡單,輸入坐標數據,使用polyfit擬合曲線,輸出方程并且將圖標畫出來,我們來執行下看看結果如何
左邊那個就是擬合出來的二次方程,因為格式問題,2次方在上面一行,大家能看懂就行,右邊就是這個曲線的圖,但是可以看出曲線并不能非常好的貼合散點數據
這里我們將多項式改為3次方式再試一下
z1 = np.polyfit(x, y, 3)
再試一下
可以看出三次方程對于數據的貼合度還是比較好的,而如何選擇合適的多項式,或者其他類型函數,比如指數函數,冪函數等就需要人自己的合理選擇了.
好了,文章就到這里了,在python強大類庫的幫助下,總體還是比較簡單的
總結
原文鏈接:https://blog.csdn.net/Roy_70/article/details/123853693
相關推薦
- 2022-03-27 centos7安裝mongo數據庫的方法(mongo4.2.8)_MongoDB
- 2022-03-19 解決訪問不到Linux服務器中RabbitMQ管理頁面問題_Linux
- 2022-05-24 Matplotlib實現各種條形圖繪制_python
- 2022-04-05 python中時間轉換錯誤:時間戳轉換|帶有時區的轉換 如何解析ISO 8601格式的日期?
- 2022-12-22 React?Hooks?-?useContetx和useReducer的使用實例詳解_React
- 2022-07-11 python連接clickhouse的端口問題及解決_python
- 2024-01-29 Spring 的存儲和獲取Bean
- 2023-01-09 React應用框架Dva數據流向原理總結分析_React
- 最近更新
-
- 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同步修改后的遠程分支