面向数据科学的概率论 三、随机变量

简介: 三、随机变量 原文:prob140/textbook/notebooks/ch03 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译许多数据科学涉及数值变量,它的观察值取决于几率。

三、随机变量

原文:prob140/textbook/notebooks/ch03

译者:飞龙

协议:CC BY-NC-SA 4.0

自豪地采用谷歌翻译

许多数据科学涉及数值变量,它的观察值取决于几率。其他值提供的变量的预测值,随机样本中观察到的不同类别个体的数量,以及自举样本的中值,仅仅是几个例子。 你在 Data8 中看到了更多例子。

在概率论中,随机变量是在结果空间上定义的数值函数。 也就是说,函数的定义域是Ω,它的值域是实数行。 随机变量通常用靠后的字母表示,如XY

结果空间上的函数

随机抽样可以看做重复的随机试验,因此许多结果空间由序列组成。代表硬币投掷两次的结果空间是:

\Omega = { \text{HH, HT, TH, TT} }

如果你投掷 10 次,结果空间将包含 10 个元素的 210 个序列,其中每个元素是HT。手动列出结果比较痛苦,但计算机善于为我们避免这种痛苦。

乘积空间

两个集合AB的乘积是所有偶对(a, b)的集合,其中a ∈ Ab ∈ B。 这个概念正是我们需要的,用于描述代表多个试验的空间。

例如,表示一枚硬币投掷结果的空间是 ©1 = {H,T}©1 与其本身的乘积是偶对的集合(H, H), (H, T), (T, H), (T, T),你可以认出这是硬币投掷的结果。 这个新空间和 ©1 的乘积是代表三次投掷的空间,以此类推。

Python 模块itertools包含构造乘积空间的函数product。 让我们导入它。

from itertools import product

要了解product是如何工作的,我们将从投掷硬币的结果开始。我们正在使用make_array创建一个数组,但你可以使用任何其他方式创建数组或列表。

one_toss = make_array('H', 'T')

为了使用product,我们必须指定基本空间和重复次数,然后将结果转换为列表。

two_tosses = list(product(one_toss, repeat=2))
two_tosses

# [('H', 'H'), ('H', 'T'), ('T', 'H'), ('T', 'T')]

对于三次投掷,只需改变重复次数:

three_tosses = list(product(one_toss, repeat=3))
three_tosses
'''
[('H', 'H', 'H'),
 ('H', 'H', 'T'),
 ('H', 'T', 'H'),
 ('H', 'T', 'T'),
 ('T', 'H', 'H'),
 ('T', 'H', 'T'),
 ('T', 'T', 'H'),
 ('T', 'T', 'T')]
'''

概率空间是结果空间,带有所有结果的概率。 如果假设三次投掷的八次结果是等可能的,则概率均为 1/8:

three_toss_probs = (1/8)*np.ones(8)

相应的概率空间:

three_toss_space = Table().with_columns(
    'omega', three_tosses,
    'P(omega)', three_toss_probs
)
three_toss_space
omega P(omega)
['H' 'H' 'H'] 0.125
['H' 'H' 'T'] 0.125
['H' 'T' 'H'] 0.125
['H' 'T' 'T'] 0.125
['T' 'H' 'H'] 0.125
['T' 'H' 'T'] 0.125
['T' 'T' 'H'] 0.125
['T' 'T' 'T'] 0.125

乘积空间增长得非常快。 如果你投掷 5 次,将会有近 8000 种可能的结果:

6**5
# 7776

但是我们有product,所以我们仍然可以列出所有乘积! 这是一个表示 5 次骰子投掷的概率空间。

die = np.arange(1, 7, 1)

five_rolls = list(product(die, repeat=5))  # All possible results of 5 rolls

five_roll_probs = (1/6**5)**np.ones(6**5)  # Each result has chance 1/6**5

five_roll_space = Table().with_columns(
   'omega', five_rolls,
    'P(omega)', five_roll_probs
)

