Skip to content

Latest commit

 

History

History
1163 lines (1024 loc) · 31.7 KB

File metadata and controls

1163 lines (1024 loc) · 31.7 KB

四、事件之间的关系

译者:biubiubiuboomboomboom

在数据科学中的大多数问题都可以归为变量之间的关系问题。 例如:

  • 如何使用已知的数据属性来判断细胞是否癌变?
  • 加利福尼亚县的平均收入与用水量之间有什么联系?
  • 买汽车的人会为更长的里程或更快的加速付出更多吗? 您会在数据集 8 中遇到许多类似的问题。

概率论可以帮助我们提出和回答关于随机变量之间关系的精确问题。特别的,它帮助我们理解一组随机变量的条件行为并给定另一组的值。 在这个章节中,我们将研究在同一结果集中定义的多个随机变量。

联合分布

假设$X$ 和 $Y$ 是相同的结果空间里定义好的 2 个随机变量。我们用符号$P(X=x ,Y=y)$来表示$X$的价值$x$和$Y$的价值$y$。 X 和 Y 的联合分布包括所有概率$P(X=x ,Y=y)$在$(x,y)$的所有取值范围内。

例如

抛 3 次硬币,设 X 为前两次抛出结果是正面的次数,Y 为后两次抛出结果是正面的次数。 则: $P(X=0, Y=2 )=0=P(X =2, Y=0)$ $P(X = 1,Y=1 )= P(THT or HTH) = 2/8$ 其他的概率都是 1/8,你可以通过检查 3 次投币的其余结果看到。 如: $P(X=1,Y=2)=P(THH)=1/8$ 约束条件:$X$和$Y$ 必须在{0,1,2}的范围内,且 $|X-Y|<2$。 我们可以定义一个函数,以$X$和$Y$作为参数,返回$P(X=x,Y=y)$.

 def joint_probability(x, y):
    if x == 1 & y == 1:
        return 2/8
    elif abs(x - y) < 2:
        return 1/8
    else:
        return 0

prob140 库包含 2 个随机变量联合分布的表格可视化方法。首先,你需要为两个变量各赋一个概率值。 在我们的例子中,2 者都有可能取到值{0,1,2},因此他们的取值都能使用数组或者列表来装载

k = np.arange(3)

为了构造一个联合分布对象,我们必须首先构造一个包含所有可能的值和概率对照表。则: Table().values(variable_name_1, values_1, variable_name_2, values_2).probability_function(function_name) function_name 是指把 x 和 y 送进函数里,并返回一个概率$P(X=x,Y=y)$.

joint_table = Table().values('X', k, 'Y', k).probability_function(joint_probability)
joint_table
X Y Probability
0 0 0.125
0 1 0.125
0 2 0
1 0 0.125
1 1 0.25
1 2 0.125
2 0 0
2 1 0.125
2 2 0.125

这就是展示出来的联合分布的结果。我们可以检查一下这个分布,把所有的概率累加起来。对于一个正常的分布来说,结果应该是 1。

joint_table.column(2).sum()

1.0

联合分布表

尽管上面的表格确实展示了联合分布。但如果能以不同的方式来展示相同的信息,则会根据有启发性和说服力。

to_joint 函数能将上面的表格转换为一个"联合分布的对象"作为$X$和$Y$的常规联合分布表显示。

    joint_dist =joint_table.to_joint()
    joint_dist
X=0 X=1 X=2
Y=2 0.000 0.125 0.125
Y=1 0.125 0.250 0.125
Y=0 0.125 0.125 0.000

每个单元格对应着一对$(x,y)$,$x$对应着$X$ ,$y$对应着$Y$。在每个单元格中都能看到$X=x$和$Y=y$时的概率$P(X=x,Y=y)$。

联合分布表类似于数据 8 中分析两个分类变量之间关系时看到的列联表。在列联表中,每个单元格包含一个特定类别对中的个体数量。在联合分布表(如上图)中,每个单元格包含一对特定值的概率。

找到的概率

表格完整的包含了$X$和$Y$之间的关系,要找到$X$与$Y$所决定的事件的可能性,只需要找到造成事件发生的单元格, 并将他们的概率相加。这是找到部分事件概率的基本方法。

