您当前的位置: 首页 >  编程语言

我用 Python 正确地尝试了统计和概率的基础知识(概率版上半部分)

介绍

这是参考以下书籍重新学习统计学基础的轨迹与概率版的前半部分

本文是四部分系列的第二篇。另见下文。

准备数据...已发布 上半场概率···本文 概率下半场...尚未 推测...尚未

撰写本文的动机、注意事项、使用的技术、文章的结构和准备工作在“准备 - 数据”部分中进行了描述。

这只是我的主观意见,但我认为理解“概率”的障碍很高,因为与工程师熟悉的“数据”相比,处理“概率”的机会很少。在继续看书的同时,有一些补充帮助理解,有些部分我自己酌情省略了,所以如果你想跟着书,请购买书!

另外,起初,我将三部分结构视为“概率”,但由于我想加深概率的基础知识,我决定将其分为前半部分和后半部分,如下所示。但是,根据以后的文章量,它可能会再次改变,,,

上半场 推断统计 概率模型 离散随机变量 1D 2D 下半场 代表离散概率分布 连续随机变量 1D 2D 代表连续概率分布 多维随机变量 基本的

在上一篇文章的结构中,我谈到了需要概率知识才能获得统计分析技能。我将具体解释需要什么。

描述性和推论性统计

描述手头数据的统计特性的框架描述性统计叫做。数据部分发布的内容正是描述性统计。但是,很少能够分析手头的所有数据。

例如,即使您有该网站上个月的访问历史,也将是从网站启动到一个月前的访问历史,以及从现在到网站关闭的未来数据。包括。如果我们想知道网站过去3个月和未来3个月的统计属性,我们将仅使用过去1个月的数据,我们将使用过去6个月的数据,包括未来3个月的数据。尚未确定。推断统计性质。

通过这种方式,提出了一个框架,用于从一部分数据中估计所有必要数据的统计特性。推论统计我将在本文中处理它。

样本数据

由于处理上述示例的数据很复杂,因此我们将使用本书中的以下数据来解释推理统计。

整体数据:所有高中生400人民数学考试成绩 手头数据...学生 A 对20 人的测试结果

A先生是高中生,存在无法获得所有学生的考试成绩的限制。在这种情况下,我想通过猜测总平均分来知道我的分数是好是坏!有一个动机图如下。

当然,我实际上不能到处问学生,所以我将使用示例数据和程序。

推论统计大图

上图给出了推理统计的概述。但是,它不包含解释推理统计所需的术语,因此我们将在解释每个术语时应用每个术语。我还会讲一下概率的必要性和定位,这是本文的重点。

做好准备并执行。

下载并安装
!git clone https://github.com/ghmagazine/python_stat_sample.git
!mv ./python_stat_sample/data ./data
!pip install japanize-matplotlib
导入和设置
import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
import japanize_matplotlib
import seaborn as sns

%precision 3
pd.set_option('precision', 3)

执行结果被省略。

人口

您要观察的整个目标数据人口叫做。在此样本数据中,400 的分数将是总体。这是A先生无法获得的数据,但读取它是为了模拟A先生的提取。

人口负荷
all_scores = pd.read_csv('data/ch4_scores400.csv')['点数']
all_scores
执行结果
0      76
1      55
2      80
3      80
4      74
       ..
395    77
396    60
397    83
398    80
399    85
Name: 点数, Length: 400, dtype: int64
样本

用于推理的人口部分样品叫做。 A 先生得到的20 的分数与此相对应。

采样

从人群中抽取样本采样叫做。这是A先生四处打听后得知的。

采样
sample_scores = np.random.choice(all_scores, 20, replace=False)
sample_scores
执行结果
array([55, 65, 69, 58, 63, 57, 86, 61, 50, 54, 64, 64, 65, 86, 48, 82, 75,
       50, 64, 58])

以上由np.random.choice随机抽样随机抽样)。另外,因为是replace=False,所以同一个样本只提取一次。无需更换即可提取是。 replace=True 可以重新采样相同的样本带修复的提取变成 .另外,关于这次提取20人的数量样本量叫做。

请注意,从总体中提取的数据在这里可能存在偏差。例如,如果你向 A 先生的熟人20 询问他的分数,可能会因性别或年级而产生偏差。还有,为了避免数据出现偏差,即使我和学校里碰巧看到的人交谈,成绩不好的学生也可能不会告诉我他们的分数。数据可能会因偶然而有偏差。

数据偏差可以通过设计一种提取方法来减少,但不能完全消除。推论统计需要适当处理因样本大小和提取方法而有偏差的数据!

