数理统计代码应用

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)
    #根号:sqrt
    y=1/(np.sqrt(2*np.pi)*sigma)*np.exp(-a)
    return y,mu,sigma

if __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 y

if __name__ == '__main__':
    x=np.linspace(0,5,100) #使用numpy生成 0-5之间100个点
    lam=2          # λ设置为2
    y=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 y

if __name__ == '__main__':
    n=10  # 参数 n设置为10
    p=0.3 # 参数 p设置为0.3
    x=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 y

if __name__ == '__main__':
    n=20   # n设置为20
    lam=5  # λ设置为5
    x=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(μ,σ²)
#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)=σ²=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)²/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/λ²
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


# x²-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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值