例如: $ P(X>Y) = P(X=1,Y=0)+P(X=2,Y=0)+P(X=2,Y=1) = 0.125 + 0 + 0.125 = 0.25 $ $ P(X=Y) = P(X=0,Y=0) + P(X=1,Y=1) +P(X=2,Y=2) = 0.125 +0.25 +0.125 = 0.5 $

边际分布

联合分布表是根据每队$(X,Y)$的值来划分整个结果空间。

在我们的例子中,我们将硬币丢出了 3 次。X 的值是前 2 次抛出硬币的结果,Y 的值是最后两次抛硬币的结果。 我们在这里再看一下联合分布表中的$X$和$Y$。

X=0 X=1 X=2
Y=2 0.000 0.125 0.125
Y=1 0.125 0.250 0.125
Y=0 0.125 0.125 0.000

在这个表中共有 9 个部分,每个部分都代表着一个可能性出现的概率。

当然,正如我们在上一节中所看到的一样,这些可能性的概率累加的结果是 1。

通过 Y 来划分{X=x}

现在我们来看看X=0 这一列。 在这列中的每一个单元格里,$X$都是 0,$Y$的值则是在$Y$取值范围的一些元素。

所以X=0这列是通过 Y 的取值来划分事件${X=0}$的部分,再展示其中每个部分的概率。

事实上对于每一个不想交的$x$集合而言,都有: ${X=x }= ⋃ all y {X=x,Y=y}$ 所以,根据加法规则则有: $P(X=x)=∑ all y P(X=x,Y=y)$

$P(X=x)$X=x列的所有概率之和。因为$P(X=x)$是$X$分布中的一个一般项,我们可以从$X$和$Y$的联合分布中得到 X 的分布。

如果我们想要求出 X 分布的数值,我们可以使用marginal函数,把 X当做参数,把联合分布当做对象进行操作。 一旦我们看到结果,使用“边际”这个词的理由就会变得清晰起来。

joint_dist.marginal('X')
X=0 X=1 X=2
Y=2 0.000 0.125 0.125
Y=1 0.125 0.250 0.125
Y=0 0.125 0.125 0.000
Sum: Marginal of X 0.250 0.500 0.250

现在表的底部有所有列的和,它们构成了$X$的分布。由于这些和出现在表的边距中,因此该分布称为边际分布。

这是前两次投掷结果出现正面次数结果$X$的概率分布的新名词。

$X$和$Y$的边际分布

很明显,你能对$X$做的事,对$Y$也一样可以做。

joint_dist.marginal('Y')
X=0 X=1 X=2 Sum: Marginal of Y
Y=2 0.000 0.125 0.125 0.25
Y=1 0.125 0.250 0.125 0.50
Y=0 0.125 0.125 0.000 0.25
Sum: Marginal of X 0.250 0.500 0.250 1.00

$Y$也是两次抛掷的正面数(三次抛掷中的最后两次),所以边距中的概率是有意义的。

你也可以同时得到两个边际:

joint_dist.both_marginals()
X=0 X=1 X=2 Sum: Marginal of Y
Y=2 0.000 0.125 0.125 0.25
Y=1 0.125 0.250 0.125 0.50
Y=0 0.125 0.125 0.000 0.25
Sum: Marginal of X 0.250 0.500 0.250 1.00

在表中底部最右边的那个单元格代表的是对于每个边际的概率之和,当然,它一定是 1。 比较这两个边际分布,他们的结果相同(可能的值和相应的概率),所以,可以认为 $X =d Y$

条件分布

要理解两个变量之间的关系,必须检查每个变量的条件行为,并给出另一个变量的值。 为了实现这一目标,我们将首先检查前几节的简单示例,然后开发通用理论。

我们的例子是连续三次抛一枚硬币,其中 X 是三次中前两次抛硬币所出现正面的次数,$Y$是三次中后两次抛硬币所出现正面的次数, X 和 Y 的联合分布和 2 个边际都显示在下表中。

joint_dist.both_marginals()
X=0 X=1 X=2 Sum: Marginal of Y
Y=2 0.000 0.125 0.125 0.25
Y=1 0.125 0.250 0.125 0.50
Y=0 0.125 0.125 0.000 0.25
Sum: Marginal of X 0.250 0.500 0.250 1.00

