Python math 庫提供許多對浮點數(shù)的數(shù)學(xué)運算函數(shù),math模塊不支持復(fù)數(shù)運算,若需計算復(fù)數(shù),可使用cmath模塊(本文不贅述)。
成都創(chuàng)新互聯(lián)2013年開創(chuàng)至今,先為碌曲等服務(wù)建站,碌曲等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為碌曲企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
使用dir函數(shù),查看math庫中包含的所有內(nèi)容:
1) math.pi????# 圓周率π
2) math.e????#自然對數(shù)底數(shù)
3) math.inf? ? #正無窮大∞,-math.inf? ? #負無窮大-∞
4) math.nan? ? #非浮點數(shù)標記,NaN(not a number)
1) math.fabs(x)? ? #表示X值的絕對值
2) math.fmod(x,y)? ? #表示x/y的余數(shù),結(jié)果為浮點數(shù)
3) math.fsum([x,y,z])? ? #對括號內(nèi)每個元素求和,其值為浮點數(shù)
4) math.ceil(x)? ? #向上取整,返回不小于x的最小整數(shù)
5)math.floor(x)? ? #向下取整,返回不大于x的最大整數(shù)
6) math.factorial(x)? ? #表示X的階乘,其中X值必須為整型,否則報錯
7) math.gcd(a,b)? ? #表示a,b的最大公約數(shù)
8)? math.frexp(x)? ? ? #x = i *2^j,返回(i,j)
9) math.ldexp(x,i)? ? #返回x*2^i的運算值,為math.frexp(x)函數(shù)的反運算
10) math.modf(x)? ? #表示x的小數(shù)和整數(shù)部分
11) math.trunc(x)? ? #表示x值的整數(shù)部分
12) math.copysign(x,y)? ? #表示用數(shù)值y的正負號,替換x值的正負號
13) math.isclose(a,b,rel_tol =x,abs_tol = y)? ? #表示a,b的相似性,真值返回True,否則False;rel_tol是相對公差:表示a,b之間允許的最大差值,abs_tol是最小絕對公差,對比較接近于0有用,abs_tol必須至少為0。
14) math.isfinite(x)? ? #表示當x不為無窮大時,返回True,否則返回False
15) math.isinf(x)? ? #當x為±∞時,返回True,否則返回False
16) math.isnan(x)? ? #當x是NaN,返回True,否則返回False
1) math.pow(x,y)? ? #表示x的y次冪
2) math.exp(x)? ? #表示e的x次冪
3) math.expm1(x)? ? #表示e的x次冪減1
4) math.sqrt(x)? ? #表示x的平方根
5) math.log(x,base)? ? #表示x的對數(shù)值,僅輸入x值時,表示ln(x)函數(shù)
6) math.log1p(x)? ? #表示1+x的自然對數(shù)值
7) math.log2(x)? ? #表示以2為底的x對數(shù)值
8) math.log10(x)? ? #表示以10為底的x的對數(shù)值
1) math.degrees(x)? ? #表示弧度值轉(zhuǎn)角度值
2) math.radians(x)? ? #表示角度值轉(zhuǎn)弧度值
3) math.hypot(x,y)? ? #表示(x,y)坐標到原點(0,0)的距離
4) math.sin(x)? ? #表示x的正弦函數(shù)值
5) math.cos(x)? ? #表示x的余弦函數(shù)值
6) math.tan(x)? ? #表示x的正切函數(shù)值
7)math.asin(x)? ? #表示x的反正弦函數(shù)值
8)?math.acos(x)? ? #表示x的反余弦函數(shù)值
9)?math.atan(x)? ? #表示x的反正切函數(shù)值
10) math.atan2(y,x)? ? #表示y/x的反正切函數(shù)值
11) math.sinh(x)? ? #表示x的雙曲正弦函數(shù)值
12) math.cosh(x)? ? #表示x的雙曲余弦函數(shù)值
13) math.tanh(x)? ? #表示x的雙曲正切函數(shù)值
14) math.asinh(x)? ? #表示x的反雙曲正弦函數(shù)值
15) math.acosh(x)? ? #表示x的反雙曲余弦函數(shù)值
16) math.atanh(x)? ? #表示x的反雙曲正切函數(shù)值
1)math.erf(x)? ? #高斯誤差函數(shù)
2) math.erfc(x)? ? #余補高斯誤差函數(shù)
3) math.gamma(x)? ? #伽馬函數(shù)(歐拉第二積分函數(shù))
4) math.lgamma(x)? ? #伽馬函數(shù)的自然對數(shù)
python做科學(xué)計算的特點:1. 科學(xué)庫很全。(推薦學(xué)習(xí):Python視頻教程)
科學(xué)庫:numpy,scipy。作圖:matplotpb。并行:mpi4py。調(diào)試:pdb。
2. 效率高。
如果你能學(xué)好numpy(array特性,f2py),那么你代碼執(zhí)行效率不會比fortran,C差太多。但如果你用不好array,那樣寫出來的程序效率就只能呵呵了。所以入門后,請一定花足夠多的時間去了解numpy的array類。
3. 易于調(diào)試。
pdb是我見過最好的調(diào)試工具,沒有之一。直接在程序斷點處給你一個截面,這只有文本解釋語言才能辦到。毫不夸張的說,你用python開發(fā)程序只要fortran的1/10時間。
4. 其他。
它豐富而且統(tǒng)一,不像C++的庫那么雜(好比pnux的各種發(fā)行版),python學(xué)好numpy就可以做科學(xué)計算了。python的第三方庫很全,但是不雜。python基于類的語言特性讓它比起fortran等更加容易規(guī)?;_發(fā)。
數(shù)值分析中,龍格-庫塔法(Runge-Kutta methods)是用于非線性常微分方程的解的重要的一類隱式或顯式迭代法。這些技術(shù)由數(shù)學(xué)家卡爾·龍格和馬丁·威爾海姆·庫塔于1900年左右發(fā)明。
龍格-庫塔(Runge-Kutta)方法是一種在工程上應(yīng)用廣泛的高精度單步算法,其中包括著名的歐拉法,用于數(shù)值求解微分方程。由于此算法精度高,采取措施對誤差進行抑制,所以其實現(xiàn)原理也較復(fù)雜。
高斯積分是在概率論和連續(xù)傅里葉變換等的統(tǒng)一化等計算中有廣泛的應(yīng)用。在誤差函數(shù)的定義中它也出現(xiàn)。雖然誤差函數(shù)沒有初等函數(shù),但是高斯積分可以通過微積分學(xué)的手段解析求解。高斯積分(Gaussian integral),有時也被稱為概率積分,是高斯函數(shù)的積分。它是依德國數(shù)學(xué)家兼物理學(xué)家卡爾·弗里德里希·高斯之姓氏所命名。
洛倫茨吸引子及其導(dǎo)出的方程組是由愛德華·諾頓·洛倫茨于1963年發(fā)表,最初是發(fā)表在《大氣科學(xué)雜志》(Journal of the Atmospheric Sciences)雜志的論文《Deterministic Nonperiodic Flow》中提出的,是由大氣方程中出現(xiàn)的對流卷方程簡化得到的。
這一洛倫茨模型不只對非線性數(shù)學(xué)有重要性,對于氣候和天氣預(yù)報來說也有著重要的含義。行星和恒星大氣可能會表現(xiàn)出多種不同的準周期狀態(tài),這些準周期狀態(tài)雖然是完全確定的,但卻容易發(fā)生突變,看起來似乎是隨機變化的,而模型對此現(xiàn)象有明確的表述。
更多Python相關(guān)技術(shù)文章,請訪問Python教程欄目進行學(xué)習(xí)!以上就是小編分享的關(guān)于python能做什么科學(xué)計算的詳細內(nèi)容希望對大家有所幫助,更多有關(guān)python教程請關(guān)注環(huán)球青藤其它相關(guān)文章!
python的求
標準差
的函數(shù)是std,是numpy庫的成員,
如果非要
用sd函數(shù)求標準差,也不是不行(from
numpy
import
std
as
sd)。其參數(shù)是所需求標準差的矩陣或列表,
返回值
即標準差。示范如下:
import
numpy
as
np;
from
numpy
import
std
as
sd;
print([1,
2,3],"的標準差是);
print(sd([1,2,3]));
我的也一樣,不糾結(jié)這個。反正使用時指定精度就行了。
幫你試了,必須寫成這樣才行。二進制表示10進制的小數(shù),10進制里很正常的
談?wù)勱P(guān)于Python里面小數(shù)點精度控制的問題
十進制整數(shù)不會變成二進制小數(shù),但十進制很短的小數(shù)的是可能變成二進制很長小數(shù)的。
例如0.54轉(zhuǎn)變成二進制是:
0.54=0.10001010001111010111000010100011110101110000101001B
還有一些十進制下一兩位小數(shù),在二進制下無限循環(huán)小數(shù)的,只能取近似值。
線性模型(二)之多項式擬合
1. 多項式擬合問題
??多項式擬合(polynominal curve fitting)是一種線性模型,模型和擬合參數(shù)的關(guān)系是線性的。多項式擬合的輸入是一維的,即x=xx=x,這是多項式擬合和線性回歸問題的主要區(qū)別之一。
??多項式擬合的目標是構(gòu)造輸入xx的MM階多項式函數(shù),使得該多項式能夠近似表示輸入xx和輸出yy的關(guān)系,雖然實際上xx和yy的關(guān)系并不一定是多項式,但使用足夠多的階數(shù),總是可以逼近表示輸入xx和輸出yy的關(guān)系的。
??多項式擬合問題的輸入可以表示如下:
D={(x1,y1),(x2,y2),...,(xi,yi),...,(xN,yN)}xi∈Ryi∈R
D={(x1,y1),(x2,y2),...,(xi,yi),...,(xN,yN)}xi∈Ryi∈R
??目標輸出是得到一個多項式函數(shù):
f(x)=w1x1+w2x2+wixi+...+wMxM+b=(∑i=1Mwixi)+b
f(x)=w1x1+w2x2+wixi+...+wMxM+b=(∑i=1Mwixi)+b
其中MM表示最高階數(shù)為MM。
??可見在線性擬合的模型中,共包括了(M+1)(M+1)個參數(shù),而該模型雖然不是輸入xx的線性函數(shù),但卻是(M+1)(M+1)個擬合參數(shù)的線性函數(shù),所以稱多項式擬合為線性模型。對于多項式擬合問題,其實就是要確定這(M+1)(M+1)個參數(shù),這里先假設(shè)階數(shù)MM是固定的(MM是一個超參數(shù),可以用驗證集來確定MM最優(yōu)的值,詳細的關(guān)于MM值確定的問題,后面再討論),重點就在于如何求出這(M+1)(M+1)個參數(shù)的值。
2.優(yōu)化目標
??多項式擬合是利用多項式函數(shù)逼近輸入xx和輸出yy的函數(shù)關(guān)系,通過什么指標來衡量某個多項式函數(shù)的逼近程度呢?(其實這就是誤差/損失函數(shù))。擬合/回歸問題常用的評價指標是均方誤差(在機器學(xué)習(xí)中的模型評估與度量博客中,我進行了介紹)。多項式擬合問題也同樣采用該評價指標,以均方誤差作為誤差/損失函數(shù),誤差函數(shù)越小,模型越好。
E(w,b)=1N∑i=1N[f(xi)?yi]2
E(w,b)=1N∑i=1N[f(xi)?yi]2
??系數(shù)1N1N是一常數(shù),對優(yōu)化結(jié)果無影響,可以去除,即將均方誤差替換為平方誤差:
E(w,b)=∑i=1N[f(xi)?yi]2
E(w,b)=∑i=1N[f(xi)?yi]2
?? 到這里,就成功把多項式擬合問題變成了最優(yōu)化問題,優(yōu)化問題可表示為:
argminw,bE(w,b)
arg?minw,b?E(w,b)
即需要求得參數(shù){w1,...,wM,b}{w1,...,wM,b}的值,使得E(w,b)E(w,b)最小化。那么如何對該最優(yōu)化問題求解呢?
3. 優(yōu)化問題求解
3.1 求偏導(dǎo),聯(lián)立方程求解
?? 直觀的想法是,直接對所有參數(shù)求偏導(dǎo),令偏導(dǎo)為0,再聯(lián)立這M+1M+1個方程求解(因為共有M+1M+1個參數(shù),故求偏導(dǎo)后也是得到M+1M+1個方程)。
E(w,b)=∑i=1N[f(xi)?yi]2=∑i=1N[(w1x1i+w2x2i+wixji+...+wMxMi+b)?yi]2
E(w,b)=∑i=1N[f(xi)?yi]2=∑i=1N[(w1xi1+w2xi2+wixij+...+wMxiM+b)?yi]2
利用E(w,b)E(w,b)對各個參數(shù)求偏導(dǎo),如下:
?E(w,b)?wj?E(w,b)?b=2∑i=1N[(w1x1i+w2x2i+wixji+...+wMxMi+b)?yi]xji=2∑i=1N[(w1x1i+w2x2i+wixji+...+wMxMi+b)?yi]
?E(w,b)?wj=2∑i=1N[(w1xi1+w2xi2+wixij+...+wMxiM+b)?yi]xij?E(w,b)?b=2∑i=1N[(w1xi1+w2xi2+wixij+...+wMxiM+b)?yi]
求導(dǎo)之后,將各個點(xi,yi)(xi,yi)的值帶入偏導(dǎo)公式,聯(lián)立方程求解即可。
??針對該解法,可以舉個例子詳細說明,比如有兩個點(2,3),(5,8)(2,3),(5,8),需要利用二階多項式f(x)=w1x+w2x2+bf(x)=w1x+w2x2+b擬合。求解過程如下:
該二階多項式對參數(shù)求偏導(dǎo)得到
?E(w,b)?wj?E(w,b)?b=2∑i=12[(w1x1i+w2x2i+b)?yi]xji=[(w1x1+w2x21+b)?y1]xj1+[(w1x2+w2x22+b)?y2]xj2=2∑i=12[(w1x1i+w2x2i+b)?yi]=[(w1x1+w2x21+b)?y1]+[(w1x2+w2x22+b)?y2]
?E(w,b)?wj=2∑i=12[(w1xi1+w2xi2+b)?yi]xij=[(w1x1+w2x12+b)?y1]x1j+[(w1x2+w2x22+b)?y2]x2j?E(w,b)?b=2∑i=12[(w1xi1+w2xi2+b)?yi]=[(w1x1+w2x12+b)?y1]+[(w1x2+w2x22+b)?y2]
將點(2,3),(5,8)(2,3),(5,8)帶入方程,可以得到3個方程,
2b+7w1+29w2=117b+29w1+133w2=4629b+133w1+641w2=212
2b+7w1+29w2=117b+29w1+133w2=4629b+133w1+641w2=212
聯(lián)立這三個方程求解,發(fā)現(xiàn)有無窮多的解,只能得到3w1+21w2=53w1+21w2=5,這三個方程是線性相關(guān)的,故沒有唯一解。
??該方法通過求偏導(dǎo),再聯(lián)立方程求解,比較復(fù)雜,看著也很不美觀。那么有沒有更加方便的方法呢?
3.2 最小二乘法
?? 其實求解該最優(yōu)化問題(平方和的最小值)一般會采用最小二乘法(其實最小二乘法和求偏導(dǎo)再聯(lián)立方程求解的方法無本質(zhì)區(qū)別,求偏導(dǎo)也是最小二乘法,只是這里介紹最小二乘的矩陣形式而已)。最小二乘法(least squares),從英文名非常容易想到,該方法就是求解平方和的最小值的方法。
??可以將誤差函數(shù)以矩陣的表示(NN個點,最高MM階)為:
∥Xw?y∥2
‖Xw?y‖2
其中,把偏置bb融合到了參數(shù)ww中,
w={b,w1,w2,...,wM}
w={b,w1,w2,...,wM}
XX則表示輸入矩陣,
??????11...1x1x2...xNx21x22...x2N............xM1xM2...xMN??????
[1x1x12...x1M1x2x22...x2M...............1xNxN2...xNM]
yy則表示標注向量,
y={y1,y2,...,yN}T
y={y1,y2,...,yN}T
因此,最優(yōu)化問題可以重新表示為
minw∥Xw?y∥2
minw‖Xw?y‖2
對其求導(dǎo),
?∥Xw?y∥2?w=?(Xw?y)T(Xw?y)?w=?(wTXT?yT)(Xw?y)?w=?(wTXTXw?yTXw?wTXTy+yTy)?w
?‖Xw?y‖2?w=?(Xw?y)T(Xw?y)?w=?(wTXT?yT)(Xw?y)?w=?(wTXTXw?yTXw?wTXTy+yTy)?w
在繼續(xù)對其求導(dǎo)之前,需要先補充一些矩陣求導(dǎo)的先驗知識(常見的一些矩陣求導(dǎo)公式可以參見轉(zhuǎn)載的博客),如下:
?xTa?x=a?ax?x=aT?xTA?x=Ax+ATx
?xTa?x=a?ax?x=aT?xTA?x=Ax+ATx
根據(jù)上面的矩陣求導(dǎo)規(guī)則,繼續(xù)進行損失函數(shù)的求導(dǎo)
?∥Xw?y∥2?w=?(wTXTXw?yTXw?wTXTy+yTy)?w=XTXw+(XTX)Tw?(yTX)T?XTy=2XTXw?2XTy
?‖Xw?y‖2?w=?(wTXTXw?yTXw?wTXTy+yTy)?w=XTXw+(XTX)Tw?(yTX)T?XTy=2XTXw?2XTy
其中XTXw=(XTX)TwXTXw=(XTX)Tw.令求導(dǎo)結(jié)果等于0,即可以求導(dǎo)問題的最小值。
2XTXw?2XTy=0w=(XTX)?1XTy
2XTXw?2XTy=0w=(XTX)?1XTy
??再利用最小二乘法的矩陣形式對前面的例子進行求解,用二階多項式擬合即兩個點(2,3),(5,8)(2,3),(5,8)。
表示輸入矩陣 XX和標簽向量yy
X=[1125425]y=[38]T
X=[1241525]y=[38]T
計算XTXXTX
XTX=???272972913329133641???
XTX=[272972913329133641]
矩陣求逆,再做矩陣乘法運算
但 XTXXTX不可逆,故無唯一解。
??關(guān)于矩陣的逆是否存在,可以通過判斷矩陣的行列式是否為0(det(A)=?0det(A)=?0 來判斷,也可以通過初等行變換,觀察矩陣的行向量是否線性相關(guān),在這個例子下,矩陣不可逆,故有無窮多解。但如果新增一個點(4,7)(4,7),則就可以解了。
??其實這和數(shù)據(jù)集的點數(shù)和選擇的階數(shù)有關(guān),如果點數(shù)小于階數(shù)則會出現(xiàn)無窮解的情況,如果點數(shù)等于階數(shù),那么剛好有解可以完全擬合所有數(shù)據(jù)點,如果點數(shù)大于階數(shù),則會求的近似解。
??那么對于點數(shù)小于階數(shù)的情況,如何求解?在python的多項式擬合函數(shù)中是可以擬合的,而且效果不錯,具體算法不是很了解,可以想辦法參考python的ployfit()函數(shù)的實現(xiàn)。
4. 擬合階數(shù)的選擇
?? 在前面的推導(dǎo)中,多項式的階數(shù)被固定了,那么實際場景下應(yīng)該如何選擇合適的階數(shù)MM呢?
一般會選擇階數(shù)MM小于點數(shù)NN
把訓(xùn)練數(shù)據(jù)分為訓(xùn)練集合驗證集,在訓(xùn)練集上,同時用不同的MM值訓(xùn)練多個模型,然后選擇在驗證集誤差最小的階數(shù)script type="math/tex" id="MathJax-Element-5573"M/script