five_roll_space
omega P(omega)
[1 1 1 1 1] 0.000128601
[1 1 1 1 2] 0.000128601
[1 1 1 1 3] 0.000128601
[1 1 1 1 4] 0.000128601
[1 1 1 1 5] 0.000128601
[1 1 1 1 6] 0.000128601
[1 1 1 2 1] 0.000128601
[1 1 1 2 2] 0.000128601
[1 1 1 2 3] 0.000128601
[1 1 1 2 4] 0.000128601

… (7766 rows omitted)

结果空间上的函数

假设你投掷一个骰子五次,并将你看到的点数加起来。如果这看起来不清楚,请耐心等待一会儿,你很快就会明白为什么它很有趣。

点数的总和是五个点数的结果空间Ω上的数值函数。 总和是一个随机变量。我们称它为S。然后,在形式上,

S: \Omega \rightarrow { 5, 6, \ldots, 30 }

S的范围是 5 到 30 的整数,因为每个骰子至少有一个点,最多六个点。 我们也可以使用相同的符号:

\Omega \stackrel{S}{\rightarrow} { 5, 6, \ldots, 30 }

从计算的角度来看,Ω的元素位于five_roll_spaceomega列中。让我们应用这个函数并创建一个更大的表格。

five_rolls_sum = Table().with_columns(
    'omega', five_rolls,
    'S(omega)', five_roll_space.apply(sum, 'omega'),
    'P(omega)', five_roll_probs
)
five_rolls_sum
omega S(omega) P(omega)
[1 1 1 1 1] 5 0.000128601
[1 1 1 1 2] 6 0.000128601
[1 1 1 1 3] 7 0.000128601
[1 1 1 1 4] 8 0.000128601
[1 1 1 1 5] 9 0.000128601
[1 1 1 1 6] 10 0.000128601
[1 1 1 2 1] 6 0.000128601
[1 1 1 2 2] 7 0.000128601
[1 1 1 2 3] 8 0.000128601
[1 1 1 2 4] 9 0.000128601

… (7766 rows omitted)

我们现在有五次投掷的所有可能的结果,以及它的总点数。你可以看到表格的第一行显示了尽可能少的点数,对应于所有投掷都显示 1 点。 第 7776 行显示了最大的:

five_rolls_sum.take(7775)
omega S(omega) P(omega)
[6 6 6 6 6] 30 0.000128601

S的所有其他值都在这两个极端之间。

随机变量的函数

随机变量是Ω上的数值函数。 因此,通过复合,随机变量的数值函数也是随机变量。

例如,S^2 是一个随机变量,计算如下:

S^2(\omega) = \big{(} S(\omega)\big{)}^2

所以 S^2(\text{[6 6 6 6 6]}) = 30^2 = 900

S确定的事件

从表five_rolls_sum中,很难判断有多少行显示 6 或 10 或其他任何值。 为了更好地理解S的属性,我们必须组织five_rolls_sum中的信息。

对于S中的任何子集A,定义事件{S∈A}为:

{S \in A } = {\omega: S(\omega) \in A }

在特殊情况下尝试这个定义。令A = {5,30}。 然后{S∈A},当且仅当所有点数都是 1 点或 6 点。 所以:

{S \in A} = {\text{[1 1 1 1 1], [6 6 6 6 6]}}

询问总和是否为某个特定值的几率是很自然的,例如 10。读取表格并不容易,但我们可以访问相应的行:

five_rolls_sum.where('S(omega)', are.equal_to(10))

… (116 rows omitted)

S(ω)=10ω有 126 个值。由于所有的ω都相同,因此S的值为 10 的几率是 126/7776。

非正式情况下,我们通常会用符号表示,写成{S = 10}而不是{S∈{10}}

分布

我们的空间是骰子的五次投掷的结果,而我们的随机变量S是五次投掷的点数总数。

