Python NumPy 随机

🍦 NumPy库多数需要快速计算的部分主要由C或C++编写,旨在提供一个比传统Python列表快50倍的数组对象,即ndarray。

1 随机数

  • 随机数
    • 伪随机数:通过一些算法生成的随机数。
      • 通过random处理随机数,randint()返回随机整数,rand()返回0-1之间的随机浮点数。
      • randint()使用size参数来制作随机数组,randint()rand()都允许指定数组的形状。
      • choice()允许根据数组值生成随机值,添加一个size参数来指定数组的形状。
    • 真随机数:没有规律,不能预见的数,使用物理现象产生,例如投硬币猜测正反面。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from numpy import random

x = random.randint(100)
print(x) # 0-100的随机整数
y = random.rand()
print(y) # 0-1的随机浮点数
print("----------------------------------------------------------")

x = random.randint(100, size=(5))
print(x) # 生成一个一维数组,包含5个从0-100的随机整数
y = random.randint(100, size=(3, 5))
print(y) # 生成一个3行的二维数组,每行包含5个从0-100的随机整数
print("----------------------------------------------------------")

x = random.rand(5)
print(x) # 生成一个一维数组,包含5个0-1之间的随机浮点数
y = random.rand(3, 5)
print(y) # 生成一个3行的二维数组,每行包含5个0-1之间的随机浮点数
print("----------------------------------------------------------")

x = random.choice([3, 5, 7, 9])
print(x) # 返回数组中的一个值
y = random.choice([3, 5, 7, 9], size=(3, 5))
print(y) # 生成一个由数组参数3、5、7和9中的值组成的二维数组

2 数据分布

  • 数据分布
    • 指在分布式环境中通过合理分布数据,提高数据操作自然并行度,以达到最优执行效率的目的。
    • 主要内容是数据位置的存放和高效的数据划分问题,是所有可能值的列表及每个值出现的频率。
    • 随机分布:一组遵循一定概率密度函数的随机数。
      • 概率密度函数:表示描述连续概率的函数,即数组中所有值的概率。
      • choice()方法依据定义的概率生成随机数,允许指定每个值的概率。
      • 概率由0-1之间的数字设置,0表示该值永远不会出现,1表示始终出现。
      • 所有的概率数之和为1,还可以通过size参数指定数组的形状来返回数组。
1
2
3
4
5
from numpy import random

# 生成一个包含100个值的一维数组,其中生成3概率0.1,5概率0.3,7概率0.6,9概率0
x = random.choice([3, 5, 7, 9], p=[0.1, 0.3, 0.6, 0.0], size=100)
print(x)

3 随机排列

  • 随机排列
    • shuffle():就地改变数组元素的排序,即对原始数组进行的更改。
    • permutation():返回一个重新排列的数组,并保持原始数组不变。
1
2
3
4
5
6
7
8
9
import numpy as np
from numpy import random

arr1 = np.array([1, 2, 3, 4, 5])
random.shuffle(arr1) # 随机打乱数组元素
print(arr1)

arr2 = np.array([1, 2, 3, 4, 5])
print(random.permutation(arr2)) # 生成数组元素的随机排列

4 Seaborn

  • Seaborn
    • 代表一个在底层使用Matplotlib绘制图形的库,用于可视化随机分布。
    • 打开系统上的命令窗口,输入命令进行安装:pip install seaborn
    • 使用前需要先导入Matplotlib模块的pyplot对象,以及安装好的第三方库seaborn模块。
    • Distplot代表分布图,将一个数组作为输入并绘制一条与数组中点的分布相对应的曲线。
1
2
3
4
5
6
7
8
9
10
11
import warnings                     # 忽略警告提示
import seaborn as sns
import matplotlib.pyplot as plt

warnings.filterwarnings("ignore", message="`distplot` is a deprecated function")

sns.distplot([0, 1, 2, 3, 4, 5]) # FutureWarning警告,distplot已弃用
plt.show() # 绘制分布图

sns.distplot([0, 1, 2, 3, 4, 5], hist=False)
plt.show() # 绘制没有直方图的分布图

