个性化阅读
专注于IT技术分析

Python中的概率分布

本文概述

介绍

概率统计是数据科学的基础。实际上, 机器学习和人工智能的基本原理不过是统计数学和线性代数。通常, 你会遇到各种情况, 尤其是在数据科学领域, 你必须阅读一些涉及大量数学的研究论文才能理解特定主题, 因此, 如果你想在数据科学领域变得更好, 就必须拥有强大的技能。数学理解。本教程介绍了机器学习文献中常用的概率分布。如果你是初学者, 那么这里是开始的正确位置。在本教程中, 你将:

  • 了解概率术语, 例如随机变量, 密度曲线, 概率函数等。
  • 了解不同的概率分布及其分布函数以及它们的某些属性。
  • 学习在python中创建和绘制这些分布。

在开始之前, 你应该熟悉下一部分将介绍的一些数学术语。

随机变量

随机变量是其可能值为随机现象的数值结果的变量。随机变量有两种类型, 离散变量和连续变量。

离散随机变量是一个仅可采用可计数数量的不同值, 因此可以量化的变量。例如, 你可以将随机变量$ X $定义为掷骰子时出现的数字。 $ X $可以取值:$ [1, 2, 3, 4, 5, 6] $, 因此是离散的随机变量。

离散随机变量的概率分布是与其每个可能值关联的概率列表。有时也称为概率函数或概率质量函数。为了具有数学意义, 假设随机变量$ X $可以取$ k $个不同的值, 并且将$ X = x_ {i} $定义为$ P(X = x_ {i})= p_ {i } $。然后, 概率$ p_ {i} $必须满足以下条件:

1:0 <$ p_ {i} $ <每个$ i $ 1

2:$ p_ {1} + p_ {2} + … + p_ {k} = 1 $。

离散概率分布的一些示例是伯努利分布, 二项式分布, 泊松分布等。

连续随机变量是一个取无数个可能值的变量。例如, 你可以将随机变量$ X $定义为班级学生的身高。由于连续随机变量是在值的间隔内定义的, 因此它由曲线下的面积(或积分)表示。

连续随机变量的概率分布(称为概率分布函数)是具有连续值的函数。观察任何单个值的概率等于$ 0 $, 因为随机变量可以假定的值的数量是无限的。例如, 随机变量$ X $可以采用实数间隔内的所有值。然后, 将$ X $在结果$ A集合P(A)$中的概率定义为$ A $上方和曲线下方的面积。表示函数$ p(x)$的曲线必须满足以下条件:

1:曲线没有负值$(p(x)> 0 $对于所有$ x $)

2:曲线下的总面积等于$ 1 $。

满足这些要求的曲线通常称为密度曲线。连续概率分布的一些示例是正态分布, 指数分布, β分布等。

文献中经常会出现另一种分布类型, 你应该了解这种分布类型, 称为累积分布函数。所有随机变量(离散和连续)都具有累积分布函数。对于每个值$ x $, 该函数给出随机变量$ X $小于或等于$ x $的概率。对于离散随机变量, 通过对概率求和来找到累积分布函数。

在下一节中, 你将探索一些重要的发行版, 并尝试在python中进行工作, 但在此之前, 请导入所有将要使用的必要库。

# for inline plots in jupyter
%matplotlib inline
# import matplotlib
import matplotlib.pyplot as plt
# for latex equations
from IPython.display import Math, Latex
# for displaying images
from IPython.core.display import Image
# import seaborn
import seaborn as sns
# settings for seaborn plotting style
sns.set(color_codes=True)
# settings for seaborn plot sizes
sns.set(rc={'figure.figsize':(5, 5)})

1.均匀分布

均匀分布也许是最简单和有用的分布之一。连续均匀分布的概率分布函数为:

Python中的概率分布1

由于任何宽度相等的数字间隔都具有被观察到的相等概率, 因此描述分布的曲线是矩形, 该间隔上的高度恒定, 其他位置的高度为0。由于曲线下的面积必须等于1, 因此间隔的长度决定了曲线的高度。下图显示了间隔(a, b)的均匀分布。注意, 因为该区域需要为$ 1 $。高度设置为$ 1 /(b-a)$。

Python中的概率分布2

你可以借助一个随机分布在数字(a, b)上的随机数生成器来可视化python中的均匀分布。你需要从scipy.stats模块导入统一函数。

# import uniform distribution
from scipy.stats import uniform

统一函数通过其loc和scale参数在指定间隔之间生成统一连续变量。 loc和loc + scale之间的分布是恒定的。 size参数描述随机变量的数量。如果要保持可重复性, 请包括分配给数字的random_state参数。

# random numbers from uniform distribution
n = 10000
start = 10
width = 20
data_uniform = uniform.rvs(size=n, loc = start, scale=width)

你可以使用Seaborn的distplot绘制刚创建的分布的直方图。 Seaborn的distplot接受了多个参数以自定义绘图。首先创建一个绘图对象斧头。在这里, 你可以指定直方图中的仓数, 指定直方图的颜色, 并使用kde指定密度图选项, 并使用hist_kws指定线宽选项。你还可以使用xlabel和ylabel参数为x和y轴设置标签。