抽样统计

这些是从提取的样本中计算出的统计数据,例如均值和方差。此外,每个统计量称为样本均值、样本方差等。

找到均值和方差
sample_scores.mean(), sample_scores.var()
执行结果
(63.700, 119.910)
范围

总体统计数据(均值、方差等)范围叫做。此外,每个统计量称为总体均值、总体方差等。很难获得手头人口的所有数据。因此,通常无法直接计算参数。

估计器

例如,当从样本均值推断总体均值时,样本均值是估计器据说此外,估计的实际值是估计叫做。在本例中,我们从400 人的总体中提取20 人,从提取的样本中计算样本均值作为估计量,得到估计值63.7。

可能性

现在重复随机抽样和统计计算。具体而言,从400人的分数中随机选择20人的分数,计算样本统计量,并显示它们的过程重复10次。

执行重复采样
for i in range(10):
    sample_scores = np.random.choice(all_scores, 20, replace=False)

    mean, std = sample_scores.mean(), sample_scores.std()
    print(f'{i + 1:02}回  平均: {mean:.1f}  標準偏差: {std:.2f}')
执行结果
01回  平均: 66.7  標準偏差: 14.06
02回  平均: 72.9  標準偏差: 14.74
03回  平均: 76.3  標準偏差: 14.21
04回  平均: 71.2  標準偏差: 17.88
05回  平均: 73.6  標準偏差: 13.00
06回  平均: 64.4  標準偏差: 13.05
07回  平均: 72.5  標準偏差: 14.74
08回  平均: 73.0  標準偏差: 15.70
09回  平均: 70.8  標準偏差: 10.60
10回  平均: 68.7  標準偏差: 13.74

20人员抽样导致统计数据有很大差异。抽样部分提到的数据偏差会产生影响。还有,在A先生的例子中,20987654360@times似乎很难画出来,必须量化识别。

当考虑到这种不确定的现象时,有效的是可能性是。概率是偶然发生的事件的频率,但是通过对一系列事件建模并考虑它们,我们可以定量表达和控制各种现象的不确定性,包括这个例子!

以下是前面显示的图的概述,此处替换了每个术语。

我试图将这个数字总结成句子。

无法直接计算总体,因为无法观察到整个总体 可以从从一部分总体中提取的样本中计算样本统计量并估计总体 由于样本偏差导致的估计不确定性 通过使用概率,可以量化地处理和控制不确定性 概率模型的大图

前面提到的不确定现象的数学模型概率模型)叫做。从现在开始,我们将以骰子为例来解释概率模型的全貌。请参阅下面的建模。

骰子之所以突然出现在这里作为例子,是因为它是一种方便、简单、众所周知的概率模型思考工具。此外,您可以用简单的骰子代替它们来思考世界上的各种现象!我将在整个解释过程中提供示例。

随机变量

当您掷普通骰子时,结果将始终是 1 到 6 之间的数字。一个典型的骰子是正方形的,所以每个数字都有相同的滚动概率。这样,虽然只有尝试才能知道结果,但可能的值和得到一个值的概率就确定了。随机变量叫做。

又一个变量出来了。用语言很难理解,但如果你想象一个在程序中定义的变量,它可能更容易理解。下面定义了一个包含骰子结果的随机变量p。

一个包含 1 到 6 的变量
p = np.random.randint(1, 7)
p
执行结果
2

在骰子的情况下,1 到 6 是具有相同概率的变量。我们可以考虑骰子以外的各种随机变量。

解释 随机变量名 可能的价值 骰子 结果 1, 2, 3, 4, 5, 6 掷硬币 方向 表, 裏 泰坦尼克号 你活下来了吗 生存, 死亡 应用审查 星数 1, 2, 3, 4, 5 测试 积分 0 到 100 赌博 平衡 0 到 ∞ 欧共体网站 结果 離脱, カートに入れる, 購入

这里出现了一个问题,即概率未确定的现象是否是随机变量。例如,我们知道抛硬币的概率几乎是 50/50,但除非我们尝试,否则测试分数不会给出结果。不过仔细想想,硬币表面其实有轻微的凹凸不平,需要无限次抛硬币才能准确计算出概率。相反,似乎可以通过无限尝试来计算所有这些现象的概率。

换句话说,如果它是无限尝试时概率固定的现象,那么应该可以将其视为随机变量。有关确切的随机变量定义,请参见下文。

审判

获取随机变量结果是試行。掷骰子会给你结果,所以掷骰子是一种考验。这是一个获得掷骰子 10 次结果的程序。