5 连续分布

  • 连续分布
    • Continuous Distribution,一个随机变量在其区间内能够取任何数值时所具有的分布。
    • 常用分类
      • 正态分布:最常用,特点是密度函数以均值为中心对称分布,适用于描述一般经济变量的概率分布。
      • 均匀分布:概率论和统计学中叫矩形分布,是对称概率分布,相同长度间隔的分布概率是等可能的。
      • 增长分布:也称为逻辑斯蒂分布,具有S形曲线形状。该分布在中心区域变化较快,在两端逐渐平缓。
      • 指数分布:用来表示独立随机事件发生的时间间隔,重要特征是无记忆性,又称为遗失记忆性。
      • 伽玛分布:指数分布的推广,适用于描述正值随机变量的分布,有两个参数,形状和尺度参数。
      • 贝塔分布:特点是密度函数为最大值两边的不对称分布,适用于描述工期等不对称分布的变量。
      • 经验分布:对产生样本点累积分布函数的估计,统计学中是与样本的经验测度相关的分布函数。
      • 卡方分布:由平均为0、方差为1的独立标准正态随机变量的平方和构成,用于统计推断和假设检验。
      • 瑞利分布:指的是一种正值随机变量的连续概率分布,常用于描述具有幅度的正向随机变量的分布。
      • 帕累托分布:一种用于描述不平等现象的概率分布,具有长尾形状,应用于经济学、金融学等领域。
      • 三角型分布:密度数由最大值、最可能值和最小值构成的对称或不对称的三角型。

5-1 正态分布

  • 正态分布
    • Normal Distribution,又叫常态分布或高斯分布,Gaussian Distribution。
    • 重要分布之一,适合许多事件的概率分布,正态曲线呈钟型(即钟形曲线)。
    • 使用random.normal()方法获取正态分布数据,有以下三个参数。
      • size(指返回数组的形状)、loc(即平均值,钟型峰值所在的位置)。
      • scale(标准偏差,偏差越小,偏离算术平均值就越少,反之亦然)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import warnings                     # 忽略警告提示
import seaborn as sns
from numpy import random
import matplotlib.pyplot as plt

warnings.filterwarnings("ignore", message="`distplot` is a deprecated function")

x = random.normal(size=(2, 3))
print(x) # 生成大小为2x3的随机正态分布

y = random.normal(loc=1, scale=2, size=(2, 3))
print(y) # 生成大小为2x3的随机正态分布,平均值为1,标准差为2

sns.distplot(random.normal(size=1000), hist=False)
plt.show() # 正态分布的可视化

5-2 均匀分布

  • 均匀分布
    • Uniform Distribution,用于描述每个事件发生机会均等的概率。
    • random.uniform()方法获取均匀分布数据,有以下3个参数。
      • a:下限,默认0.0。
      • b:上限,默认1.0。
      • size:返回数组的形状。
1
2
3
4
5
6
7
8
9
10
11
12
import warnings                     # 忽略警告提示
import seaborn as sns
from numpy import random
import matplotlib.pyplot as plt

warnings.filterwarnings("ignore", message="`distplot` is a deprecated function")

x = random.uniform(size=(2, 3))
print(x) # 创建一个2x3均匀分布样本

sns.distplot(random.uniform(size=1000), hist=False)
plt.show() # 均匀分布的可视化

5-3 增长分布

  • 增长分布
    • Logistic Distribution,又叫逻辑斯谛分布,用于描述增长。
    • 广泛用于逻辑回归、神经网络等机器学习,连续型概率分布的一种。
    • 使用random.logistic()方法获取增长分布数据,有以下三个参数。
      • size:返回数组的形状。
      • loc:峰值的位置,默认为0。
      • scale:标准偏差,默认为1。
    • 增长分布与正态分布的区别
      • 增长分布的尾部下方面积更大,意味着代表了更远离均值的事件发生可能性。
      • 对于较高的尺度值(标准偏差),除峰值外,正态分布和增长分布几乎是相同。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import warnings                     # 忽略警告提示
import seaborn as sns
from numpy import random
import matplotlib.pyplot as plt

warnings.filterwarnings("ignore", message="`distplot` is a deprecated function")

x = random.logistic(loc=1, scale=2, size=(2, 3))
print(x) # 从均值为1且标准差为2的增长分布中抽取2x3个样本

sns.distplot(random.logistic(size=1000), hist=False)
plt.show() # 增长分布的可视化

sns.distplot(random.normal(scale=2, size=1000), hist=False, label="normal")
sns.distplot(random.logistic(size=1000), hist=False, label="logistic")
plt.show()

5-4 指数分布

  • 指数分布
    • Exponential Distribution,也叫负指数分布。
    • 用于描述直到下一个事件的时间,例如失败或成功等。
    • 使用random.exponential()方法获取指数分布数据。
      • size:代表返回数组的形状。
      • scale:速率的倒数,默认1.0。
    • 泊松分布与指数分布的区别
      • 泊松分布是一种离散概率分布,指数分布是一种连续概率分布。
      • 泊松分布:用于描述一段时间之内,发生某个独立事件的次数。
      • 指数分布:用于描述这些事件之间的时间间隔,具有单峰形状。
1
2
3
4
5
6
7
8
9
10
11
12
import warnings                     # 忽略警告提示
import seaborn as sns
from numpy import random
import matplotlib.pyplot as plt

