python实现10种概率分布(附代码)

2024-08-07 10:45:17 浏览数 (2)

公众号:尤而小屋 编辑:Peter 作者:Peter

大家好,我是Peter~

今天给大家介绍如何Python实现10种概率分布。

  • 均匀分布
  • 正态分布
  • 指数分布
  • 泊松分布
  • 二项分布
  • 几何分布
  • 超几何分布
  • Beta分布
  • Weibull分布
  • Gumbel分布

首先导入需要的库:

代码语言:python代码运行次数:0复制
import numpy as np
import matplotlib.pyplot as plt

from scipy.stats import beta
from scipy.stats import weibull_min

均匀分布

匀分布是指在一个区间内所有值出现的概率均等的概率分布。

在概率论和统计学中,均匀分布也被称为矩形分布。这种分布可以通过两个参数a和b来定义,它们分别是数轴上的最小值和最大值,因此通常表示为U(a, b)。

在这种分布下,随机变量在区间a, b内的每个值出现的概率是相等的。

均匀分布是指在一个区间内所有值出现的概率均等的概率分布

对于连续型均匀分布,期望值和方差可以分别计算如下:

  • 期望值(Mean):$$( E(X) = frac{a b}{2} $$
  • 方差(Variance):$$( text{Var}(X) = frac{(b - a)^2}{12} )$$
代码语言:python代码运行次数:0复制
def uniform_distribution(a, b, size=1000):
    return np.random.uniform(a, b, size)

a = 0
b = 1
size = 1000
samples = uniform_distribution(a, b, size)
plt.hist(samples, bins=30, density=True)
plt.title("Uniform Distribution")
plt.show()

正态分布

正态分布是概率论与统计学中最重要的连续概率分布之一,也称为高斯分布

正态分布的概率密度函数具有集中性、对称性和均匀变动性等特点。其图形呈现中间高两边低的特征,即数据在均值附近密集,远离均值时逐渐稀疏。

正态分布完全由两个参数决定:均值(mean, μ)和标准差(standard deviation, σ)。均值决定了正态分布的中心位置,而标准差则决定分布的宽度。标准差越小,曲线越陡峭;标准差越大,曲线越扁平。

其概率密度函数曲线呈钟形,因此又被称为钟形曲线。

代码语言:python代码运行次数:0复制
def normal_distribution(mu, sigma, size=1000):
    return np.random.normal(mu, sigma, size)

mu = 0
sigma = 1
size = 1000
samples = normal_distribution(mu, sigma, size)
plt.hist(samples, bins=30, density=True)
plt.title("Normal Distribution")
plt.show()

指数分布

指数分布是一种连续型概率分布,用于描述独立随机事件发生的时间间隔的概率

指数分布的概率密度函数为:

$$ f(x) = lambda e^{-lambda x} quad (x geq 0) $$

其中,x是两个事件发生的时间间隔,λ是每单位时间事件发生的平均次数。指数分布的重要特性之一是无记忆性,即当前事件与过去发生的事件无关,这使得指数分布在处理独立随机事件间隔时非常有效。

指数分布的期望(均值)和方差分别为:

  • 期望值(Mean):$$( E(X) = frac{1}{lambda} )$$
  • 方差(Variance):$$( text{Var}(X) = frac{1}{lambda^2} )$$
代码语言:python代码运行次数:0复制
def exponential_distribution(lam, size=1000):
    return np.random.exponential(1/lam, size)

lam = 1
size = 1000
samples = exponential_distribution(lam, size)
plt.hist(samples, bins=30, density=True)
plt.title("Exponential Distribution")
plt.show()

泊松分布

泊松分布是一种离散概率分布,用于描述单位时间(或空间)内随机事件发生次数的概率

泊松分布适用于描述稀有事件的发生频率。其参数λ表示单位时间(或空间)内事件平均发生的次数。该分布在众多实际应用场景中都有重要地位,如服务设施在特定时间内受到的服务请求次数、电话交换机接到的呼叫次数、自然灾害发生的次数等。

泊松分布的数学表达式为:

$$ P(X = k) = frac{lambda^k e^{-lambda}}{k!} $$

其中,$X$ 是单位时间(或空间)内发生的事件数,$k$ 是可能发生的事件次数($k = 0, 1, 2, ldots$),$lambda$ 是事件平均发生率。

泊松分布的期望(均值)和方差均为 $lambda$。

代码语言:python代码运行次数:0复制
def poisson_distribution(lam, size=1000):
    return np.random.poisson(lam, size)

lam = 5
size = 1000
samples = poisson_distribution(lam, size)
plt.hist(samples, bins=30, density=True)
plt.title("Poisson Distribution")
plt.show()

二项分布

二项分布是一种离散概率分布,用于描述在n次独立的伯努利试验中成功的次数的概率分布

这种分布适用于仅有两个可能结果的单次试验,即“成功”和“失败”,成功的概率为p,失败的概率则为1-p。当试验次数n较大时,二项分布可以近似为正态分布。

二项分布的概率质量函数的公式表示为:

$$ P(X = k) = binom{n}{k} p^k (1-p)^{n-k} $$

其中,$binom{n}{k}$ 是组合数,表示从n次试验中选择k次成功的方式数目。当n=1时,二项分布便简化为伯努利分布。

二项分布的期望(均值)和方差分别为:

  • 期望值(Mean):$E(X) = np$
  • 方差(Variance):$text{Var}(X) = np(1-p)$
代码语言:python代码运行次数:0复制
def binomial_distribution(n, p, size=1000):
    return np.random.binomial(n, p, size)

n = 10
p = 0.5
size = 1000
samples = binomial_distribution(n, p, size)
plt.hist(samples, bins=np.arange(n 1)-0.5, density=True)
plt.title("Binomial Distribution")
plt.show()

几何分布

几何分布是一种离散概率分布,用于描述在进行一系列伯努利试验中,试验k次才得到第一次成功的概率

几何分布可以通过以下两种方式定义:

  1. 常规定义:在n次伯努利试验中,试验进行到第k次才首次成功的概率。具体来说,前k-1次皆失败,第k次成功。
  2. 无限试验定义:这种情况不限定试验次数,只要继续失败,试验就会持续进行,直到首次成功为止。

几何分布的概率质量函数(PMF)表示为:

$$ P(X = k) = (1-p)^{k-1} cdot p $$

其中,$p$是单次试验中成功的概率,$k$是试验次数($k=1,2,3,ldots$)。

几何分布的期望(均值)和方差分别为:

  • 期望值(Mean):$E(X) = frac{1}{p}$
  • 方差(Variance):$text{Var}(X) = frac{1-p}{p^2}$
代码语言:python代码运行次数:0复制
def geometric_distribution(p, size=1000):
    return np.random.geometric(p, size)

p = 0.5
size = 1000
samples = geometric_distribution(p, size)
plt.hist(samples, bins=np.arange(max(samples) 1), density=True)
plt.title("Geometric Distribution")
plt.show()

超几何分布

超几何分布是一种离散概率分布,用于描述在有限样本中抽取特定类别项的概率,而不放回样本的经典问题

在超几何分布的模型中,我们从一个包含有限个对象的集合中进行抽样,这些对象分为两类:成功状态和失败状态。在每次抽取时,一个对象被选中并从总体中移除,这导致每次抽取后总体组成的变化。这种“无放回”的抽样方法使得超几何分布与有放回抽样的二项分布不同。

超几何分布的概率质量函数为:

$$ P(X = k) = frac{binom{K}{k} binom{N-K}{n-k}}{binom{N}{n}} $$

其中,$N$是总对象数,$K$是成功状态的对象数,$n$是抽取的对象数,$k$是抽取的成功状态对象数。$binom{N}{n}$是从$N$个对象中抽取$n$个的组合数,$binom{K}{k}$是从$K$个成功状态中抽取$k$个的组合数,$binom{N-K}{n-k}$是从非成功状态对象中抽取$n-k$个的组合数。

超几何分布的期望(均值)和方差分别为:

  • 期望值(Mean):$E(X) = n frac{K}{N}$
  • 方差(Variance):$text{Var}(X) = n frac{K}{N} left(1 - frac{K}{N}right) frac{N-n}{N-1}$
代码语言:python代码运行次数:0复制
def hypergeometric_distribution(M, n, N, size=1000):
    return np.random.hypergeometric(M, n, N, size)

M = 100
n = 20
N = 50
size = 1000
samples = hypergeometric_distribution(M, n, N, size)
plt.hist(samples, bins=np.arange(min(samples), max(samples) 1), density=True)
plt.title("Hypergeometric Distribution")
plt.show()

Beta分布

Beta分布,也被称为贝塔分布,是一种连续型概率分布,通常用于描述在一个固定区间内的概率变量的分布

Beta分布的概率密度函数(PDF):

$$ f(x|a, b) = frac{1}{B(a, b)} x^{a-1} (1-x)^{b-1} $$

其中,$x$ 是概率变量,范围在0到1之间(即 $0 < x < 1$ ),$a > 0$ 和 $b > 0$ 是形状参数,$B(a, b)$ 是Beta函数,它是形状参数的函数,用于确保概率的总和为1^1^。

Beta分布的期望(均值)和方差分别为:

  • 期望值(Mean):$E(X) = frac{a}{a b}$
  • 方差(Variance):$text{Var}(X) = frac{ab}{(a b)^2(a b 1)}$

Beta分布因其灵活性和在各种不同应用场景中的适用性而备受关注。例如,在贝叶斯统计中,Beta分布经常被用作二项分布的共轭先验,这使得它在处理概率估计问题时非常有用。此外,Beta分布在可靠性工程、生存分析和经济学模型中也有广泛应用。

代码语言:python代码运行次数:0复制
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import beta

def beta_distribution(a, b, size=1000):
    return np.random.beta(a, b, size)

a = 2
b = 5
size = 1000
samples = beta_distribution(a, b, size)
x = np.linspace(0, 1, 100)
y = beta.pdf(x, a, b)
plt.plot(x, y, 'r-', lw=2)
plt.hist(samples, bins=30, density=True)
plt.title("Beta Distribution")
plt.show()

Weibull分布

Weibull分布,也称为威布尔分布,是一种连续概率分布,广泛应用于生存分析、工程学、可靠性分析和质量控制等领域

Weibull分布的概率密度函数(PDF)为:

$$ f(x; lambda, k) = frac{k}{lambda} left(frac{x}{lambda}right)^{k-1} e^{-(x/lambda)^k} $$

其中,$x$是随机变量,$lambda > 0$是比例参数(scale parameter),$k > 0$是形状参数(shape parameter)。比例参数$lambda$决定了分布的尺度,而形状参数$k$则影响分布的形状。

Weibull分布的期望(均值)和方差分别为:

  • 期望值(Mean):$E(X) = lambda Gammaleft(1 frac{1}{k}right)$
  • 方差(Variance):$text{Var}(X) = lambda^2 leftGammaleft(1 frac{2}{k}right) - Gamma^2left(1 frac{1}{k}right)right$

Weibull分布因其能够灵活适应不同的数据形态而备受青睐。当$k=1$时,它呈现指数分布的形态,适用于描述随机事件发生的时间间隔。$k=2$时,它又呈现出类似于正态分布的钟形曲线,但比正态分布具有更厚的尾巴,这使得它在处理极端事件或异常值时更为有效。

代码语言:python代码运行次数:0复制
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import weibull_min

def weibull_distribution(c, scale, size=1000):
    return weibull_min.rvs(c, scale=scale, size=size)

c = 2
scale = 1
size = 1000
samples = weibull_distribution(c, scale, size)
x = np.linspace(weibull_min.ppf(0.01, c), weibull_min.ppf(0.99, c), 100)
y = weibull_min.pdf(x, c, scale=scale)
plt.plot(x, y, 'r-', lw=2)
plt.hist(samples, bins=30, density=True)
plt.title("Weibull Distribution")
plt.show()

Gumbel分布

Gumbel分布,也称为极值I型分布,是一种连续概率分布,常用于统计学中描述极大值或极小值的分布

Gumbel分布的概率密度函数(PDF)为:

$$ f(x; mu, beta) = frac{1}{beta} e^{-z - e^{-z}} $$

其中,$z = (x-mu)/beta$,$mu$ 是位置参数(location parameter),$beta > 0$ 是尺度参数(scale parameter)。位置参数决定了分布的中位数,而尺度参数则影响分布的离散程度。

Gumbel分布的期望(均值)和方差分别为:

  • 期望值(Mean):$E(X) = mu 0.5772 beta$
  • 方差(Variance):$text{Var}(X) = frac{pi^2 beta^2}{12}$
代码语言:python代码运行次数:0复制
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gumbel_r

def gumbel_distribution(mu, beta, size=1000):
    return gumbel_r.rvs(mu, beta, size=size)

mu = 0
beta = 1
size = 1000
samples = gumbel_distribution(mu, beta, size)
x = np.linspace(gumbel_r.ppf(0.01, mu, beta), gumbel_r.ppf(0.99, mu, beta), 100)
y = gumbel_r.pdf(x, mu, beta)
plt.plot(x, y, 'r-', lw=2)
plt.hist(samples, bins=30, density=True)
plt.title("Gumbel Distribution")
plt.show()

0 人点赞