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

情感   2024-08-06 10:30   湖北  

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

大家好,我是Peter~

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

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

首先导入需要的库:

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)
  • 方差(Variance)
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, σ)。均值决定了正态分布的中心位置,而标准差则决定分布的宽度。标准差越小,曲线越陡峭;标准差越大,曲线越扁平。

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

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()

指数分布

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

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

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

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

  • 期望值(Mean)
  • 方差(Variance)
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()

泊松分布

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

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

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

其中, 是单位时间(或空间)内发生的事件数, 是可能发生的事件次数(), 是事件平均发生率。

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

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较大时,二项分布可以近似为正态分布。

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

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

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

  • 期望值(Mean)
  • 方差(Variance)
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)表示为:

其中,是单次试验中成功的概率,是试验次数()。

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

  • 期望值(Mean)
  • 方差(Variance)
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()

超几何分布

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

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

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

其中,是总对象数,是成功状态的对象数,是抽取的对象数,是抽取的成功状态对象数。是从个对象中抽取个的组合数,是从个成功状态中抽取个的组合数,是从非成功状态对象中抽取个的组合数。

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

  • 期望值(Mean)
  • 方差(Variance)
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):

其中, 是概率变量,范围在0到1之间(即 ), 是形状参数, 是Beta函数,它是形状参数的函数,用于确保概率的总和为1[^1^][^2^]。

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

  • 期望值(Mean)
  • 方差(Variance)

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

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(01100)
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)为:

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

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

  • 期望值(Mean)

  • 方差(Variance)

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

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)为:

其中, 是位置参数(location parameter), 是尺度参数(scale parameter)。位置参数决定了分布的中位数,而尺度参数则影响分布的离散程度。

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

  • 期望值(Mean)
  • 方差(Variance)
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()


尤而小屋
尤而小屋,一个温馨且有爱的小屋🏡 小屋主人,一手代码谋求生存,一手掌勺享受生活,欢迎你的光临~
 最新文章