给$X$一个特定的值$x$,也就是说,假设抛三次硬币中的前 2 次有$x$次是正面的,我们可以计算出最后两次投掷中正面数量的条件分布。

在随机变量语言中,对于$x$的每一个值,随机变量$Y$在$x =x$的情况下有一个条件分布。我们可以得到这三个条件分布如下:

joint_dist.conditional_dist('Y','X')
Dist. of Y | X=0 Dist. of Y | X=1 Dist. of Y | X=2 Marginal of Y
Y=2 0.0 0.25 0.5 0.25
Y=1 0.5 0.50 0.5 0.50
Y=0 0.5 0.25 0.0 0.25
Sum 1.0 1.00 1.0 1.00

我们可以从第一列开始来理解这张表。在第一列中,假设的条件是$X=0$,也就是说,3 次投掷中前两次都是反面。 在这个情况下,$Y$的值不可能是 2,也就是说,既然 3 次中的前 2 次都是反面,那后两次再怎么抛也不可能都是正面。 这就是为什么你看到第一列最上面那行概率是 0 的原因。 在$X=0$的情况下,$Y$只能是 0 或 1,通过 Y 的值可以判断最后一次抛硬币的结果是正面还是反面。 这样就能解释为什么下面两格的概率为什么都是 0.5 了。

你可以用这个方法解决其他的概率问题。 但你不需要回到原来的结果来算出这些条件概率,只需使用示例开头显示的联合分布表和除法规则即可。

比如:

$P(Y=1|X=0) = P(X=0,Y=1)/P(X=0)$ = 0.125/0.25 = 0.5

我们可以很容易看出为什么条件分布表中的每一列和为 1。一列中的每个单元格的值都是用联合分布表的相应单元格除以其列的和。 所以所有列的结果和也应该是 1。

理论部分

我们将推广我们在上面实例中所做的计算。

把$X$和$Y$定义为 2 个相同定义范围内的随机数。 设$X=x$,$Y=y$,则: $P(Y=y|X=x) = P(X=x,Y=x)/P(X=x)$ 因此,对于$x* (X)$的固定值,在$X =x*$是概率的集的情况下,$Y$的条件分布: $P(Y=y|X=x*) = P(X=x*,Y=y)/P(X=x*)$ 其中 y 的取值范围为 Y 所表示变量的所有值。x* 是 x 的特定值,是一个常数.

条件分布的概率和为 1

在分布中,所有概率的和是 1.如果想验证条件分布的正确与否,可以运用这个规则来判断。 通过对事件${X=x*}$的划分来找到$P(X=x*)$,根据 Y 的值则有: $P(X=x*) = ∑ all y P(X=x*,Y=y)$

现在我们可以累加条件分布中给定$X=x* $的$Y$值,看看结果是否为 1. $ ∑ all y P(Y=y|X=x*) = ∑ all y P(X=x*,Y=y)/P(X=x*) = 1/P(X=x*)∑ all y P(X=x*,Y=y) = 1/P(X=x*)* P(X=x*) = 1 $

更新分布

正如我们在学习贝叶斯规则时看到的,条件作用给了我们一种基于新数据更新观点的方法。 让我们看看如何使用条件分布来表示基于数据的随机参数。

例子:一个随机挑选的硬币

假设我有一个均匀的硬币和三枚质量有偏差的硬币。假设有质量偏差的硬币落地后正面朝上的概率是 0.9。 现在我水机挑选一枚硬币,投掷 2 次,然后告诉你正面朝上的次数。 你要怎么判断这枚硬币是否有质量偏差?

在我告诉你正面朝上的次数之前。你之前的观点可能是:硬币质量均匀的概率是 0.25,而质量有偏差的概率则为 0.75。

这个例子的目的是让我们更直观的体会到了解关于正面数量的信息是如何影响这个观点的。

设 R 为随机硬币落地的概率。$R$的可能值分别为 0.5 和 0.9, R 的先验概率分布如下表所示。

   coins =[0.5,0.9]
   prior = [0.25,0.75]
   Table().values(coins).probability(prior)
Value Probability
0.5 0.25
0.9 0.75

