Python:Python中的随机采样和概率分布(二)
在上一篇博文《Python中的随机采样和概率分布(一)》中,我们介绍了Python中最简单的随机采样函数。接下来我们更进一步,来看看如何从一个概率分布中采样,我们以几个机器学习中最常用的概率分布为例。
1. 二项(binomial)/伯努利(Bernoulli)分布
1.1 概率质量函数(pmf)
当时,则取到下列极限情况,是为参数为的二项分布:
二项分布可以表示进行独立重复试验次,每次有两成功和失败可能结果(分别对应概率和),共成功次的概率。
1.2 函数原型
random.binomial(n, p, size=None)
参数:
n
: int or array_like of ints 对应分布函数中的参数 n
,>=0,浮点数会被截断为整形。
p
: float or array_like of floats 对应分布函数参数, >=0并且<=1。
size
: int or tuple of ints, optional 如果给定形状为,那么个随机样本会从中抽取。默认为None,即返回一个一个标量随机样本。
返回:
out
: ndarray or scalar 从带参数的概率分布中采的随机样本,每个样本表示独立重复实验次中成功的次数。
1.3 使用样例
设进行独立重复实验10次,每次成功概率为0.5,采样样本表示总共的成功次数(相当于扔10次硬币,正面朝上的次数)。总共采20个样本。
import numpy as np
n, p = 10, .5
s = np.random.binomial(n, p, 20)
print(s) # [4 5 6 5 4 2 4 6 7 2 4 4 2 4 4 7 6 3 5 6]
可以粗略的看到,样本几乎都在5周围上下波动。
我们来看一个有趣的例子。一家公司钻了9口井,每口井成功的概率为0.1,所有井都失败了,发生这种情况的概率是多少?
我们总共采样2000次,来看下产生0结果的概率。
s = sum(np.random.binomial(9, 0.1, 20000) == 0)/20000.
print(s) # 0.3823
可见,所有井失败的概率为0.3823,这个概率还是蛮大的。
2. 多项(multinomial)分布
2.1 概率质量函数(pmf)
当时,则取到下列极限情况,是为参数为, 的二项分布:
也就是说,多项分布式二项分布的推广:仍然是独立重复实验次,但每次不只有成功和失败两种结果,而是种可能的结果,每种结果的概率为。多项分布是一个随机向量的分布,意为第种结果出现次,也就表示第种结果出现次的概率。
2.2 函数原型
random.multinomial(n, pvals, size=None)
参数:
n
: int 对应分布函数中的参数 n
。
pvals
: sequence of floats 对应分布函数参数, 其长度等于可能的结果数,并且有。
size
: int or tuple of ints, optional 为输出形状大小,因为采出的每个样本是一个随机向量,默认最后一维会自动加上,如果给定形状为,那么个维度为的随机向量会从中抽取。默认为None,即返回一个一个维的随机向量。
返回:
out
: ndarray 从带参数的概率分布中采的随机向量,长度为可能的结果数,如果没有给定 size
,则shape为 (k,)
。
2.3 使用样例
设进行独立重复实验20次,每次情况的概率为1/6,采样出的随机向量表示每种情况出现次数(相当于扔20次六面骰子,点数为0, 1, 2, ..., 5出现的次数)。总共采1个样本。
s = np.random.multinomial(20, [1/6.]*6, size=1)
print(s) # [[4 2 2 3 5 4]]
当然,如果不指定size,它直接就会返回一个一维向量了
s = np.random.multinomial(20, [1/6.]*6)
print(s) # [4 1 4 3 5 3]
如果像进行多次采样,改变 size
即可:
s = np.random.multinomial(20, [1/6.]*6, size=(2, 2))
print(s)
# [[[4 3 4 2 6 1]
# [5 2 1 6 3 3]]
# [[5 4 1 1 6 3]
# [2 5 2 5 4 2]]]
这个函数在论文<sup>
[1]</sup>
的实现代码<sup>
[2]</sup>
中用来设置每一个 client
分得的样本数:
for cluster_id in range(n_clusters):
weights = np.random.dirichlet(alpha=alpha * np.ones(n_clients))
clients_counts[cluster_id] = np.random.multinomial(clusters_sizes[cluster_id], weights)
# 一共扔clusters_sizes[cluster_id]次筛子,该函数返回骰子落在某个client上各多少次,也就对应着该client应该分得的样本数
3.均匀(uniform)分布
3.1 概率密度函数(pdf)
均匀分布可用于随机地从连续区间内进行采样。
3.2 函数原型
random.uniform(low=0.0, high=1.0, size=None)
参数:
low
: float or array_like of floats, optional 对应分布函数中的下界参数 a
,默认为0。
high
: float or array_like of floats 对应分布函数中的下界参数 b
,默认为1.0。
size
: int or tuple of ints, optional 为输出形状大小,如果给定形状为,那么的样本会从中抽取。默认为None,即返回一个单一标量。
返回:
out
: ndarray or scalar 从带参数的均匀分布中采的随机样本
3.3 使用样例
s = np.random.uniform(-1,0,10)
print(s)
# [-0.9479594 -0.86158902 -0.63754099 -0.0883407 -0.92845644 -0.11148294
# -0.19826197 -0.77396765 -0.26809953 -0.74734785]
4. 狄利克雷(Dirichlet)分布
4.1 概率密度函数(pdf)
4.2 函数原型
random.dirichlet(alpha, size=None)
参数:
alpha
: sequence of floats, length k 对应分布函数中的参数向量 ,长度为。
size
: int or tuple of ints, optional 为输出形状大小,因为采出的每个样本是一个随机向量,默认最后一维会自动加上,如果给定形状为,那么个维度为的随机向量会从中抽取。默认为None,即返回一个一个维的随机向量。
返回:
out
: ndarray 采出的样本,大小为。
4.3 使用样例
设(意味着),,则采出的样本为个维度为的随机向量。
s = np.random.dirichlet((10, 5, 3), size=(2, 2))
print(s)
# [[[0.82327647 0.09820451 0.07851902]
# [0.50861077 0.4503409 0.04104833]]
# [[0.31843167 0.22436547 0.45720285]
# [0.40981943 0.40349597 0.1866846 ]]]
这个函数在联邦学习论文的实现代码中常用来生成符合狄利克雷分布的权重向量
for cluster_id in range(n_clusters):
# 为每个client生成一个权重向量,文章中分布参数alpha每一维都相同
weights = np.random.dirichlet(alpha=alpha * np.ones(n_clients))
clients_counts[cluster_id] = np.random.multinomial(clusters_sizes[cluster_id], weights)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~