ax = sns.distplot(data_uniform, bins=100, kde=True, color='skyblue', hist_kws={"linewidth": 15, 'alpha':1})
ax.set(xlabel='Uniform Distribution ', ylabel='Frequency')
[Text(0, 0.5, u'Frequency'), Text(0.5, 0, u'Uniform Distribution ')]
Python中的概率分布3

2.正态分布

正态分布(也称为高斯分布)在数据科学中无处不在。你会在很多地方遇到它, 尤其是在统计推断的主题中。它也是许多数据科学算法的假设之一。

正态分布具有钟形的密度曲线, 由其平均值$μ$和标准偏差$σ$来描述。密度曲线是对称的, 以其平均值为中心, 其散布由其标准偏差确定, 显示出靠近平均值的数据比远离平均值的数据更频繁地出现。在给定点$ x $处具有均值$μ$和标准偏差$σ$的正态密度曲线的概率分布函数为:

Python中的概率分布4

下图描述了分布情况:

Python中的概率分布5

几乎68%的数据落在距任一侧均值一个标准偏差的范围内, 而95%落在两个标准偏差之内。还值得一提的是, 均值$ 0 $和标准差$ 1 $的分布称为标准正态分布。

你可以使用scipy.stats模块的norm.rvs()方法生成一个正态分布的随机变量。 loc参数对应于分布的平均值。标度对应于标准偏差, 大小对应于随机变量的数量。如果要保持可重复性, 请包括分配给数字的random_state参数。

from scipy.stats import norm
# generate random numbers from N(0, 1)
data_normal = norm.rvs(size=10000, loc=0, scale=1)

你可以使用seaborn的distplot函数像使用均匀分布一样可视化分布。自变量的含义与后一种情况相同。

ax = sns.distplot(data_normal, bins=100, kde=True, color='skyblue', hist_kws={"linewidth": 15, 'alpha':1})
ax.set(xlabel='Normal Distribution', ylabel='Frequency')
[Text(0, 0.5, u'Frequency'), Text(0.5, 0, u'Normal Distribution')]
Python中的概率分布6

3.伽玛分布

伽马分布是连续概率分布的两参数族。虽然很少以原始形式使用它, 但其他普遍使用的分布(例如指数分布, 卡方分布, erlang分布)是gamma分布的特殊情况。可以根据形状参数$α= k $和反比例参数$β= 1 /θ$(称为速率参数)对伽马分布进行参数化, 符号$Γ(n)$是伽马函数, 且为定义为$(n-1)!$:

Python中的概率分布7

典型的伽玛分布看起来像:

Python中的概率分布8

你可以使用scipy.stats模块的gamma.rvs()方法生成一个伽玛分布的随机变量, 该方法将形状参数$ a $作为其参数。当$ a $是整数时, gamma减小为Erlang分布, 而当$ a = 1 $为指数分布时。要移动分布, 请使用loc参数, 要缩放要使用scale参数, size决定分布中随机变量的数量。如果要保持可重复性, 请包括分配给数字的random_state参数。

from scipy.stats import gamma
data_gamma = gamma.rvs(a=5, size=10000)

你可以使用seaborn的distplot函数像使用均匀分布一样可视化分布。自变量的含义与均匀分布部分中说明的相同。

ax = sns.distplot(data_gamma, kde=True, bins=100, color='skyblue', hist_kws={"linewidth": 15, 'alpha':1})
ax.set(xlabel='Gamma Distribution', ylabel='Frequency')
[Text(0, 0.5, u'Frequency'), Text(0.5, 0, u'Gamma Distribution')]
Python中的概率分布9

4.指数分布

指数分布描述了泊松点过程(即事件以恒定的平均速率连续且独立地发生)的过程之间事件之间的时间。它有一个参数$λ$称为速率参数, 其等式描述为:

Python中的概率分布10

减小的指数分布如下:

Python中的概率分布11

你可以使用scipy.stats模块的expon.rvs()方法生成指数分布的随机变量, 该方法采用形状参数scale作为其自变量, 在方程式中只不过是1 / lambda。要使用loc参数移动分布, 大小决定分布中随机变量的数量。如果要保持可重复性, 请包括分配给数字的random_state参数。

from scipy.stats import expon
data_expon = expon.rvs(scale=1, loc=0, size=1000)

再次可视化seaborn的分布, 得出如下所示的曲线:

ax = sns.distplot(data_expon, kde=True, bins=100, color='skyblue', hist_kws={"linewidth": 15, 'alpha':1})
ax.set(xlabel='Exponential Distribution', ylabel='Frequency')
[Text(0, 0.5, u'Frequency'), Text(0.5, 0, u'Exponential Distribution')]
Python中的概率分布12

5.泊松分布

泊松随机变量通常用于对事件在某个时间间隔内发生的次数进行建模。例如, 可以将某个时间间隔内在网站上访问的用户数量视为泊松过程。泊松分布用事件发生的速率($μ$)来描述。一个事件可以在一个时间间隔内发生0、1、2, …次。间隔中的平均事件数指定为$λ$(lambda)。 Lambda是事件速率, 也称为速率参数。等式中观察到$ k $个事件的概率由以下公式给出:

