Python实现从概率分布中随机采样

目录
  • 1. 二项(binomial)/伯努利(Bernoulli)分布
  • 2. 多项(multinomial)分布
  • 3.均匀(uniform)分布
  • 4. 狄利克雷(Dirichlet)分布
  • 参考文献

在上一篇博文《Python中的随机采样和概率分布(一)》中,我们介绍了Python中最简单的随机采样函数。接下来我们更进一步,来看看如何从一个概率分布中采样,我们以几个机器学习中最常用的概率分布为例。

1. 二项(binomial)/伯努利(Bernoulli)分布

1.1 概率质量函数(pmf)

当n=1时,则取到下列极限情况,是为参数为p的二项分布:

二项分布P(X=x; n, p)可以表示进行独立重复试验n次,每次有两成功和失败可能结果(分别对应概率p和1−p),共成功x次的概率。

1.2 函数原型

random.binomial(n, p, size=None)

参数:

n: int or array_like of ints   对应分布函数中的参数 n,>=0,浮点数会被截断为整形。

p: float or array_like of floats   对应分布函数参数p, >=0并且<=1。

size: int or tuple of ints, optional   如果给定形状为(m,n,k),那么m×n×k个随机样本会从中抽取。默认为None,即返回一个一个标量随机样本。

返回:

out: ndarray or scalar  从带参数的概率分布中采的随机样本,每个样本表示独立重复实验n次中成功的次数。

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)

当k=2时,则取到下列极限情况,是为参数为n, p的二项分布:

也就是说,多项分布式二项分布的推广:仍然是独立重复实验n次,但每次不只有成功和失败两种结果,而是k种可能的结果,每种结果的概率为pi。多项分布是一个随机向量的分布,x=(x1,x2,...,xk)意为第i种结果出现xi次,P(X=x; n, p)也就表示第i种结果出现xi次的概率。

2.2 函数原型

random.multinomial(n, pvals, size=None)

参数:

n: int   对应分布函数中的参数 n

pvals: sequence of floats   对应分布函数参数p, 其长度等于可能的结果数k,并且有0⩽pi⩽1。

size: int or tuple of ints, optional   为输出形状大小,因为采出的每个样本是一个随机向量,默认最后一维会自动加上k,如果给定形状为(m,n),那么m×n个维度为k的随机向量会从中抽取。默认为None,即返回一个一个k维的随机向量。

返回:

out: ndarray   从带参数的概率分布中采的随机向量,长度为可能的结果数k,如果没有给定 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)

均匀分布可用于随机地从连续区间[a,b)内进行采样。

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   为输出形状大小,如果给定形状为(m,n,k),那么m×n×k的样本会从中抽取。默认为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   对应分布函数中的参数向量 α,长度为k。

size: int or tuple of ints, optional   为输出形状大小,因为采出的每个样本是一个随机向量,默认最后一维会自动加上k,如果给定形状为(m,n),那么m×n个维度为k的随机向量会从中抽取。默认为None,即返回一个一个k维的随机向量。

返回:

out: ndarray   采出的样本,大小为(size,k)。

4.3 使用样例

设α=(10,5,3)(意味着k=3),size=(2,2),则采出的样本为2×2个维度为k=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 ]]]

这个函数在论文[1]的实现代码[2]中用来生成符合狄利克雷分布的权重向量

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)

参考文献

[1] Marfoq O, Neglia G, Bellet A, et al. Federated multi-task learning under a mixture of distributions[J]. Advances in Neural Information Processing Systems, 2021, 34.

[2] https://github.com/omarfoq/FedEM

[3] https://www.python.org/

[4] https://numpy.org/

