专栏首页AI机器学习与深度学习算法Numpy中常用随机函数的总结

Numpy中常用随机函数的总结

生活比电影狠多了,从来不给弱者安排大逆转的情节。

全文字数:2600字

阅读时间:8分钟

前言

Numpy中的常用随机函数常常用于按照某种概率统计规则来产生随机数,在机器学习和深度学习中,我们常常需要使用随机函数对一些参数进行初始化,而且在一些深度学习框架中,通常会使用与Numpy一致或者类似的接口函数。比如:

import torch
import tensorflow as tf

# 创建采样(2, 2)的标准正太分布的张量
a = torch.randn(2, 3) 
# 创建采样自[0, 10)区间的(2, 2)均匀分布的张量
b = tf.random.uniform((2, 2), 0, 10) 

print(a)
print(b)

tensor([[ 2.0729, -0.6350],
        [-1.8206, -0.8142]])
tf.Tensor(
[[9.330468  6.0732355]
 [6.65187   4.6297417]], shape=(2, 2), dtype=float32)

本文主要总结一些在Numpy中比较常用的产生随机数的函数,为了方便我将这些随机函数分成两个部分:

  • 用于产生固定区间范围的随机数,称为基本随机数;
  • 用于按照某些分布概率统计规则来产生的随机数,称为分布随机数;

01

基本随机数

random.rand(d0, d1, .., dn),产生[0, 1)范围内的浮点随机数

rand函数用于产生[0, 1)范围内的浮点随机数,其中参数dn表示第n个维度的长度。

import numpy as np

# 产生shape为 (d0, d1,..., dn), 值为 [0, 1) 范围内的浮点随机数

# 默认d0 = 1, 产生[0, 1)范围内的一个浮点随机数
a = np.random.rand() 
# d0 = 2, 产生[0, 1)范围内的一维数组(向量)的浮点随机数
b = np.random.rand(2) 
# d0 = 2, d1 = 3, 产生[0, 1)范围内的二维数组(矩阵)的浮点随机数
c = np.random.rand(2,3) 

print(a)
print(b)
print(c)

0.575695284381402
[0.50852146 0.17941441]
[[0.07689737 0.17578407 0.16941739]
 [0.63075319 0.86015553 0.88239051]]

random.random_sample(size),产生[0, 1)范围内的浮点随机数

random_sample函数用于产生[0, 1)范围的浮点随机数,其中参数size为产生数组的大小,如果不指定则会产生一个随机数。

这里需要注意:

  • rand和random_sample函数产生的都是[0, 1)范围内的浮点随机数,不过这两个函数的参数不同:
    • rand(d0, d1, ..., dn)中的参数dn用于指定维度的长度;
    • random_sample(size)中的参数size为产生数组的大小;
  • ranf、random、sample、random_sample这些方法使用方式与实现的功能都是一样的,如果查看Numpy官方文档也可以发现这些函数的示例都是相同的;
import numpy as np

# 产生shape为size, 值为 [0, 1) 范围内的浮点随机数

# 不指定size参数, 产生[0, 1)范围内的浮点随机数
a = np.random.random_sample() 
# 指定size参数,产生[0, 1)范围内的二维数组(矩阵)的浮点随机数
b = np.random.random_sample(size = (2, 3)) 

print(a)
print(b)

0.8369940955261025
[[0.12079451 0.65141355 0.91492699]
 [0.07162246 0.24889967 0.56503944]]

random.randint(low, high = None, size = None),产生[low, high)范围内的整型随机数

randint随机函数用于产生[low, high)范围的随机整数,需要注意范围是"包左不包右",包含low但是不包含high。size为产生数组的大小。

import numpy as np

# 产生shape为size, 值为 [low, high) 范围内的整型随机数

# low = 0, high = 3, 产生[0, 3)范围内的一个整型随机数
a = np.random.randint(0, 3)
# low = 3, 产生[0, 3)范围内的一维数组(向量)的整型随机数
b = np.random.randint(3, size = 4)
# low = 0, high = 3, 产生[0, 3)范围内的二维数组(矩阵)的整型随机数
c = np.random.randint(0, 3, size = (2, 3))

print(a)
print(b)
print(c)

2
[0 2 1 1]
[[2 1 1]
 [0 1 0]]

random.random_integers(low, high = None, size = None),产生[low, high]范围内的整型随机数

random_integers函数和randint函数是对应的,主要区别就在于randint函数的范围为[low, high)即"包左不包右",而random_integers函数的范围为[low, high]即"即包左又包右"。不过为了统一Numpy的接口,random_interger函数即将被摒弃,官方推荐使用randint函数来实现。如果想要将范围确定在[low, high]范围中,只需要将randint函数的size参数指定为(low, high + 1)。

小结

▲基本随机数函数小结

02

常用的分布随机数

random.randn(d0, d1, ..., dn),产生标准正太分布(normal)分布的随机数

randn函数用于产生标准正太分布的随机数,其中参数dn表示第n个维度的长度。

import numpy as np

# 产生shape为 (d0, d1,..., dn)的标准正态分布