设$H$的值为两次抛币正面朝上的次数, 那么$R$和$H$的联合分布的形式为:$P(R=r,H=h),r∈(0.5,0.9),h∈{0,1,2}$ 一共会有 6 种可能性。我们可以用乘法规则去计算它。 $P(R=0.9,H=2)=P(R=0.9)P(H=2|R=0.9)$=0.75* 0.9^2 = 0.6075 当${H=1}$发生的时候会有 2 种可能,先正后反或是先反后正。所以: $P(R=0.5,H=1)=P(R=0.5)P(H=1|R=0.5)$=0.25[(0.5* 0.5) + (0.5* 0.5)] = 0.125 我们可以用同样的方法计算出当$r$和$h$为其他值时$P(R=r,H=h)$的值。

让我们用 python 试试,joint_probs函数以 r 和 h 为参数,可以返回 P(R=r,H=h)

def joint_probs(r, h):
    """Return P(R = r, H = h)"""
    
    # Start with the distribution of the number of heads in two tosses
    # of a coin that lands heads with a known chance r;
    # these are the chances of h=0, h=1, and h=2
    
    heads_2_tosses = make_array((1-r)**2, 2*r*(1-r), r**2)
    
    if r == 0.5:
        return 0.25*heads_2_tosses.item(h)
    elif r == 0.9:
        return 0.75*heads_2_tosses.item(h)

我们现在可以使用 prob140 方法来构造$R$和$H$的联合分布表,如联合分布一节所述。 回想一下,我们使用硬币,在构建 R 的先验分布之前:

coins,prior

([0.5,0.9],[0.25,0.75])

heads = np.arange(3)
joint_tbl = Table().values('R', coins, 'H', heads).probability_function(joint_probs)
joint_dist = joint_tbl.to_joint()

joint_dist
R=0.5 R=0.9
H=2 0.0625 0.6075
H=1 0.1250 0.1350
H=0 0.0625 0.0075

$P(R=0.5,H=1)$的值与我们直接计算的值一致。 让我们检查一下 R 的边际是否与一个均匀硬币和三个偏置硬币随机取硬币的假设一致。 没有关于正面数的信息,R 的分布应该是先验的。这正如我们在表格底部看到的。

joint_dist.marginal('R')
R=0.5 R=0.9
H=2 0.0625 0.6075
H=1 0.1250 0.1350
H=0 0.0625 0.0075
Sum: Marginal of R 0.2500 0.7500

现在假设我偷偷的随便取出一个硬币,抛两次,再告诉你它正面朝上的次数。给你$H$的值,你能告诉我$R$的值吗?

首先,一个好的主意是根据$H$的值去所有的条件分布里找到 R 的条件分布。

joint_dist.conditional_dist('R', 'H')
R=0.5 R=0.9 Sum
Dist. of R | H=2 0.093284 0.906716 1.0
Dist. of R | H=1 0.480769 0.519231 1.0
Dist. of R | H=0 0.892857 0.107143 1.0
Marginal of R 0.250000 0.750000 1.0

从下面一行往上读这张表。记住,硬币是随机挑选的。

  • 如果我不告诉你正面的个数,你能告诉我的关于硬币的所有事情是有 25%的概率是公平的 75%的概率是有偏差的硬币。
  • 如果我告诉你我得到了 0 次正面,你对硬币的看法就会发生戏剧性的变化而倾向于均匀硬币。偏差硬币没有正面的机会很小,所以即使其中一个很有可能被选中,数据也会使天平向均匀硬币倾斜。
  • 如果我告诉你我有 1 个正面,你就有点为难了。偏差硬币产生 1 个正面的机会不大(18%),而均匀硬币产生 1 个正面的机会是 50%。但被选中的硬币有 75%的几率会有偏差,而公平的几率只有 25%。这两种效果的大小让你很不确定该向哪一种硬币倾斜。你只有一点点倾向于“偏见”。
  • 如果我告诉你我得到了两个正面,你的观点就会戏剧性地转向有偏差的硬币。它们不仅很可能产生两个正面,而且很可能被选中。

根据数据更新你的观点

这是机器学习中经常出现的一个简单例子。

  • 一开始你对一个未知的量有一个先验的观点。我们的先验分布是均匀硬币的概率是 25%
  • 当你看到这些数据后,你对未知数量的看法可能会发生变化,有时会非常剧烈。这种变化既取决于可能性,也取决于先验。
  • 然后,你可以再多抛几次,并根据新掷出的次数再次更新你的意见。