five_rolls_sum
omega S(omega) P(omega)
[1 1 1 1 1] 5 0.000128601
[1 1 1 1 2] 6 0.000128601
[1 1 1 1 3] 7 0.000128601
[1 1 1 1 4] 8 0.000128601
[1 1 1 1 5] 9 0.000128601
[1 1 1 1 6] 10 0.000128601
[1 1 1 2 1] 6 0.000128601
[1 1 1 2 2] 7 0.000128601
[1 1 1 2 3] 8 0.000128601
[1 1 1 2 4] 9 0.000128601

… (7766 rows omitted)

在最后一节中,我们找到了P(S = 10)。我们可以使用相同的过程,为每个可能的s值查找P(S = s)group方法允许我们在同一时间为所有s这样做。

为此,我们首先丢掉omega列。 然后,我们将按S(omega)的不同值对表格进行分组,并使用sum来将每组中的所有概率相加。

dist_S = five_rolls_sum.drop('omega').group('S(omega)', sum)
dist_S
S(omega) P(omega) sum
5 0.000128601
6 0.000643004
7 0.00192901
8 0.00450103
9 0.00900206
10 0.0162037
11 0.0263632
12 0.0392233
13 0.0540123
14 0.0694444

… (16 rows omitted)

该表格显示了所有可能的S值及其所有概率。它被称为S的概率分布表。

表中的内容 - 随机变量的所有可能值及其所有概率 - 称为S的概率分布,或者简称为S的分布。该分布显示了 100% 的总概率如何分布在S的所有可能值上。

让我们来检查一下,以确保结果空间中的所有ω都已经在概率一列中得到了解释。

dist_S.column(1).sum()

# 0.99999999999999911

它在计算环境中是 1。这是任何概率分布的一个特征:

分布的概率是非负的,总和为 1。

展示分布

在 Data8 中,你使用datascience库来处理数据分布。prob140库建立在它上面,为处理概率分布和事件提供了一些便利的工具。

首先,我们将构造一个概率分布对象,虽然它看起来非常像上面的表格,但它的第二列中预计会有概率分布,并且如果它发现了其他任何东西,就会报错。

为了使代码易于阅读,让我们以数组的形式分别提取可能的值和概率:

s = dist_S.column(0)
p_s = dist_S.column(1)

要将这些转换为概率分布对象,请从空表开始,然后使用表的valuesprobability方法。values的参数是可能值的列表或数组,而probability的参数是相应概率的列表或数组。

dist_S = Table().values(s).probability(p_s)
dist_S
Value Probability
5 0.000128601
6 0.000643004
7 0.00192901
8 0.00450103
9 0.00900206
10 0.0162037
11 0.0263632
12 0.0392233
13 0.0540123
14 0.0694444

… (16 rows omitted)

除了列标签更具可读性之外,这看起来与我们之前的表完全相同。但是这是好处:在直方图中展示分布,只需使用prob140Plot方法,如下。

Plot(dist_S)

Plot的注解

  • 回想一下,datascience库中的hist显示原始数据的直方图,包含在表格的列中。prob140库中的Plot显示概率直方图,基于概率分布作为输入。

  • Plot仅适用于概率分布对象,使用valuesprobability方法创建的。 它不适用于Table类的普通成员。

  • Plot适用于具有整数值的随机变量。 你将在接下来的几章中遇到的许多随机变量是整数值。 为了展示其他随机变量的分布,分箱决策更加复杂。

S的分布的注解

在这里,五次投掷的点数总和的分布曲线出现了钟形。 注意这个直方图和你在 Data 8 中看到的钟形分布之间的差异。

这个显示确切的分布。它是根据实验的所有可能结果进行计算的。这不是一个近似值也不是一个经验直方图。

Data8 中的中心极限定理的表述表明,大型随机样本总和的分布大致是正态的。但是在这里你看到的只是五次投掷的总和呈现钟形分布。如果你从均匀的分布开始(这是单次投掷的分布),那么在总和的概率分布变成正态之前,你不需要大型样本。

展示事件的概率