10 次尝试
[np.random.randint(1, 7) for _ in range(10)]
实现

这是通过试验观察到的值。作为掷骰子的结果,我们得到结果的实现值。也就是说,↑的执行结果变成了实际值。

执行结果
[1, 1, 6, 5, 2, 3, 2, 4, 5, 2]
事件

试验可能发生的事件现象叫做。事件示例如下。

掷骰子6 掷骰子偶数 测试成绩92 合格高考! 网站被访问購入されず..

6 是 1/6,偶数 是 1/2,以此类推。此外,6 和92 等事件无法进一步解决的点是小学活动)叫做。此外,不能同时发生的事件独家活动)叫做。这里,概率的重要性质是互斥的至少有一个事件发生的概率是每个事件的概率之和。曾经在学校学过总和法则是不是,,,

例如,掷骰子2 和掷骰子6 不能同时发生,因此它们是互斥的。此时每卷的概率为1/6,所以卷为2或6的概率为

\frac{1}{6} + \frac{1}{6} = \frac{1}{3}

可以计算为相反,滚动2 和滚动偶数 可以同时发生,因此它们不是互斥的,上述加法不成立。

对于和定律和概率乘积定律,

概率分布

表示随机变量的行为方式概率分布叫做。它表示可能值的分布,哪些值以什么概率出现。首先,让我们为骰子创建一个概率分布。

骰子概率分布
dice_df = pd.DataFrame(index=[1, 2, 3, 4, 5, 6])
dice_df['確率'] = 1 / 6
dice_df.T
1 2 3 4 5 6 可能性 0.167 0.167 0.167 0.167 0.167 0.167

我稍微修改了 Markdown 格式。0.167 大约是1/6。概率分布的总和为1.0。

概率分布之和
dice_df['確率'].sum()
执行结果
1.000

我们还创建了抛硬币的概率分布。

硬币的概率分布
coin_df = pd.DataFrame(index=['表', '裏'])
coin_df['確率'] = 1 / 2
coin_df.T
桌子 背部 可能性 0.5 0.5

现在让我们考虑一下骰子和硬币之间的区别。

骰子有6种根事件,硬币有2种,每个根事件的概率是1/6对于骰子和1/2对于硬币。还有形状和投掷方法等其他区别,但如果将其简化为随机模型,您可以看到唯一的区别是基本事件的数量和相应的概率。

骰子有很多种,比如只有1和2的骰子,还有12的骰子(正十二面体)。以下是骰子的类型。它比我想象的更多样化。

换句话说,一枚硬币可以被视为骰子之一。此外,似乎可以将我作为例子给出的世界上的事物想象成掷某种形式的骰子的结果。换句话说,我们可以将示例中提到的各种事物视为概率模型。从中推导出概率分布似乎可以帮助我们理解很多事情!

但是,从一开始就知道概率分布的情况(例如骰子和硬币)很少见。要想得到一个完整的概率分布,就需要无限重复试验来确定每个潜在事件对应的概率,这是不现实的。

频率分布和概率分布

因此,我们采用从重复试验有限次获得的数据创建相对频率分布的方法,并从中推断概率分布。

有关相对频率,请参阅上一篇文章中的此处。

为了确认这种方法是否有效,我们使用作弊骰子进行了验证。作弊骰子的重心发生了偏移,每次掷骰的概率(1 到6)都有偏差。反复掷这个作弊骰子,猜出概率分布!

我们不知道作弊骰子的概率分布
roll_index = pd.Index([1, 2, 3, 4, 5, 6], name='出目')
loaded_dice_df = pd.DataFrame(index=roll_index)
loaded_dice_df['確率'] = [1/21, 2/21, 3/21, 4/21, 5/21, 6/21]
loaded_dice_df
结果 可能性 1 0.048 2 0.095 3 0.143 4 0.190 5 0.238 6 0.286

以上是作弊骰子的概率分布。数字越大,设置的概率就越高。此概率分布仅用于试验模拟,我们无法知道这个概率分布,会做。

使用np.random.choice进行作弊骰子(随机变量)的试验,并根据上述概率分布重复试验。