warnings.filterwarnings("ignore", message="`distplot` is a deprecated function")

x = random.exponential(scale=2, size=(2, 3))
print(x) # 以2x3大小绘制一个2.0比例的指数分布样本

sns.distplot(random.exponential(size=1000), hist=False)
plt.show() # 指数分布的可视化

5-5 卡方分布

  • 卡方分布
    • Chi-Square Distribution,又叫西格玛分布,用于验证假设的基础。
    • random.chisquare()方法获取卡方分布数据,有以下两个参数。
      • df:代表自由度,数字指定。
      • size:代表返回数组的形状。
1
2
3
4
5
6
7
8
9
10
11
12
import warnings                     # 忽略警告提示
import seaborn as sns
from numpy import random
import matplotlib.pyplot as plt

warnings.filterwarnings("ignore", message="`distplot` is a deprecated function")

x = random.chisquare(df=2, size=(2, 3))
print(x) # 抽取一个自由度为2,大小为2x3的卡方分布样本

sns.distplot(random.chisquare(df=1, size=1000), hist=False)
plt.show() # 卡方分布的可视化

5-6 瑞利分布

  • 瑞利分布
    • Rayleigh Distribution,应用于信号处理,例如:无线信号的强度等。
    • 使用random.rayleigh()方法获取瑞利分布数据,有以下两个参数。
      • size:代表返回数组的形状。
      • scale:标准偏差,默认1.0。
    • 在单位StdDev(标准偏差)中,自由度为2的瑞利分布和卡方分布相同。
1
2
3
4
5
6
7
8
9
10
11
12
import warnings                     # 忽略警告提示
import seaborn as sns
from numpy import random
import matplotlib.pyplot as plt

warnings.filterwarnings("ignore", message="`distplot` is a deprecated function")

x = random.rayleigh(scale=2, size=(2, 3))
print(x) # 绘制一个尺度为2且大小为2x3的瑞利分布样本

sns.distplot(random.rayleigh(size=1000), hist=False)
plt.show() # 瑞利分布的可视化

5-7 帕累托分布

  • 帕累托分布
    • Pareto Distribution,经济学以外又被叫布拉德福分布。
    • 帕累托分布即80-20分布,指的是20%的因素导致80%的结果。
    • random.pareto()方法获取帕累托分布数据,有以下2个参数。
      • a:形状参数,数字指定。
      • size:指返回数组的形状。
1
2
3
4
5
6
7
8
9
10
11
12
import warnings                     # 忽略警告提示
import seaborn as sns
from numpy import random
import matplotlib.pyplot as plt

warnings.filterwarnings("ignore", message="`distplot` is a deprecated function")

x = random.pareto(a=2, size=(2, 3))
print(x) # 绘制一个形状为2且大小为2x3的帕累托分布样本

sns.distplot(random.pareto(a=2, size=1000), kde=False)
plt.show() # 帕累托分布的可视化

6 离散分布

  • 离散分布
    • Discrete Distribution,随机变量只能取有限或可数无限数量的值的概率分布。
    • 常用分类
      • 二项分布:在概率论和统计学中,n个独立的成功或失败试验里成功次数的离散概率分布。
      • 多项分布:该分布用于描述在多次独立重复的试验中,多个不同结果发生次数的概率分布。
      • 泊松分布:统计与概率学里常见的离散概率分布,法国数学家西莫恩·德尼·泊松在1838年时发表。
      • 几何分布:n次伯努利试验中试验k次才得到首次成功的机率,即前k-1次失败,第k次成功的概率。
      • 超几何分布:用于描述从有限总体中进行无放回抽样的结果,例如从产品中随机抽取不良品的数量。
      • 齐普夫分布:常用于描述自然语言处理、文本分析和网页访问等领域中的现象,属于一种幂律分布。
      • 负二项分布:Negative Binomial Distribution,统计学上一种离散概率分布。

6-1 二项分布

  • 二项分布
    • Binomial Distribution,又叫伯努利分布,离散概率分布的一种。
    • 二项分布描述二项式场景的结果,例如抛硬币,要么正面要么反面。
    • 使用random.binomial()方法获取二项分布数据,有以下三个参数。
      • n(代表的是试验次数,数字指定)、size(代表返回数组的形状)。
      • p(每次试验的发生概率,例如每次抛硬币正反面概率都是0.5)。
    • 如果二项分布有足够的数据点,将与具有一定位置和尺度的正态分布相似。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import warnings                     # 忽略警告提示
import seaborn as sns
from numpy import random
import matplotlib.pyplot as plt

warnings.filterwarnings("ignore", message="`distplot` is a deprecated function")

