🍦 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) y = random.rand() print(y) print("----------------------------------------------------------")
x = random.randint(100, size=(5)) print(x) y = random.randint(100, size=(3, 5)) print(y) print("----------------------------------------------------------")
x = random.rand(5) print(x) y = random.rand(3, 5) print(y) print("----------------------------------------------------------")
x = random.choice([3, 5, 7, 9]) print(x) y = random.choice([3, 5, 7, 9], size=(3, 5)) print(y)
|
2 数据分布
- 数据分布
- 指在分布式环境中通过合理分布数据,提高数据操作自然并行度,以达到最优执行效率的目的。
- 主要内容是数据位置的存放和高效的数据划分问题,是所有可能值的列表及每个值出现的频率。
- 随机分布:一组遵循一定概率密度函数的随机数。
- 概率密度函数:表示描述连续概率的函数,即数组中所有值的概率。
choice()方法依据定义的概率生成随机数,允许指定每个值的概率。
- 概率由0-1之间的数字设置,0表示该值永远不会出现,1表示始终出现。
- 所有的概率数之和为1,还可以通过size参数指定数组的形状来返回数组。
1 2 3 4 5
| from numpy import random
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 12 13 14 15
| import warnings import seaborn as sns import matplotlib.pyplot as plt
warnings.filterwarnings("ignore", message="`distplot` is a deprecated function")
sns.histplot([0, 1, 2, 3, 4, 5], kde=True) plt.show()
sns.kdeplot([0, 1, 2, 3, 4, 5]) 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 16 17
| 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)
y = random.normal(loc=1, scale=2, size=(2, 3)) print(y)
data = random.normal(size=1000) sns.displot(data, kind="kde") 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 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.uniform(size=(2, 3)) print(x)
sns.kdeplot(random.uniform(size=1000)) 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 17 18 19
| 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)
sns.kdeplot(random.logistic(size=1000)) plt.show()
sns.kdeplot(random.normal(scale=2, size=1000), label="normal") sns.kdeplot(random.logistic(size=1000), 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 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.exponential(scale=2, size=(2, 3)) print(x)
sns.kdeplot(random.exponential(size=1000)) plt.show()
|
5-5 卡方分布
- 卡方分布
- Chi-Square Distribution,又叫西格玛分布,用于验证假设的基础。
- 用
random.chisquare()方法获取卡方分布数据,有以下两个参数。
- df:代表自由度,数字指定。
- 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.chisquare(df=2, size=(2, 3)) print(x)
sns.kdeplot(random.chisquare(df=1, size=1000)) 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 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.rayleigh(scale=2, size=(2, 3)) print(x)
sns.kdeplot(random.rayleigh(size=1000)) 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 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.pareto(a=2, size=(2, 3)) print(x)
sns.kdeplot(random.pareto(a=2, size=1000)) 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 17 18 19
| 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)
sns.histplot(random.binomial(n=10, p=0.5, size=1000), kde=False, discrete=True) plt.show()
sns.kdeplot(random.normal(loc=50, scale=5, size=1000), label="normal") sns.kdeplot(random.binomial(n=100, p=0.5, size=1000), 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 21 22 23 24 25
| 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)
sns.histplot(random.poisson(lam=2, size=1000), kde=False) plt.show()
sns.kdeplot(random.normal(loc=50, scale=7, size=1000), label="normal") sns.kdeplot(random.poisson(lam=50, size=1000), label="poisson") plt.show()
sns.kdeplot(random.binomial(n=1000, p=0.01, size=1000), label="binomial") sns.kdeplot(random.poisson(lam=10, size=1000), label="poisson") plt.show()
|
6-4 几何分布
1 2 3 4 5 6 7 8 9 10
| 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.histplot(random.geometric(p=0.5, size=1000), kde=False) plt.show()
|
6-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")
sns.histplot( random.hypergeometric(ngood=10, nbad=10, nsample=5, size=1000), 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 14
| 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)
y = random.zipf(a=2, size=1000)
sns.histplot(y[y < 10], kde=False) plt.show()
|