依赖和独立

条件分布帮助我们形式化了关于两个随机变量是否相互独立的直观概念。设 X 和 Y 是两个随机变量,假设已知 X 的值,这会改变我们对 Y 的看法吗? 如果答案是肯定的,那么我们会说 X 和 Y 是相关的。如果答案是否定的,不管 X 的给定值是多少,我们会说 X 和 Y 是独立的。 让我们从一些例子开始,然后转向精确的定义和结果。

依赖

这是两个随机变量$X$和$Y$的联合分布从这里,我们能说$X$和$Y$是相互依赖还是相互独立的?

dist1
X=0 X=1 X=2 X=3
Y=3 0.037037 0.000000 0.000000 0.00000
Y=2 0.166667 0.055556 0.000000 0.00000
Y=1 0.250000 0.166667 0.027778 0.00000
Y=0 0.125000 0.125000 0.041667 0.00463

你可以马上看到,如果$Y$可以是 1 或 2。知道$X$的值会改变 y 的分布,这是依赖关系。

这里有一个例子,在这个例子中,您不能仅仅通过查看可能的值来快速确定依赖性或独立性。

dist2
X=3 X=4
Y=7 0.3 0.1
Y=6 0.2 0.2
Y=5 0.1 0.1

但是你可以通过观察$Y$在$x$下的条件分布来判断,它们是不同的。

dist2.conditional_dist('Y', 'X')
Dist. of Y | X=3 Dist. of Y | X=4 Marginal of Y
Y=7 0.500000 0.25 0.4
Y=6 0.333333 0.50 0.4
Y=5 0.166667 0.25 0.2
Sum 1.000000 1.00 1.0

它是这样的(你应该试着证明这一点),$X$的一些条件分布在$Y$的不同值下也会彼此不同,$X$的边际也会不同。 注意,并不是所有的条件分布都是不同的。$X$在$Y=5$时的条件分布与$X$在$Y=6$时的条件分布相同。但在$Y=7$的情况下,条件分布会改变。$X$和$Y$是相互依赖的。

dist2.conditional_dist('X', 'Y')
X=3 X=4 Sum
Dist. of X | Y=7 0.75 0.25 1.0
Dist. of X | Y=6 0.50 0.50 1.0
Dist. of X | Y=5 0.50 0.50 1.0
Marginal of X 0.60 0.40 1.0

独立性

这是一个联合分布表,在这个表中你不能立即判断是否存在依赖性。

dist3
X=0 X=1 X=2 X=3
Y=4 0.000096 0.000289 0.000289 0.000096
Y=3 0.001929 0.005787 0.005787 0.001929
Y=2 0.014468 0.043403 0.043403 0.014468
Y=1 0.048225 0.144676 0.144676 0.048225
Y=0 0.060282 0.180845 0.180845 0.060282

但看看$X$在$Y$上的情况。

dist3.conditional_dist('X', 'Y')
X=0 X=1 X=2 X=3 Sum
Dist. of X | Y=4 0.125 0.375 0.375 0.125 1.0
Dist. of X | Y=3 0.125 0.375 0.375 0.125 1.0
Dist. of X | Y=2 0.125 0.375 0.375 0.125 1.0
Dist. of X | Y=1 0.125 0.375 0.375 0.125 1.0
Dist. of X | Y=0 0.125 0.375 0.375 0.125 1.0
Marginal of X 0.125 0.375 0.375 0.125 1.0

所有的行都是一样的。也就是说,在 Y 的不同值下,所有 X 的条件分布都是相同的,因此也等于 X 的边际。

给定$Y$的值,$X$的概率不会改变。这就是独立。

你可从$Y$在$X$上的情况得到同样的结论。

dist3.conditional_dist('Y', 'X')
Dist. of Y | X=0 Dist. of Y | X=1 Dist. of Y | X=2 Dist. of Y | X=3 Marginal of Y
Y=4 0.000772 0.000772 0.000772 0.000772 0.000772
Y=3 0.015432 0.015432 0.015432 0.015432 0.015432
Y=2 0.115741 0.115741 0.115741 0.115741 0.115741
Y=1 0.385802 0.385802 0.385802 0.385802 0.385802
Y=0 0.482253 0.482253 0.482253 0.482253 0.482253
Sum 1.000000 1.000000 1.000000 1.000000 1.000000