尝试作弊骰子 100 次
num_trial = 100
sample = np.random.choice(loaded_dice_df.index, num_trial, p=loaded_dice_df['確率'])
sample
执行结果
array([5, 5, 4, 2, 6, 5, 4, 2, 2, 6, 4, 6, 5, 6, 3, 6, 4, 6, 2, 4, 4, 3,
       5, 5, 4, 1, 5, 6, 4, 6, 4, 2, 3, 4, 4, 6, 6, 6, 4, 3, 6, 2, 2, 5,
       3, 1, 6, 5, 5, 5, 5, 6, 1, 6, 6, 5, 4, 3, 5, 6, 6, 6, 3, 5, 2, 5,
       6, 6, 5, 5, 4, 3, 2, 4, 4, 2, 5, 4, 6, 2, 3, 2, 3, 3, 5, 4, 4, 5,
       2, 5, 5, 4, 6, 4, 5, 5, 4, 3, 3, 6])

不知怎么偏向大数的,闻起来像作弊。。

根据获得的样本数据创建频率分布表。

100次试验的频率分布表
freq, _ = np.histogram(sample, bins=6, range=(1, 7))
pd.DataFrame({'度数': freq, '相対度数': freq / num_trial}, index=roll_index)
结果 频率 相对频率 1 6 0.06 2 9 0.09 3 13 0.13 4 14 0.14 5 24 0.24 6 34 0.34

100我在尝试时找到了每个结果的数量和百分比。让我们制作100 试验时的相对频率分布的直方图以及作弊骰子的实际概率分布。

100 次试验的直方图
def show_hist_loaded_dice():
    plt.figure(figsize=(10, 6))
    plt.hist(sample, bins=6, range=(1, 7), density=True, label=f'{num_trial}回試行による相対度数分布')
    plt.hlines(loaded_dice_df['確率'], np.arange(1, 7), np.arange(2, 8), color='red', lw=3, label='実際の確率分布')
    plt.xticks(np.linspace(1.5, 6.5, 6), labels=np.arange(1, 7))
    plt.xlabel('出目')
    plt.ylabel('相対度数')
    plt.legend()
    plt.grid(True)
    plt.show()

show_hist_loaded_dice()

对比实际概率分布和相对频率分布,似乎趋势虽然相似,但还是有区别的。这个图中的红线是我们想要找到的实际概率分布,红线是我们未知的情况。请注意,我们故意显示正确的数据,以查看实际概率分布与我们计算得出的相对频率分布之间的差异!

让我们将试验次数增加到5000。

5000 次试验的直方图
num_trial = 5000
sample = np.random.choice(loaded_dice_df.index, num_trial, p=loaded_dice_df['確率'])

show_hist_loaded_dice()

它越来越接近实际的概率分布,不是吗?从这个验证中,我们发现通过重复试验和获得相对频率来估计随机变量的概率分布似乎是可能的。如果试验次数按原样增加,则相对频率分布将收敛于概率分布。

总体看法

概率模型的解释到此结束。这是概率模型的概述。首先,让我们说明目前为止作弊骰子采用的方法。

假设作弊骰子是一个随机变量,直接知道概率分布需要无数次尝试,这是不可能的,我们得到了相对频率分布。该方法是据此估计作弊骰子的真实概率分布。

这是将作弊骰子翻译成常用术语的翻译。

通过将应用评论和网站访问等各种现象视为随机变量,可以采用类似的方法。还有,这个图和推论统计的图在结构上是相似的……主要前提是两者都不能观察到左边的所有元素。这次不是阅读我所指的书的时机,而是作为个人的教训,

事实牙齿真相不是 事实的解释做真相的估计我别无选择,只能

我明白了。这可能是一种夸大的解释,但它影响的不仅是机器学习和数据分析,还有你自己的生活。

推论统计和概率模型

在基础知识的最后,让我们考虑一个随机抽样点的示例,用于使用概率模型解释推理统计。从总体中随机抽样得到的样本被视为服从总体概率分布的随机变量。然而,除非所有人口都是可观察的(无限试验是不可能的),否则无法计算出准确的概率分布。

首先,将所有400 学生的分数的相对频率分布显示为直方图。

所有学生的直方图(相对频率分布)
def show_hist_scores(s, bins=100):
    plt.figure(figsize=(10, 6))
    plt.hist(s, bins=bins, range=(0, 100), density=True)
    plt.xlim(20, 100)
    plt.xlabel('点数')
    plt.ylabel('相対度数')
    plt.grid(True)
    plt.show()

all_scores = pd.read_csv('data/ch4_scores400.csv')['点数']
show_hist_scores(all_scores)

把这个频率分布看成是人口的概率分布,比如70点的人占总数的2.5%,我们可以看到得到的概率是2.5%。现在让我们模拟一个试验。

1次随机抽样试验
np.random.choice(all_scores)
执行结果
76

我得到了76点的实现价值。

让我们重复100 次并以相同的方式显示直方图。