Python中的概率分布13

注意, 正态分布是泊松分布具有参数$λ→∞$的极限情况。同样, 如果随机事件之间的时间遵循速率为$λ$的指数分布, 则长度为$ t $的时间段内的事件总数遵循参数为$λt$的泊松分布。

下图显示了典型的泊松分布:

Python中的概率分布14

你可以使用scipy.stats模块的poisson.rvs()方法生成泊松分布的离散随机变量, 该方法将$μ$作为形状参数, 而方程中仅包含$λ$。要移动分布, 请使用loc参数。大小决定分布中随机变量的数量。如果要保持可重复性, 请包括分配给数字的random_state参数。

from scipy.stats import poisson
data_poisson = poisson.rvs(mu=3, size=10000)

你可以使用seaborn的distplot函数像使用均匀分布一样可视化分布。参数的含义保持不变。

ax = sns.distplot(data_poisson, bins=30, kde=False, color='skyblue', hist_kws={"linewidth": 15, 'alpha':1})
ax.set(xlabel='Poisson Distribution', ylabel='Frequency')
[Text(0, 0.5, u'Frequency'), Text(0.5, 0, u'Poisson Distribution')]
Python中的概率分布15

6.二项式分布

只有两个结果是可能的分布, 例如成功或失败, 获胜或失败, 获胜或失败, 并且所有试验的成功和失败概率均相同的分布称为二项分布。但是, 结果不一定需要均等的可能性, 每个试验彼此独立。二项式分布的参数是$ n $和$ p $, 其中$ n $是试验的总数, $ p $是每次试验成功的概率。其概率分布函数由下式给出:

Python中的概率分布16

哪里:

Python中的概率分布17

你可以使用scipy.stats模块的binom.rvs()方法生成二项式离散离散随机变量, 该方法将$ n $(试验次数)和$ p $(成功概率)作为形状参数。要移动分布, 请使用loc参数。大小决定了重复试验的次数。如果要保持可重复性, 请包括分配给数字的random_state参数。

from scipy.stats import binom
data_binom = binom.rvs(n=10, p=0.8, size=10000)

可视化你刚刚使用seaborn的distplot创建的分布, 将呈现以下直方图:

ax = sns.distplot(data_binom, kde=False, color='skyblue', hist_kws={"linewidth": 15, 'alpha':1})
ax.set(xlabel='Binomial Distribution', ylabel='Frequency')
[Text(0, 0.5, u'Frequency'), Text(0.5, 0, u'Binomial Distribution')]
Python中的概率分布18

请注意, 由于成功的可能性大于$ 0.5 $, 所以分布偏向右侧。此外, 在以下条件下, 泊松分布是二项式分布的极限情况:

  1. 试验的次数是无限大的或$ n→∞$。
  2. 每个试验的成功概率是相同的, 并且无限小或$ p→0 $。
  3. $ np =λ$是有限的。

在以下情况下, 正态分布是二项式分布的另一种限制形式:

  1. 试验次数无限大, $ n→∞$。
  2. $ p $和$ q $都不是无限小的。

7.伯努利分布

伯努利分布只有两种可能的结果, 即$ 1 $(成功)和$ 0 $(失败), 以及单次试验, 例如抛硬币。因此, 具有伯努利分布的随机变量$ X $的取值$ 1 $的概率为成功的概率$ p $, 取值为$ 0 $的概率概率为$ q $或$ 1-p $。成功和失败的概率并不一定要相等。伯努利分布是二项式分布的特例, 其中进行了一次试验($ n = 1 $)。其概率质量函数由下式给出:

Python中的概率分布19

你可以使用scipy.stats模块的bernoulli.rvs()方法生成bernoulli分布式离散随机变量, 该方法将$ p $(成功概率)作为形状参数。要移动分布, 请使用loc参数。大小决定了重复试验的次数。如果要保持可重复性, 请包括分配给数字的random_state参数。

from scipy.stats import bernoulli
data_bern = bernoulli.rvs(size=10000, p=0.6)

再次可视化分布, 你可以观察到只有两种可能的结果:

ax= sns.distplot(data_bern, kde=False, color="skyblue", hist_kws={"linewidth": 15, 'alpha':1})
ax.set(xlabel='Bernoulli Distribution', ylabel='Frequency')
[Text(0, 0.5, u'Frequency'), Text(0.5, 0, u'Bernoulli Distribution')]
Python中的概率分布20

总结

恭喜, 你已完成本教程的结尾!在本教程中, 你探索了一些常用的概率分布, 并学习了如何在python中创建和绘制它们。尽管还有许多其他发行版可供探索, 但这足以使你入门。不要忘记检查python的scipy库, 它具有其他出色的统计功能。探索愉快!

如果你想了解有关Python概率的更多信息, 请参加srcmini的统计模拟Python课程。

参考文献

  • 随机变量(耶鲁)
  • 泊松分布
  • 每个数据科学专业人士都应该知道的6种常见概率分布(作者Radhika Nijhawan)
赞(0)
未经允许不得转载:srcmini » Python中的概率分布

评论 抢沙发

评论前必须登录!