独立的两个事件

独立的概念似乎是直观的,但如果不仔细定义它,可能会遇到很多麻烦。我们来正式定义一下。

对于两个事件的独立性有两个等价的定义。第一个封装了独立性的主要思想,第二个用于计算。

对于两个事件 A 和 B, 如果$P(B|A)=P(B)$,我们可以认为它们是独立的。同样的,如果$P(AB)=P(A)P(B)$,我们也能认为 A 和 B 是独立的。

两个随机变量的独立性

我们在本节示例中所观察到的内容可以转化为独立性的正式定义。

对于 2 个随机变量$X$和$Y$,如果对于每一个 X 的值 x 和 Y 的值 y 都有:$P(Y=y|X=x)=P(Y=y)$,则 X 和 Y 是独立的。

无论给定的 x 是什么,我们都能确定 Y 的条件分布。

关于事件独立性的一个等价定义是,对于 x 和 y 的任何值,事件${x =x}$和${y =y}$是独立的。

对于 2 个随机变量$X$和$Y$,如果对于每一个 X 的值 x 和 Y 的值 y 都有:$P(Y=y,X=x)=P(X=x)P(Y=y)$,则 X 和 Y 是独立的。

独立性简化了乘法规则中的条件概率.

事实上,如果$X$和$Y$是独立的随机变量,那么由$X$决定的任何事件都独立于由 Y 决定的任何事件,例如,如果$X$和$Y4 是独立的,$X$是一个数字,那么${X= X}$独立于${Y> X}$。同样,$X$的任何函数都独立于 Y 的任何函数。

你可以通过划分和独立的定义来证明这些事实。这些证明是常规的,但有点累。如果你不想证明事实,你可以接受事实。

相互独立

事件 A1、A2、……a 是相互独立的(或简称独立的),如果给定事件的任何子集已经发生,那么所有其他子集的条件概率保持不变。

这看起来有点拗口。实际上,这意味着你知道发生了什么并不重要;其余事件发生的几率不变。

随机变量的 n 项,X1,X2,…,Xn 是独立的,如果给定任意子集的值,其余变量决定事件的概率不变。

在实践中,这只是形式化的陈述,如“不同硬币的抛掷结果是独立的”或“随机抽取与替换是独立的”。

不要被形式主义所束缚。注意到理论不仅支持直觉,而且发展了直觉。你可以期待你的概率直觉在这门课结束时比现在更清晰!

"i.i.d." 随机变量

如果随机变量相互独立且分布相同,它们就被称为“i.i.d”。这是概率论中最著名的缩写之一。你可以把 i.i.d.随机变量看作是人口替换的结果,或者是同一实验的独立复制的结果。

假设 X 的分布有: $P(X=i)=Pi,i=1,2,3...,n$ 且它们累加的结果为 1。

现在设 X 和 Y 是 i.i.d, $P(X=Y)$是多少?我们将用基本方法来回答这个问题,现在用随机变量符号。

$P(X=Y) = Σn,i=1 P(X=i,Y=i) = Σn,i=1 P(X=i)P(Y=i) = Σn,i=1 Pi*Pi = Σn,i=1 Pi^2$

如果你知道 Pi 所有的值,最后一个表达式其实很好计算。

同样的方法: 因为$P(Y>n)=0$ $P(Y&gt;X) = Σn,i=1 P(X=i,Y&gt;i) = Σn,i=1 P(X=i)P(Y&gt;i) = Σn-1,i=1 P(X=i)P(Y&gt;i)$

现在对于每个$i<n$,$P(Y>i)=P(X>i)=Σn,j=i+1 Pj$. 设这个和为 Bi , 表示大于 i 的数。则: $P(Y&gt;X) = Σn-1,i=1 P(X=i)P(Y&gt;i) = Σn-1,i=1 Pi* Bi$

如果你知道所有的 Pi 的值,其实这就是一个简单的计算。 把 n=4 带入,得:$P1*(P2+P3+P4)+P2*(P3+P4)+P3* P4$