100 次试验的直方图
scores = np.random.choice(all_scores, 100)
show_hist_scores(scores)

虽然很粗糙,但可以看到同样的趋势。现在尝试10000 次。

10000 次试验的直方图
scores = np.random.choice(all_scores, 10000)
show_hist_scores(scores)

我们越来越接近人口的概率分布,,,

请注意,在这种情况下,随机变量是400 人的测试分数。如果全日本的高中生都参加了这个测试,那么概率分布就会和上面的不一样,这意味着变化。

总结推论统计与概率模型的关系。

推论统计是一种使用概率模型推断总体统计特性的方法 从总体中获得的每个样本都可以视为遵循概率分布的随机变量 从总体中随机抽样是对遵循概率分布的随机变量的试验 数据与实际测量一致,因为结果已经确认。

每次都根据概率分布产生结果,而不是将总体视为具有已确定结果的数据扭曲的骰子如果您想象一下,可能会更容易理解。它太抽象了,我相信你会听到批评“事情没那么简单!”我想

统计随机变量

最后,我们展示了一个将统计数据捕获为随机变量的示例。

计算A先生随机与20交谈得到的平均分

将此视为1试验,通过抽样20人计算的平均值可以视为随机变量的实现值。现在让我们估计这个随机变量的概率分布。模拟提取20 人10000 次的分数并显示相对频率分布。

20人样本均值的相对频率分布
sample_means = [np.random.choice(all_scores, 20).mean() for _ in range(10000)]

plt.figure(figsize=(10, 6))
plt.hist(sample_means, bins=100, range=(0, 100), density=True, label='相対度数分布')
plt.vlines(np.mean(all_scores), 0, 1, color='red', label='母平均')
plt.xlim(50, 90)
plt.ylim(0, 0.15)
plt.xlabel('点数')
plt.ylabel('相対度数')
plt.legend()
plt.grid(True)
plt.show()

虽然有一些变化,但在总体均值附近获得的均值分布表明,可以通过该模拟从样本均值估计总体均值。

此外,可以看出,在对20 人进行抽样时,平均值变化很大。这种变化定量地表达了当前正在实施的分析方法的模糊性。用好概率模型不仅可以估计一个总体的统计属性,还可以量化分析计算出的数值的模糊性!

离散随机变量

到目前为止,我们已经介绍了推理统计和概率的基础知识。从这里,我们将更多地了解随机变量的类型和属性。随机变量可以分为几种类型。最初离散随机变量从。它是具有离散值的随机变量,例如掷骰子的次数或评论中的星数。

顺便说一句,从那时起,书中对公式的描述一直在增加。在文章中,我们尽可能不描述数学公式,而是用程序和句子来解释。同样,如果您对公式感兴趣,请购买这本书!

一维

我们将从一维随机变量开始。说维度似乎很难,但如果你认为只有一个随机变量,那就没问题了。例如,我们可以将单个骰子视为一维离散随机变量。

概率质量函数 (PMF)

我们需要定义一个一维离散随机变量的是随机变量的可能值以及该值出现的概率。如果是两个值的对应关系,貌似用Python的dict来解决,但考虑到这种对应关系以后会变得复杂,我们将其定义为函数。这个概率质量函数,或者概率函数叫做。它是一个函数,当输入可能的值之一作为参数时,根据概率分布输出概率。

以作弊骰子为例,创建第一个可能的值。这是骰子的结果。

随机变量的可能值
x_set = np.array([1, 2, 3, 4, 5, 6])

接下来我们定义概率函数。

概率函数
def f(x):
    return x / 21 if x in x_set else 0

当参数x 在x_set 内时,它返回x / 21 作为概率。看来性能会差一些,不过21可以改成np.sum(x_set)。

随机变量是一组可能的值和概率,所以创建为X

随机变量
X = [x_set, f]

用大写字母命名变量和类感觉很奇怪,但我经常在机器学习代码中看到它。就目前而言,那个区域是符合书的。

使用概率函数创建概率分布。

概率分布
prob = np.array([f(x) for x in x_set])
dict(zip(x_set, prob))
执行结果
{1: 0.048, 2: 0.095, 3: 0.143, 4: 0.190, 5: 0.238, 6: 0.286}

您已经为作弊骰子创建了一个概率分布,其中数字越大,发生的概率就越高!

并且所有的概率都是0.0或更多,总和是1.0。

概率的本质
print(f'すべて0以上: {np.all(prob >= 0)}')
print(f'総和: {np.sum(prob):.3f}')
执行结果
すべて0以上: True
総和: 1.000

从这一点开始,很难理解这些东西有什么用。

