数理统计代码应用
1.1應用numpy包
(關于numpy和matplotlib的應用此處不再贅述,pycharm只可讀取label引號內固定寫法)
①正態分布及標準正態分布? normal
import numpy as np import matplotlib.pyplot as plt#定義函數:用代碼自定義完成正態分布密度函數公式 def normal(x):mu=x.mean() #期望sigma=x.std() #標準差a=((x-mu)**2)/(2*sigma**2)#根號:sqrty=1/(np.sqrt(2*np.pi)*sigma)*np.exp(-a)return y,mu,sigmaif __name__ == '__main__':#生成數據,使用numpy生成 -5-5 之間100個點x=np.linspace(-5,5,100)y,mu,sigma=normal(x) #調用函數,計算 y對應的值# 繪制正態分布的概率密度函數圖像plt.plot(x,y,label=r'$\mu={:.2f},\sigma={:.2f}$'.format(mu,sigma))#:.2f: 保留兩位小數plt.legend()plt.show()②均勻分布 uniform
import numpy as np import matplotlib.pyplot as plt #定義函數:用代碼自定義完成均勻分布密度函數公式 def uniform(x,a,b):y=[1/(b-a) if a<=i and i<=b else 0 for i in x]return y if __name__ == '__main__':x=np.linspace(-10,10,100) #使用numpy生成 -10-10 之間100個點# a=3 # a設置為3# b=5 # b設置為5# y=uniform(x,a,b) #調用函數,計算 y對應的值# plt.plot(x,y) #繪制均勻分布的概率密度函數圖像# plt.show()# a,b=(-8,0)、(-3,3)、(2,7)# 用for循環實現繪制多個a,b不同取值的圖像for k in [(-8,0),(-3,3),(2,7)]:a,b=k[0],k[1]y=uniform(x,a,b)plt.plot(x,y,label='a={},b={}'.format(a,b))plt.legend()plt.show()③指數分布 expon
import numpy as np import matplotlib.pyplot as plt #定義函數:用代碼自定義完成指數分布密度函數公式 def exp0(x,lam):y=lam*np.exp(-lam*x)return yif __name__ == '__main__':x=np.linspace(0,5,100) #使用numpy生成 0-5之間100個點lam=2 # λ設置為2y=exp0(x,lam) #調用函數,計算 y對應的值plt.plot(x,y) #繪制指數分布的概率密度函數圖像plt.show()# λ=2,3,6# for lam in [2,3,6]: #用for循環實現繪制多個λ取值的圖像# y=exp0(x,lam)# plt.plot(x,y,label=r'$\lambda={}$'.format(lam))# plt.legend()# plt.show()④二項分布 binomial
import numpy as np import matplotlib.pyplot as plt import scipy.special as sp #組合 C:comb 排列 A:perm 階乘:factorial #定義分布律函數:X取值時1個個點的概率 def binomial(n,p):y=[sp.comb(n,k)*(p**k)*(1-p)**(n-k) for k in range(n+1)]return yif __name__ == '__main__':n=10 # 參數 n設置為10p=0.3 # 參數 p設置為0.3x=np.arange(n+1) #使用numpy生成 0,1...10 11個點y=binomial(n,p) #調用函數,計算 y對應的值plt.scatter(x,y) #繪制分布律函數圖像plt.show()⑤泊松分布 possion
import numpy as np import matplotlib.pyplot as plt import scipy.special as sp #定義函數:用代碼自定義完成泊松分布的分布律公式 def possion(lam,n):y=[(lam**k/sp.factorial(k))*np.exp(-lam) for k in range (n+1)]return yif __name__ == '__main__':n=20 # n設置為20lam=5 # λ設置為5x=np.arange(n+1) #使用numpy生成 0,1...20 21個點y=possion(lam,n) #調用函數,計算 y對應的值plt.scatter(x,y) #繪制分布律函數圖像plt.show()1.2應用scipy包
(個人推薦用scipy,此包功能非常強大)
①正態分布及標準正態分布? normal
import numpy as np import scipy.stats import matplotlib.pyplot as plt #生成正態分布 X~N(2,9) X~N(μ,σ2) #X~N(2,9),μ=2,σ=3 #scipy.stats.norm(loc=2,scale=3) #loc=μ,scale=σ dist=scipy.stats.norm(loc=2,scale=3) #生成數據 x=np.linspace(-6,9,100) #概率密度函數f(x) pdf=dist.pdf(x) #分布函數 F(x) cdf=dist.cdf(x) #繪制概率密度函數和分布函數的圖像(子圖) plt.subplot(1,2,1) plt.plot(x,pdf) plt.subplot(1,2,2) plt.plot(x,cdf) plt.show()#根據已知分布,隨機生成n個樣本點 #根據生成正態分布dist,隨機生成1000個樣本點 sample=dist.rvs(1000) #1000個樣本點的期望和方差 #期望 E(x)=μ=2 print(sample.mean()) #方差 D(x)=σ2=9 print(sample.var())#已知X~N(3,16),求概率P(X<=10) dist1=scipy.stats.norm(loc=3,scale=4) #求概率P(x<=10)=F(10) print('概率P(x<=10)=',dist1.cdf(10))#求概率P(2<=X<=7) # dist2=scipy.stats.norm(loc=3,scale=4) print('概率P(2<=X<=7)=',dist1.cdf(7)-dist1.cdf(2)) #求概率P(X>4) # dist2=scipy.stats.norm(loc=3,scale=4) print('概率P(X>4)=',1-dist1.cdf(4))②均勻分布 uniform
import numpy as np import scipy.stats import matplotlib.pyplot as plt#生成均勻分布X~U(a,b) #X~U[-1,1],a=-1,b=1 dist=scipy.stats.uniform(loc=-1,scale=2) #生成數據 x=np.linspace(-3,3,100) #概率密度函數 pdf=dist.pdf(x) #分布函數 cdf=dist.cdf(x) #繪制圖像 plt.subplot(1,2,1) plt.plot(x,pdf) #概率密度函數 plt.subplot(1,2,2) plt.plot(x,cdf) #分布函數 plt.show()#根據分布,隨機生成1500個樣本 sample=dist.rvs(1500) #期望 E(X)=(a+b)/2 print(sample.mean()) #方差 D(X)=(b-a)2/12 print(sample.var())③指數分布 expon
import numpy as np import scipy.stats import matplotlib.pyplot as plt#生成指數分布X~e(λ) #X~e(λ) λ=3 #scipy.stats.expon(scale=1/3)指數分布必須寫參數名,正態和均勻可以不寫 dist=scipy.stats.expon(scale=1/3) #生成數據 x=np.linspace(0,3,100) #概率密度函數 pdf=dist.pdf(x) #分布函數 cdf=dist.cdf(x) #繪制圖像 plt.subplot(1,2,1) plt.plot(x,pdf) #概率密度函數 plt.subplot(1,2,2) plt.plot(x,cdf) #分布函數 plt.show()#根據分布,隨機生成1500個樣本 sample=dist.rvs(1500) #期望 E(X)=1/λ print(sample.mean()) #方差 D(X)=1/λ2 print(sample.var())④二項分布 binomial
import numpy as np import scipy.stats import matplotlib.pyplot as plt#生成指數分布X~b(n,p) #X~b(n,p) n=10,p=0.3 #二項分布不需要寫參數名 dist=scipy.stats.binom(10,0.3) #生成數據 x=np.arange(10+1) #分布律 P(X=k)= pmf=dist.pmf(x) #分布函數 cdf=dist.cdf(x) #繪制圖像 plt.subplot(1,2,1) plt.scatter(x,pmf) #分布律 plt.subplot(1,2,2) plt.scatter(x,cdf) #分布函數 plt.show()# #根據分布,隨機生成1500個樣本 # sample=dist.rvs(1500) # #期望 E(X)=np # print(sample.mean()) # #方差 D(X)=np(1-p) # print(sample.var())⑤泊松分布 possion
import numpy as np import scipy.stats import matplotlib.pyplot as plt#生成泊松分布X~P(λ) # X~P(λ) λ=5 dist=scipy.stats.poisson(5) #生成數據 0~10之間11個點 x=np.arange(11) #x=np.linspace(0,10,11) #分布律 pmf=dist.pmf(x) #分布函數 cdf=dist.cdf(x)#繪制圖像 plt.subplot(1,2,1) plt.scatter(x,pmf) plt.subplot(1,2,2) plt.scatter(x,cdf) plt.show()#已知 X~p(4),求 dist1=scipy.stats.poisson(4) x=np.arange(11) pmf=dist.pmf(x) cdf=dist.cdf(x) #(1)概率P(X<=8)= print('概率P(x<=8)=',dist1.cdf(8)) #(2)概率P(1<x<4)= print('概率P(1<x<4)=',dist1.pmf(2)+dist1.pmf(3))#離散型:P(X<=a)=F(a) P(a<x<=b)=F(b)-F(a) 其他情況下不可以用F來做 #其他情況用區間內點的概率相加⑥高等數學運算
解方程,求定積分,求數值積分(求數值積分所得積分值比求定積分更準確)
scipy解方程是由設置的初始值同時向倆端求解,但只能得出離初始值最近的一個解
import numpy as np import scipy.optimize import scipy.integrate# x2-4=0 #設置函數 func=lambda x:x**2-4 sol=scipy.optimize.fsolve(func,-1) #fsolve(func,-1) 第一個參數:設置的方程 第二個參數:開始計算時代入的初始值 print(sol)#設置函數 func=lambda x:(np.cos(x)+np.sin(x))**2 #求 f(x)在[0,3]的定積分 fso=scipy.integrate.quad(func,0,3) #scipy.integrate.quad(func,0,3) #第一個參數:被積函數 第二個參數:積分下限 第三個函數:積分上限 print(fso)#設置函數 func=lambda x:np.sin(np.exp(x+1)) #求f(x)在[0,4]上的定積分 fso=scipy.integrate.quad(func,0,4) print(fso)#求f(x)在[0,4]上的數值積分 x=np.linspace(0,4,1000) y=func(x) dso=scipy.integrate.trapz(y,x) print(dso)總結
- 上一篇: Android 上下滚动字幕实现
- 下一篇: [SPOJ DQUERY] D-quer