到此这篇关于Python实现从概率分布中随机采样的文章就介绍到这了,更多相关Python 概率分布 随机采样内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python实现的概率分布运算操作示例

    本文实例讲述了Python实现的概率分布运算操作.分享给大家供大家参考,具体如下: 1. 二项分布(离散) import numpy as np from scipy import stats import matplotlib.pyplot as plt ''' # 二项分布 (binomial distribution) # 前提:独立重复试验.有放回.只有两个结果 # 二项分布指出,随机一次试验出现事件A的概率如果为p,那么在重复n次试验中出现k次事件A的概率为: # f(n,k,p) =

  • python数据预处理 :样本分布不均的解决(过采样和欠采样)

    何为样本分布不均: 样本分布不均衡就是指样本差异非常大,例如共1000条数据样本的数据集中,其中占有10条样本分类,其特征无论如何你和也无法实现完整特征值的覆盖,此时属于严重的样本分布不均衡. 为何要解决样本分布不均: 样本分部不均衡的数据集也是很常见的:比如恶意刷单.黄牛订单.信用卡欺诈.电力窃电.设备故障.大企业客户流失等. 样本不均衡将导致样本量少的分类所包含的特征过少,很难从中提取规律,即使得到分类模型,也容易产生过度依赖于有限的数量样本而导致过拟合问题,当模型应用到新的数据上时,模型的

  • 浅析Python中的随机采样和概率分布

    目录 1. random.choice 2. random.choices(有放回) 3. numpy.sample(无放回) 4.rng.choices 和 rng.sample 5. numpy.random.choices 参考文献  Python(包括其包Numpy)中包含了了许多概率算法,包括基础的随机采样以及许多经典的概率分布生成.我们这个系列介绍几个在机器学习中常用的概率函数.先来看最基础的功能--随机采样. 1. random.choice 如果我们只需要从序列里采一个样本(所有

  • 使用Python实现正态分布、正态分布采样

    多元正态分布(多元高斯分布) 直接从多元正态分布讲起.多元正态分布公式如下: 这就是多元正态分布的定义,均值好理解,就是高斯分布的概率分布值最大的位置,进行采样时也就是采样的中心点.而协方差矩阵在多维上形式较多. 协方差矩阵 一般来说,协方差矩阵有三种形式,分别称为球形.对角和全协方差.以二元为例: 为了方便展示不同协方差矩阵的效果,我们以二维为例.(书上截的图,凑活着看吧,是在不想画图了) 其实从这个图上可以很好的看出,协方差矩阵对正态分布的影响,也就很好明白了这三个协方差矩阵是哪里来的名字了

  • Python实现从概率分布中随机采样

    目录 1. 二项(binomial)/伯努利(Bernoulli)分布 2. 多项(multinomial)分布 3.均匀(uniform)分布 4. 狄利克雷(Dirichlet)分布 参考文献 在上一篇博文<Python中的随机采样和概率分布(一)>中,我们介绍了Python中最简单的随机采样函数.接下来我们更进一步,来看看如何从一个概率分布中采样,我们以几个机器学习中最常用的概率分布为例. 1. 二项(binomial)/伯努利(Bernoulli)分布 1.1 概率质量函数(pmf)

  • python random从集合中随机选择元素的方法

    如下所示: list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] slice = random.sample(list, 5) #从list中随机获取5个元素,作为一个片断返回 print slice print list #原有序列并没有改变. print random.randint(12, 20) #生成的随机数n: 12 <= n <= 20 print random.randint(20, 20) #结果永远是20 #print random.randint(

  • Python随机采样及概率分布(二)

    目录 1. 二项(binomial)/伯努利(Bernoulli)分布 1.1 概率质量函数(pmf) 1.2 函数原型 1.3 使用样例 2. 多项(multinomial)分布 2.1 概率质量函数(pmf) 2.2 函数原型 2.3 使用样例 3.均匀(uniform)分布 3.1 概率密度函数(pdf) 3.2 函数原型 3.3 使用样例 4. 狄利克雷(Dirichlet)分布 4.1 概率密度函数(pdf) 4.2 函数原型 4.3 使用样例 前言: 之前的<Python中的随机采样

  • python list等分并从等分的子集中随机选取一个数

    有些时候我们需要从视频序列中均匀的随机采样,我们可以每隔x步进行一次采样,这就要求对一个list每隔x步进行一次截取,再从截取到的不同的子集中随机选取一个数就是我们平均采样的帧的idx. import random def split(a, n): k, m = divmod(len(a), n) return [a[i * k + min(i, m):(i + 1) * k + min(i + 1, m)] for i in list(range(n))] list_split = split

  • Python基于随机采样一至性实现拟合椭圆

    检测这些圆,先找轮廓后通过轮廓点拟合椭圆 import cv2 import numpy as np import matplotlib.pyplot as plt import math from Ransac_Process import RANSAC def lj_img(img): wlj, hlj = img.shape[1], img.shape[0] lj_dis = 7 # 连接白色区域的判定距离 for ilj in range(wlj): for jlj in range(h

  • Python基于随机采样一至性实现拟合椭圆(优化版)

    上次版本如果在没有找到轮廓或轮廓的点集数很小无法拟合椭圆或在RANSAC中寻找最优解时会死循环中,优化后的代码 import cv2 import os import numpy as np import matplotlib.pyplot as plt import math from Ransac_Process import RANSAC def cul_area(x_mask, y_mask, r_circle, mask): mask_label = mask.copy() num_a

  • 在python带权重的列表中随机取值的方法

    1 random.choice python random模块的choice方法随机选择某个元素 foo = ['a', 'b', 'c', 'd', 'e'] from random import choice print choice(foo) 2 random.sample 使用python random模块的sample函数从列表中随机选择一组元素 list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] slice = random.sample(list, 5)

  • python 从list中随机取值的方法

    第一种方法(推荐) 适用于随机取一个值, 返回一个值 import random list1 = ['佛山', '南宁', '北海', '杭州', '南昌', '厦门', '温州'] a = random.choice(list1) print(a) # 返回一个值 第二种方法 适用于随机取一组值, 返回一个list import random list1 = ['佛山', '南宁', '北海', '杭州', '南昌', '厦门', '温州'] # 随机返回只有一个值的list a = rand

随机推荐