退出 没有出口 忙 电话答录机 未使用的号码

可以考虑这样的可能值(事件)。了解不同时区、星期几和季节的通话结果(概率分布)是有效拨打电话的重要信息。定义用于模拟试验的随机变量并了解概率的属性应该有助于用尽可能少的试验估计调用的概率分布。

很难想象困难的术语和定义的用法,但我希望你能带着这种动力继续阅读!

累积分布函数 (CDF)

随机变量X 小于或等于参数x 的概率。这是一个添加并返回可能值小于x 的概率的函数。

累积分布函数
def F(x):
    return np.sum([f(xx) for xx in x_set if xx  <= x])

F(4)
执行结果
0.476

这意味着扔作弊骰子时得到4或更少的概率是47.6%。

从这两个函数得到的分布类似于前文提到的从有限数据中得到的相对频率分布和累积相对频率分布。相对频率分布通过重复试验收敛到概率分布,累积相对频率分布收敛到累积概率分布。

随机变量的变换

在这里,我们解释一下替换随机变量的可能值的操作。假设你给一个作弊骰子奖励10X - 10,你可以变换随机变量X来创建另一个随机变量Y。例如,如果结果为1,则奖励为0,如果结果为5,则奖励为40。让我们为这个随机变量创建一个概率分布。

通过排列可能的值来创建概率分布
y_set = np.array([10 * xx - 10 for xx in x_set])
dict(zip(y_set, prob))
执行结果
{0: 0.048, 10: 0.095, 20: 0.143, 30: 0.190, 40: 0.238, 50: 0.286}

将x_set 替换为y_set 后,prob 原样使用,因为作弊骰子的概率不变。

在获得改变奖励后将出现在下一节中的期望值时,以及标准化随机变量(减去均值并除以标准差)时,似乎需要此操作,但仅当前信息并不能给出好主意。我做了一些研究,但在这个阶段,似乎足以理解您可以从随机变量创建另一个随机变量并在随机变量之间执行计算。

对于随机变量的标准化:

期望值

对随机变量进行无限试验得到的实现值的平均值为期望值叫做。虽然不能无限尝试,但可以通过将随机变量的可能值与概率的乘积相加来计算。随着试验次数的增加,在有限次数的迭代中获得的数据的平均值会收敛到期望值。也就是说,随着样本数量的增加,从样本中计算出来的均值和方差等指标会收敛到随机变量的指标上!

现在,让我们计算作弊骰子的随机变量X 的期望值。

作弊骰子 X 期望值
def E(X, g=lambda x: x):
    x_set, f = X
    return np.sum([g(xx) * f(xx) for xx in x_set])

E(X)
执行结果
4.333

随机变量X作为参数输入,计算可能值与概率的乘积,与np.sum相加。您可以将函数 g 指定为参数。默认值按原样使用可能的值,但您可以指定转换前面解释的随机变量的函数。让我们指定随机变量Y = 10X - 10。

随机变量 Y 的期望值
E(X, g=lambda x: 10 * x - 10)
执行结果
33.333

根据掷骰子计算的奖励预期值现在是33.333。

此外,期望值为线性度持有。

检查线性度
10 * E(X) - 10
执行结果
33.333

即使您要求E(X) 然后转换,您也会得到相同的结果!对于函数的线性度

方差

它表示随机变量的分散以及数据中的方差。单击此处查看有关上一篇文章的分发的文章。现在,让我们计算作弊骰子的随机变量X 的方差。

作弊骰子 X 的方差
def V(X, g=lambda x: x):
    x_set, f = X
    mean = E(X, g)
    return np.sum([(g(xx) - mean) ** 2 * f(xx) for xx in x_set])

V(X)
执行结果
2.222

g(xx) - mean 是偏差。将其提升到2 的幂,通过将其与f(xx) 可能值的概率相乘来计算,再与np.sum 相加,求出随机变量的方差。让我们以与期望值相同的方式指定随机变量 Y 的方差Y = 10X - 10。

随机变量 Y 的方差
V(X, g=lambda x: 10 * x - 10)
执行结果
222.222

此外,为期望值建立了线性,但对于方差,分散公式据说成立。

分散公式
10 ** 2 * V(X)
执行结果
222.222

通过将系数10(斜率)乘以2 幂,截距-10 已从等式中消失,但结果匹配!我将省略官方的解释,所以请参考以下内容。

二维

接下来,我将解释二维离散随机变量。二维意味着我们同时处理两个随机变量。它类似于上一篇文章中的二维数据。与一维的情况一样,考虑到有无限多的数据(无限试验),似乎可以从两个概率分布计算协方差等!

