【python】Distribution

文章目录

  • [1、Uniform Distribution](#1、Uniform Distribution)
  • [2、Normal Distribution](#2、Normal Distribution)
  • [3、Logarithmic Normal Distribution](#3、Logarithmic Normal Distribution)
  • [4、Poisson distribution](#4、Poisson distribution)
  • [5、Exponential Distribution](#5、Exponential Distribution)
  • [6、Binomial Distribution](#6、Binomial Distribution)
  • [7、Student's t-distribution](#7、Student's t-distribution)
  • [8、chi-square distribution](#8、chi-square distribution)
  • 9、参考

1、Uniform Distribution

均匀分布

python 复制代码
import numpy as np  
import matplotlib.pyplot as plt 
from scipy import stats 
 
# for continuous  
a = 0 
b = 50 
size = 5000 
 
X_continuous = np.linspace(a, b, size) 
continuous_uniform = stats.uniform(loc=a, scale=b) 
continuous_uniform_pdf = continuous_uniform.pdf(X_continuous) 
 
# for discrete 
X_discrete = np.arange(1, 7) 
discrete_uniform = stats.randint(1, 7) 
discrete_uniform_pmf = discrete_uniform.pmf(X_discrete)  
 
# plot both tables 
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(15,5)) 
# discrete plot 
ax[0].bar(X_discrete, discrete_uniform_pmf) 
ax[0].set_xlabel("X") 
ax[0].set_ylabel("Probability") 
ax[0].set_title("Discrete Uniform Distribution") 
# continuous plot 
ax[1].plot(X_continuous, continuous_uniform_pdf) 
ax[1].set_xlabel("X") 
ax[1].set_ylabel("Probability") 
ax[1].set_title("Continuous Uniform Distribution") 
plt.show()

2、Normal Distribution

高斯分布,采用的是 stats.norm 实现

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

mu = 0
variance = 1 
sigma = np.sqrt(variance) 
x = np.linspace(mu - 3*sigma, mu + 3*sigma, 100) 
 
plt.subplots(figsize=(8, 5)) 
plt.plot(x, stats.norm.pdf(x, mu, sigma)) 
plt.title("Normal Distribution") 
plt.show()

只绘制了 ± 3 σ \sigma σ 范围内的

68% 的数据落在平均值的一个标准差内。

95% 的数据落在平均值的两个标准差内。

99.7% 的数据落在平均值的三个标准差范围内。

3、Logarithmic Normal Distribution

对数正态分布(logarithmic normal distribution)是一种重要的概率分布类型

一、定义

对数正态分布是指一个随机变量的对数服从正态分布,则该随机变量服从对数正态分布。即,如果随机变量X的对数ln(X)服从正态分布N(μ,σ²),则称X服从对数正态分布。

二、性质

  • 非负性:对数正态分布的随机变量只能取正值,因为对数函数只能对正数定义。
  • 偏态性:对数正态分布是右偏的,即大部分数据集中在左侧,但有长尾分布在右侧。
  • 对数的正态性:对数正态分布的随机变量取对数后服从正态分布。
  • 尺度不变性:对数正态分布的随机变量乘以常数后仍服从对数正态分布。

三、与正态分布的区别

  • 数据分布:正态分布数据对称分布于平均值周围,而对数正态分布数据则呈偏态分布。
  • 值域:正态分布可以取任何实数,而对数正态分布只能取正值。
  • 统计量:正态分布的常用统计量是平均值和标准差,而对数正态分布的常用统计量是对数平均值和对数标准差。

采用的是 stats.lognorm 实现

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

X = np.linspace(0, 6, 500) 
 
std = 1 
mean = 0 
lognorm_distribution = stats.lognorm([std], loc=mean) 
lognorm_distribution_pdf = lognorm_distribution.pdf(X) 
 
fig, ax = plt.subplots(figsize=(8, 5)) 
plt.plot(X, lognorm_distribution_pdf, label="μ=0, σ=1") 
ax.set_xticks(np.arange(min(X), max(X))) 
 
std = 0.5 
mean = 0 
lognorm_distribution = stats.lognorm([std], loc=mean) 
lognorm_distribution_pdf = lognorm_distribution.pdf(X) 
plt.plot(X, lognorm_distribution_pdf, label="μ=0, σ=0.5") 
 
std = 1.5 
mean = 1 
lognorm_distribution = stats.lognorm([std], loc=mean) 
lognorm_distribution_pdf = lognorm_distribution.pdf(X) 
plt.plot(X, lognorm_distribution_pdf, label="μ=1, σ=1.5") 
 
plt.title("Lognormal Distribution") 
plt.legend() 
plt.show()

4、Poisson distribution

泊松分布(Poisson distribution)是一种离散概率分布,由法国数学家西莫恩·德尼·泊松(Siméon-Denis Poisson)在19世纪30年代发表。以下是对泊松分布的详细解释:

一、定义与特点

泊松分布用于描述在固定时间或空间内,随机事件以固定平均速率发生且独立于上一个事件的间隔发生时间的次数分布。其特点包括:

  • 离散性:泊松分布是离散概率分布,即事件发生的次数只能是非负整数。
  • 独立性:每次事件是否发生不受之前事件的影响,即事件之间是相互独立的。
  • 稳定性:事件发生的平均速率保持恒定,不随时间或空间的变化而变化。
  • 稀有性:虽然单个事件发生的概率可能很小,但在长时间或大面积内,事件的总发生次数可能是可观的。

二、参数与公式

k 是事件发生的次数,λ 是单位时间或空间内事件的平均发生率

这个公式用于计算在给定 λ 和 k 的情况下,事件正好发生 k 次的概率。

三、实例分析

以每天收到的邮件数量为例,假设平均每天收到 4 封信,且收到任何邮件都不影响未来邮件的到达时间(即邮件彼此独立地到达)。那么,每天收到的邮件数量服从一个泊松分布,其参数 λ=4。根据泊松分布的概率质量函数,可以计算出每天收到0封、1封、2封......等任意数量邮件的概率。

四、注意事项

  • 适用条件:泊松分布适用于描述稀有且独立的事件。如果事件不是独立的或发生速率不是恒定的,则泊松分布可能不适用。
  • 参数估计:在实际应用中,通常需要根据历史数据来估计λ的值。估计方法包括矩估计法、最大似然估计法等。
  • 模型检验:在建立泊松分布模型后,需要进行模型检验以验证其适用性。常用的检验方法包括卡方检验、Kolmogorov-Smirnov检验等。
python 复制代码
import matplotlib.pyplot as plt
from scipy import stats

X = stats.poisson.rvs(mu=3, size=500)

plt.subplots(figsize=(8, 5))
plt.hist(X, density=True, edgecolor="black")
plt.title("Poisson Distribution")
plt.show()

泊松分布的曲线类似于正态分布,λ 表示峰值。

5、Exponential Distribution

指数分布(Exponential distribution)是概率论和统计学中的一种连续概率分布

指数分布用于描述泊松过程中事件之间的时间间隔的概率分布。泊松过程是一种描述随机事件发生次数的计数过程,其特点是事件的发生数服从泊松分布。在泊松过程中,两个连续事件发生的时间间隔服从指数分布

  • 连续性:指数分布是连续概率分布,即事件可以在任何时间点上发生。
  • 无记忆性:指数分布具有无记忆性,即过去的时间不影响未来的分布。也就是说,不论已经等待了多长时间,剩下等待时间的分布都是相同的。
  • 参数唯一性:指数分布的唯一参数是λ(lambda),它表示单位时间内事件发生的平均次数。

λ 越大,事件发生的速率越快,但数学期望和方差却越小

下面看看代码实现

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

X = np.linspace(0, 5, 5000)

exponetial_distribtuion = stats.expon.pdf(X, loc=0, scale=1)
exponetial_distribtuion1 = stats.expon.pdf(X, loc=0, scale=2)
exponetial_distribtuion2 = stats.expon.pdf(X, loc=0, scale=0.5)

plt.subplots(figsize=(8, 5))
plt.plot(X, exponetial_distribtuion1, label="λ = 0.5")
plt.plot(X, exponetial_distribtuion, label="λ = 1")
plt.plot(X, exponetial_distribtuion2, label="λ = 2")

plt.title("Exponential Distribution")
plt.legend()
plt.show()

核心函数 scipy.stats.expon.pdf

scipy.stats.expon.pdf 是 SciPy 库中用于计算指数分布概率密度函数(Probability Density Function, PDF)的函数。指数分布是一种连续概率分布,通常用于描述随机事件之间的时间间隔,比如顾客到达商店的时间间隔、电话呼叫的间隔时间等。

python 复制代码
scipy.stats.expon.pdf(x, scale=1, loc=0)

参数

  • x : array_like
    输入值,可以是单个数值或数组,表示你希望计算 PDF 的点。
  • scale : float, optional
    尺度参数(也称为 λ 的倒数),默认值为 1。在指数分布中,尺度参数是事件发生的平均时间间隔,即 1/λ。注意,SciPy 的指数分布使用 scale 而不是 λ 作为参数,因此如果你知道 λ,则需要计算 scale = 1/λ。
  • loc : float, optional
    位置参数,默认值为 0。它表示分布的最小可能值。对于指数分布,通常设置为 0,因为指数分布是从 0 开始的正数分布。

返回值

  • 返回输入值 x 处指数分布的概率密度函数值。如果 x 是数组,则返回与 x 形状相同的数组,其中每个元素是对应 x 值处的 PDF 值。

6、Binomial Distribution

二项分布(Binomial Distribution)是概率论中的一种重要离散概率分布,它用于描述在固定次数的独立重复试验中,某一事件成功次数的概率分布。

python 复制代码
import numpy as np
import matplotlib.pyplot as plt

X = np.random.binomial(n=1, p=0.5, size=1000)

plt.subplots(figsize=(8, 5))
plt.hist(X)
plt.title("Binomial Distribution")
plt.show()

例子中给出了 1000 个样本,概率设置为 0.5,可视化的结果可以看出来差不多也是 55 开,类比抛硬币

7、Student's t-distribution

学生 t 分布是在总体方差未知的情况下,用于估计呈正态分布的总体的均值,或者对两个样本均值差异进行显著性检验的一种概率分布。

原理有点忘了,补一补(统计学-t分布

python 复制代码
import seaborn as sns
from scipy import stats
import matplotlib.pyplot as plt

X1 = stats.t.rvs(df=1, size=4)
X2 = stats.t.rvs(df=3, size=4)
X3 = stats.t.rvs(df=6, size=4)

plt.subplots(figsize=(8, 5))
sns.kdeplot(X1, label="1 d.o.f")
sns.kdeplot(X2, label="3 d.o.f")
sns.kdeplot(X3, label="6 d.o.f")
plt.title("Student's t distribution")
plt.legend()
plt.xlim(-20, 20)  # 限制x轴的数值范围为0到8
plt.show()

scipy.stats.t.rvs 是 SciPy 库中用于生成学生 t 分布(Student's t-distribution)随机变量的函数。这个函数允许你指定 t 分布的自由度(degrees of freedom, df)以及其他可选参数,如随机变量的数量、随机种子等,来生成符合指定 t 分布的随机样本。

参数说明

  • df(自由度): 必须参数,表示 t 分布的自由度。自由度通常是一个正整数,但在某些特殊情况下(如使用非整数值的自由度进行模拟或理论研究时),也可以是正实数。然而,在实际应用中,自由度通常与样本大小相关,如 n-1(对于单样本 t 检验)或两个样本大小之差减2(对于双样本 t 检验)。
  • size(样本数量): 可选参数,默认为 None。如果指定了 size,则函数将返回一个形状为 size 的数组,其中包含了符合指定 t 分布的随机样本。如果 size 是一个整数,则返回一个一维数组;如果 size 是一个元组,则返回一个多维数组。
  • random_state(随机种子): 可选参数,默认为 None。如果指定了 random_state,则可以使用该种子来生成可重复的随机数序列。这对于调试和测试非常有用。random_state 可以是一个整数(作为随机数生成器的种子),也可以是一个 numpy.random.RandomState 对象或 numpy.random.Generator 对象。

返回值

  • 返回一个数组,其中包含符合指定 t 分布的随机样本。数组的形状由 size 参数决定。

8、chi-square distribution

一、定义

若n个相互独立的随机变量ξ₁、ξ₂、......、ξn,均服从标准正态分布(也称独立同分布于标准正态分布N(0,1)),则这n个服从标准正态分布的随机变量的平方和构成一新的随机变量,其分布规律称为卡方分布。其中参数n=v,称为自由度。

二、性质

  • 正偏态分布:卡方分布在第一象限内,卡方值都是正值,呈正偏态(右偏态)。随着自由度的增大,分布趋近于正态分布。
  • 可加性:若两个卡方分布独立,则它们的和也服从卡方分布,且自由度为两者自由度之和。
  • 均值与方差:卡方分布的均值等于其自由度,方差为自由度的两倍。
  • 不同自由度的卡方分布:不同的自由度决定了不同的卡方分布形态,自由度越小,分布越偏斜。
python 复制代码
from scipy import stats
import matplotlib.pyplot as plt
import numpy as np

X = np.arange(0, 6, 0.25)

plt.subplots(figsize=(8, 5))
plt.plot(X, stats.chi2.pdf(X, df=1), label="1 d.o.f")
plt.plot(X, stats.chi2.pdf(X, df=2), label="2 d.o.f")
plt.plot(X, stats.chi2.pdf(X, df=3), label="3 d.o.f")
plt.title("Chi-squared Distribution")
plt.legend()
plt.show()

9、参考

相关推荐
小蜗牛慢慢爬行4 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
Algorithm157614 分钟前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
岑梓铭14 分钟前
(CentOs系统虚拟机)Standalone模式下安装部署“基于Python编写”的Spark框架
linux·python·spark·centos
shinelord明24 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
游客52028 分钟前
opencv中的各种滤波器简介
图像处理·人工智能·python·opencv·计算机视觉
Monly2130 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu31 分钟前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
Eric.Lee202131 分钟前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频
7yewh34 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
Dontla36 分钟前
vscode怎么设置anaconda python解释器(anaconda解释器、vscode解释器)
ide·vscode·python