从 Data8 中可知,钟形曲线拐点之间的区间约占曲线面积的 68%。 虽然上面的直方图并不完全是一个钟形曲线 - 它是一个只有 26 个条形的离散直方图 - 但它非常接近。 拐点似乎大约是 14 和 21。

Plotevent参数可让你可视化事件的概率,如下所示。

Plot(dist_S, event = np.arange(14, 22, 1))

金色区域是P(14 <= S <= 21)

prob_event方法操作概率分布对象,来返回事件的概率。为了找到P(14 <= S <= 21),请按如下所示使用它。

dist_S.prob_event(np.arange(14, 22, 1))

# 0.6959876543209863

几率是 69.6%,离 68% 并不远。

数学和代码的对应

P(14 <= S <= 21)可以通过将事件划分为 14 到 21 范围内的事件{S = s}的并集,然后使用加法规则来找到。

P(14 \le S \le 21) = \sum_{s = 14}^{21} P(S = s)

请小心使用小写字母s作为通用可能值,与大写字母S作为随机变量相对应;不这样做会使公式含义非常混乱。

这意味着:

首先为 14 到 21 范围内的每个s值抽取事件{S = s}

event_table = dist_S.where(0, are.between(14, 22))
event_table
Value Probability
14 0.0694444
15 0.0837191
16 0.0945216
17 0.100309
18 0.100309
19 0.0945216
20 0.0837191
21 0.0694444

然后将所有这些事件的概率相加。

event_table.column('Probability').sum()

# 0.6959876543209863

prob_event方法一步完成所有这些。 在这里再次进行比较。

dist_S.prob_event(np.arange(14, 22, 1))

# 0.6959876543209863

你可以通过各种方式,使用相同的基本方法来查找由S确定的任何事件的概率。这里有两个例子。

示例 1:P(S^2 = 400) = P(S = 20) = 8.37\%

示例 2:P(S > 20) = \sum_{s=20}^{30} P(S = s)

一个查找数值的简便方法:

dist_S.prob_event(np.arange(20, 31, 1))
# 0.30516975308642047

示例 3:P(\big{\vert} S - 10 \big{|} \le 6) ~ = ~ P(4 \le S \le 16) ~ = ~ \sum_{s=4}^{16} P(S=s)

dist_S.prob_event(np.arange(4, 17, 1))
# 0.39969135802469169

相等性

我们知道两个数字相等意味着什么。 然而,随机变量的相等可能不止一种。

相同

如果相同结果空间上定义的两个随机变量XY的值,对于空间中的每个结果都是相同的,那么它们是相同的。符号X = Y意味着 X(\omega) = Y(\omega) \text{ for all } \omega \in \Omega。非正式来说,无论结果如何, 如果X是10,那么Y也必须是 10;如果X是11,Y必须是 11,依此类推。

一个例子会把它说清楚。 假设 N_H 是三次硬币投掷的正面数量,并且 N_T 是相同的三次投掷的背面数量。 那么两个随机变量 N_H3 - N_T 是相等的。 对于三次投掷的每一种可能结果,N_H 的值等于 3 - N_T 的值。

我们简单地写成 N_H = 3 - N_T

同分布

如上所述,N_HN_T 不相等。例如,

coin = make_array('H', 'T')
three_tosses = list(product(coin, repeat=3))
three_tosses
'''
[('H', 'H', 'H'),
 ('H', 'H', 'T'),
 ('H', 'T', 'H'),
 ('H', 'T', 'T'),
 ('T', 'H', 'H'),
 ('T', 'H', 'T'),
 ('T', 'T', 'H'),
 ('T', 'T', 'T')]
'''

只有 8 个结果,因此很容易检查上表并写出 N_HN_T 的分布。它们都取值为 0, 1, 2 和 3,概率分别为 1/8,3/8,3/8 和 1/8。该分布如下表所示。

dist = Table().values(np.arange(4)).probability(make_array(1, 3, 3, 1)/8)
dist
Value Probability
0 0.125
1 0.375
2 0.375
3 0.125