# 从标准正态部分中随机采样3个随机数
a = np.random.randn(3)
# 从标准正态分布中随机采样2 × 3个随机数,组成(2, 3)的二维数组(矩阵)
b = np.random.randn(2, 3)

print(a)
print(b)

[ 0.2203204   1.73158706 -0.78638403]
[[ 0.44799247 -0.37243396 -0.57481381]
 [ 0.17644269  0.99336282 -0.55967673]]

random.normal(loc = 0.0, scale = 1.0, size = None),产生正态分布随机数

normal函数产生正态分布的随机数,其中:

  • 参数loc对应数学中的期望μ,μ是正态分布的位置参数,描述正态分布集中趋势位置,与μ邻近的概率值越大,而远离μ的概率值越小。正态分布以X = μ为对称轴,左右完全对称。正态分布的期望、均数、中位数、众数相同,均等于μ;
  • 参数scale对应数学中的标准差σ,σ描述正态分布数据的离散程度,σ越大,数据的分布越分散,σ越小,数据分布越集中。σ也称为正态分布的形状参数,σ越大,曲线越扁平,反之,σ越小,曲线越高瘦;
  • 参数size为产生数组的大小;
import numpy as np

# 产生shape为size的正态分布
mu, sigma = 0.1, 2.0
# 从μ = 0.1, σ = 2.0的正态部分中随机采样3个随机数
a = np.random.normal(mu, sigma, 3)
# 从μ = 0.1, σ = 2.0的正态部分中随机采样2 × 3个随机数,组成(2, 3)的二维数组(矩阵)
b = np.random.normal(mu, sigma, size = (2, 3))

print(a)
print(b)


[ 1.31578944 -1.16272895  2.50095739]
[[ 2.07134546 -0.62086584 -0.32091925]
 [ 0.2286672  -1.13700916  0.09206429]]

这里需要注意,将normal函数的参数loc = 0, scale = 1.0,即μ = 0, σ = 1.0,期望为0方差为1的正态分布为标准正态分布,此时使用randn函数可以实现同样的效果。

random.uniform(low = 0.0, high = 1.0, size = None),产生均匀分布的随机数

uniform函数在指定[low, high)范围内产生均匀分布的随机数。

import numpy as np

# 产生shape为size范围在[low, high)内的均匀分布

# low = 3, 输出向量, shape = (4, )
a = np.random.uniform(3, size = 4)
# low = 0, high = 3, 输出为标量, shape = ()
b = np.random.uniform(0, 3)
# low = 0, high = 3, 输出为矩阵, shape = (2, 3)
c = np.random.uniform(0, 3, size = (2, 3))

print(a)
print(b)
print(c)

[2.65418547 1.65702115 2.42128949 2.74215319]
1.253105912177019
[[2.11947645 2.85662794 2.33596866]
 [0.86552208 2.9166298  1.55980368]]

小结

分布的随机数有很多,不过在深度学习中最常用的就是正态分布和均匀分布了。

本文分享自微信公众号 - AI机器学习与深度学习算法(AI-KangChen),作者:Chenkc

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 机器学习入门 11-9 SVM思想解决回归问题

    本系列是《玩转机器学习教程》一个整理的视频笔记。本小节简单介绍如何使用支撑向量机的思想来解决回归问题,最后通过sklearn封装好的LinearSVR类实现波士...

    触摸壹缕阳光
  • 使用 HanLP 统计二元语法中的频次

    计算句子概率值的工具就是语言模型,但是随着句子长度的逐渐增大,语言模型会遇到下面两个问题:

    触摸壹缕阳光
  • 机器学习入门 11-3 Soft Margin SVM

    本系列是《玩转机器学习教程》一个整理的视频笔记。前面两个小节具体介绍了Hard Margin SVM算法的思想,并将这种思想转换为数学中的最优化问题。这一小节:

    触摸壹缕阳光
  • Scrapy:log日志功能

    弄啥嘞
  • 聊天机器人实战教程 | PyTorch专栏

    在本教程中,我们探索一个好玩有趣的循环的序列到序列(sequence-to-sequence)的模型用例。我们将用Cornell Movie-Dialogs C...

    磐创AI
  • Spring Boot 2.x (二):Spring Boot 基础配置

    在 Spring Boot 中,配置文件有两种不同的格式,一种是 properties ,另一种是 yaml。

    阿宝哥
  • 自己手动写代码实现数据库连接池

    池:一个高级的集合体(集合存储元素 + 管理方式–>提高效率),是对外提供同一种类型对象的集合,如(线程池、数据库连接池)  特性:复用性(每条连接可重复使用)...

    小勇DW3
  • 造了个轮子 XML 2 JSON

    许杨淼淼
  • Ansible搭建hadoop-3.1.3高可用

    因为hdp-01与hdp-02为hdfs-ha,所以它们之间必须要自己可以免密登录自己,自己可以登录免密对方

    小朋友呢
  • tp5之验证码不显示

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    suveng

扫码关注云+社区

领取腾讯云代金券