x = random.binomial(n=10, p=0.5, size=10)
print(x) # 给定10次抛硬币试验,生成10个数据点

sns.distplot(random.binomial(n=10, p=0.5, size=1000), hist=True, kde=False)
plt.show() # 二项分布的可视化

sns.distplot(random.normal(loc=50, scale=5, size=1000), hist=False, label="normal")
sns.distplot(random.binomial(n=100, p=0.5, size=1000), hist=False, label="binomial")
plt.show()

6-2 多项分布

  • 多项分布
    • Multinomial Distribution,是二项分布的推广。
    • 描述了多项式场景的结果,例如人群血型,掷骰结果等。
    • 使用random.multinomial()方法可获取多项分布数据。
      • size(返回数组的形状)、n(结果数量,如掷骰子共6个结果)。
      • pvals(指定结果概率的列表,例如:掷骰子的概率为6个1/6)。
    • 返回的多项样本不会只产生单个值,结果会生成pvals中的对应值。
    • 由于是二项分布的推广,视觉效果和正态分布的相似性与二项分布的相同。
1
2
3
4
from numpy import random

x = random.multinomial(n=6, pvals=[1/6, 1/6, 1/6, 1/6, 1/6, 1/6])
print(x) # 抽出一个掷骰子的样本

6-3 泊松分布

  • 泊松分布
    • Poisson Distribution,离散概率分布的一种。
    • 泊松分布估计事件在指定时间内可以发生的次数。
    • 使用random.poisson()方法获取泊松分布数据。
      • size:指返回数组的形状。
      • lam:发生率或已知次数。
    • 足够大的泊松分布,类似于二项分布和具特定标准偏差和均值的正态分布。
    • 泊松分布与二项分布的区别
      • 二项分布适用于独立重复的二元试验,而泊松分布则适用于连续试验。
      • n非常大且p接近于0的二项分布,几乎与泊松分布相同,n*p约等于lam。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import warnings                     # 忽略警告提示
import seaborn as sns
from numpy import random
import matplotlib.pyplot as plt

warnings.filterwarnings("ignore", message="`distplot` is a deprecated function")

x = random.poisson(lam=2, size=10)
print(x) # 生成随机1x10发生次数为2的分布

sns.distplot(random.poisson(lam=2, size=1000), kde=False)
plt.show() # 泊松分布的可视化

sns.distplot(random.normal(loc=50, scale=7, size=1000), hist=False, label="normal")
sns.distplot(random.poisson(lam=50, size=1000), hist=False, label="poisson")
plt.show()

sns.distplot(random.binomial(n=1000, p=0.01, size=1000), hist=False, label="binomial")
sns.distplot(random.poisson(lam=10, size=1000), hist=False, label="poisson")
plt.show()

6-4 几何分布

1
2
3
4
5
6
7
8
9
import warnings                      # 忽略警告提示
import seaborn as sns
from numpy import random
import matplotlib.pyplot as plt

warnings.filterwarnings("ignore", message="`distplot` is a deprecated function")

sns.distplot(random.geometric(p=0.5, size=1000), hist=True, kde=False)
plt.show() # 几何分布的可视化

6-5 超几何分布

1
2
3
4
5
6
7
8
9
10
11
12
import warnings                     # 忽略警告提示
import seaborn as sns
from numpy import random
import matplotlib.pyplot as plt

warnings.filterwarnings("ignore", message="`distplot` is a deprecated function")

sns.distplot(
random.hypergeometric(ngood=10, nbad=10, nsample=5, size=1000),
hist=True, kde=False
)
plt.show() # 超几何分布的可视化

6-6 齐普夫分布

  • 齐普夫分布
    • Zipf Distribution,又叫Zeta分布,用于根据Zipf定律对数据进行采样。
    • 齐夫定律(Zipf):实验定律,一集合中第n个常用项是最常用项的1/n倍。
    • 使用random.zipf()方法可以获取齐普夫分布数据,有以下两个参数。
      • a:指定了分布的参数。
      • size:返回数组的形状。
1
2
3
4
5
6
7
8
9
10
11
12
13
import warnings                     # 忽略警告提示
import seaborn as sns
from numpy import random
import matplotlib.pyplot as plt

warnings.filterwarnings("ignore", message="`distplot` is a deprecated function")

x = random.zipf(a=2, size=(2, 3))
print(x) # 抽取一个分布参数为2且大小为2x3的齐普夫分布样本

y = random.zipf(a=2, size=1000)
sns.distplot(y[y < 10], kde=False)
plt.show() # 齐普夫分布的可视化

Python NumPy 随机
https://stitch-top.github.io/2021/04/06/python/python05-python-numpy-sui-ji/
作者
Dr.626
发布于
2021年4月6日 23:17:30
许可协议