我们说 N_HN_T 是同分布的。

一般而言,如果两个随机变量具有相同的概率分布,则它们是同分布的。 这表示为 X \stackrel{d}{=} Y

相等性之间的关系

相同比同分布更强。如果两个随机变量在结果层面上相同,那么它们必须具有相同的分布,因为它们在结果空间上是相同的函数。

也就是说,对于任意两个随机变量XYX = Y \implies X \stackrel{d}{=} Y

但三次投掷的正面和反面的例子表明,反面不一定是正确的。

示例:来自小牌组的两张牌

一个牌组包含 10 张牌,分别标记为1,2,2,3,3,3,4,4,4,4。两张牌是不放回随机发放的。让 X_1 为第一张卡上的标记,X_2 为第二张卡上的标记。

问题 1。X_1X_2 是否相同?

答案是否定的,因为结果可能是 31,在这种情况下 X_1 = 3X_2 = 1

问题 2。X_1X_2 是否同分布?

回答 2。让我们找到两个分布并进行比较。显然,每种情况下可能的值是 1,2,3 和 4。X_1 的分布很简单:P(X_1 = i ) = \frac{i}{10} , ~~ i = 1, 2, 3, 4。当分布由这样的公式定义时,你可以定义一个函数来表示公式所说的内容:

def prob1(i):
    return i/10

然后,你可以像之前一样,使用value创建一个概率分布对象,但现在使用probability_function,它将函数的名称作为其参数:

possible_i = np.arange(1, 5, 1)
dist_X1 = Table().values(possible_i).probability_function(prob1)
dist_X1
Value Probability
1 0.1
2 0.2
3 0.3
4 0.4

相信下面的函数prob2会为每个i返回P(X_2 = i)。事件已根据 X_1 的值进行划分。

dist_X2 = Table().values(possible_i).probability_function(prob2)
dist_X2
Value Probability
1 0.1
2 0.2
3 0.3
4 0.4

这两个分布是相同的!这是另一个不放回抽样的对称性的例子。 结论是 X_1 \stackrel{d}{=} X_2

相关文章
|
6月前
|
存储 大数据 数据挖掘
浅析概率论的应用
浅析概率论的应用 【摘 要】在学习概率论与数理统计过程中,我们可以发现随机现象存在于我们日常生活的方方面面和科学技术的各个领域。并且概率论与数理统计不仅是一门十分重要的大学数学基础课, 还是唯一一门研究随机现象规律的学科,它指导人们从事物表
58 0
|
11月前
|
人工智能 资源调度 Python
概率论基础
因为概率图模型会涉及大量概率论的知识,所以在开始概率图模型之前,首先让我们回顾一下概率论的一些概念和基础知识。
116 0
概率论基础
|
机器学习/深度学习 人工智能
机器学习数学基础四:随机变量和概率论基础
不管是离散型还是连续型,似然函数是一样的,概率表达了在给定参数a时X=x的可能性,而似然函数表示的是在给定样本X=x时参数的可能性。
146 0
机器学习数学基础四:随机变量和概率论基础
|
机器学习/深度学习
机器学习中矩阵求导法则
矩阵求导的本质上就是矩阵中元素对元素的求导,只是将其按照矩阵的形式进行一些规范化的写法罢了
90 0
|
机器学习/深度学习 数据挖掘 Python
数据科学中常见的6个概率分布(Python实现)
数据科学中常见的6个概率分布(Python实现
数据科学中常见的6个概率分布(Python实现)
|
Dart 算法 Java
概率论与数理统计引论
概率论与数理统计引论
应用统计学与R语言实现学习笔记(六)——假设检验
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ESA_DSQ/article/details/71420125 Chapter 6 Hypothesis Test 本篇是第6章,内容是假设检验。
1274 0
统计学(一)
分位数 使用QUARTILE函数算出 第一分位数:25%分位数 第二分位数:中位数 第三分位数:75%分位数 知识在于点滴积累
646 0