联合概率分布

同时考虑两个随机变量行为的分布联合概率分布叫做。如果你同时掷出两个作弊骰子,一个的结果不会影响另一个的结果。那样的话协方差就变成0.0了,不方便,关联两个变量。

概括,

同时掷骰子 A 和骰子 B 并检查结果 X・・・骰子 A 结果 + 骰子 B 结果 Y・・・骰子A

试一试吧。首先,让我们考虑一个二维随机变量的可能值。

可能的价值
x_set = np.arange(2, 13)
y_set = np.arange(1, 7)

print(f'Xのとりうる値: {x_set}')
print(f'Yのとりうる値: {y_set}')
执行结果
Xのとりうる値: [ 2  3  4  5  6  7  8  9 10 11 12]
Yのとりうる値: [1 2 3 4 5 6]

x_set 是两个骰子的总和,所以 2〜12 和 y_set 是 1〜6。这两个数组的组合就是这个随机变量的可能值。那么每个的概率是多少呢?

结果 可能性 1 1/21 2 2/21 3 3/21 4 4/21 5 5/21 6 6/21

当同时掷出符合此概率分布的骰子 A 和 B 时,A 的结果为Y,A 和 B 的和为X。您可以在 中看到骰子 B 的结果。之后,掷骰子 A 的概率和掷骰子 B 的概率的乘积就是X 和Y 的组合概率。这是你在学校学到的经验法则!

例如,当X 是5 并且Y 是2 时,A 掷出2,B 掷出5 - 2 = 3,所以概率是

\frac{2}{21} \times \frac{3}{21} = \frac{6}{441}

可以计算为从骰子A和B的结果中找到X和Y比较直观,然后从那里计算概率,所以我决定从试算结果中反算骰子B的结果。

现在,让我们创建一个概率分布并显示一个热图。

显示概率分布
def f_XY(x, y):
    a, b = y, x - y
    if 1 <= a <= 6 and 1 <= b <= 6:
        return  a * b / (21 * 21)
    else:
        return 0

prob = np.array([[f_XY(i, j) for j in y_set] for i in x_set])
prob_df = pd.DataFrame(prob, index=pd.Index(x_set, name='X'), columns=pd.Index(y_set, name='Y'))

plt.figure(figsize=(8, 7))
sns.heatmap(prob_df, annot=True, fmt='1.3f', cmap='Reds')
plt.show()

由于骰子只能滚动到1〜6,例如,当$Y$ 为1 时,$X$ 不能大于8。所有这些不可能的概率都是0.0。并且概率随着 $X$ 和 $Y$ 的数量增加而增加。它往往就像一个作弊骰子。

让我们在二维中确认概率的性质。

概率的本质
print(f'すべて0以上: {np.all(prob >= 0)}')
print(f'総和: {np.sum(prob):.3f}')
执行结果
すべて0以上: True
総和: 1.000

对于一维情况,也得到了类似的结果。

联合概率函数

一个函数,以两个可能的值作为输入,根据概率分布返回概率。 f_XY 之前定义的。我将再次描述并解释。

联合概率函数
def f_XY(x, y):
    a, b = y, x - y
    if 1 <= a <= 6 and 1 <= b <= 6:
        return  a * b / (21 * 21)
    else:
        return 0

从参数x和y中,得到骰子A和B的数量a和b增加。

我们还定义了一个随机变量XY。

随机变量 XY
XY = [x_set, y_set, f_XY]
边际概率分布

对于多件事情的概率分布,一件事情的概率分布是边际概率分布叫做。在二维随机变量的情况下,$X$ 和 $Y$ 的概率分布是边际概率分布。例如,要从二维随机变量XY中提取随机变量X,就需要去除随机变量Y的影响。让我们从XY 中提取X 和Y。

提取边缘分布 X
prob_df.sum(axis=1).to_frame().T
2 3 4 5 6 7 8 9 10 11 12 0.002 0.009 0.023 0.045 0.079 0.127 0.160 0.172 0.166 0.136 0.082

将Y 的概率与X 的每个可能值相加得出边际分布。我用DataFrame.sum。 Y 的计算方法相同。

提取边缘分布 Y
prob_df.sum(axis=0).to_frame().T
1 2 3 4 5 6 0.048 0.095 0.143 0.190 0.238 0.286

通过准备执行与上述相同处理的函数来创建随机变量X 和Y。

随机变量 X 和 Y 遵循各自的边际分布
def f_X(x):
    return np.sum([f_XY(x, y) for y in y_set])

def f_Y(y):
    return np.sum([f_XY(x, y) for x in x_set])

X = [x_set, f_X]
Y = [y_set, f_Y]

我们使用f_XY 将参数和其他所有可能值的概率相加。让我们使用我们制作的函数来显示每个边际分布!

显示边际分布
prob_x = np.array([f_X(k) for k in x_set])
prob_y = np.array([f_Y(k) for k in y_set])

fig = plt.figure(figsize=(16, 6))
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)

ax1.bar(x_set, prob_x)
ax1.set_title('Xの周辺分布')
ax1.set_xlabel('Xのとりうる値')
ax1.set_ylabel('確率')
ax1.grid()

ax2.bar(y_set, prob_y)
ax2.set_title('Yの周辺分布')
ax2.set_xlabel('Yのとりうる値')
ax2.set_ylabel('確率')
ax2.grid()

plt.show()

期望值

2D 随机变量的期望值与 1D 随机变量的期望值相同。定义函数E2,计算X和Y的期望值。

X、Y 的期望值
def E2(XY, g):
    x_set, y_set, f_XY = XY
    return np.sum([[g(i, j) * f_XY(i, j) for i in x_set] for j in y_set])

mean_X = E2(XY, lambda x, y: x)
mean_Y = E2(XY, lambda x, y: y)
mean_X, mean_Y
执行结果
(8.667, 4.333)

期望值可以通过指定函数g可以取的值本身并返回来获得。例如,您可以在这里根据骰子的结果设置奖励,这与一维情况相同。如果x + y,可以计算出X和Y的期望值之和,

期望值之和
E2(XY, lambda x, y: x + y)
执行结果
13.000

和一维情况一样,期望值具有线性,所以即使X和Y的期望值用E2计算再相加,结果也是一样的。

期望值线性
mean_X + mean_Y
执行结果
13.000
方差

与一维情况一样,方差也可以通过偏差平方的期望值获得。

X、Y 的方差
def V2(XY, g):
    x_set, y_set, f_XY = XY
    mean = E2(XY, g)
    return np.sum([[(g(i, j) - mean) ** 2 * f_XY(i, j) for i in x_set] for j in y_set])

var_X = V2(XY, lambda x, y: x)
var_Y = V2(XY, lambda x, y: y)
var_X, var_Y
执行结果
(4.444, 2.222)
协方差

协方差是X 和Y 的偏差乘积的期望值。显示两个随机变量的相关程度。它类似于数据部分中的协方差。

X 和 Y 的协方差
def cov(XY):
    x_set, y_set, f_XY = XY
    mean_X = E2(XY, lambda x, y: x)
    mean_Y = E2(XY, lambda x, y: y)
    return np.sum([[(i - mean_X) * (j - mean_Y) * f_XY(i, j) for i in x_set] for j in y_set])

cov_XY = cov(XY)
cov_XY
执行结果
2.222
相关系数

最后是相关系数。这也和数据部分的相关系数一样,是用协方差除以X和Y的标准差得到的。

相关系数
def corr(XY):
    cov_xy = cov(XY)
    var_x = V2(XY, lambda x, y: x)
    var_y = V2(XY, lambda x, y: y)

    return cov_xy / np.sqrt(var_x * var_y)

corr(XY)
执行结果
0.707

Y 是骰子 A 的结果,X 是骰子 A 和 B 的结果相加的结果,所以两个随机变量之间存在相关性。相关系数为0.707,因此您可以看到它显示出很高的相关性。

综上所述

这是概率部分的前半部分。在本文中,我描述了推论统计、概率模型概述以及一维和二维离散随机变量。

如果我们拥有的数据与我们的目的所需的总数据不同,它是从总体中抽取的样本,是从有限数量的试验中产生的实现的集合。如果我们能知道无限次试验(所有数据)得到的概率分布,就可以达到我们的目的。

作为实现目标的一种方法,我们了解到概率模型有助于从手头的数据中尽可能准确地了解所有数据的属性,以及定量地了解手头数据对所有数据的模糊性。我打电话给。另外可以看出,随着数据的增加(更接近于无限试验结果),从数据(有限试验结果)中得到的统计值收敛到将数据视为随机变量时的统计值. 我明白了。

就个人而言,这是一个很好的机会来梳理一下我只是模糊理解的概率模型与描述性统计和推理统计之间的关系,但是我在这方面的实践经验很少,所以我可能错了。有什么意见,请指出!感谢您阅读到最后! !

在下一期中,我将描述典型的概率分布和连续随机变量。

原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308623566.html