- 2025-01-14
-
回复了主题帖:
《深度学习的数学——使用Python语言》统计学
本帖最后由 eew_gleddk 于 2025-1-14 01:06 编辑
eew_gleddk 发表于 2025-1-14 01:03 书中是这样讲述的:t检验是一种参数检验,这意味着我们需要对数据及其分布做一定的假设,假设数据是独立 ...
U检验(也叫曼-惠特尼 U 检验,Mann-Whitney U test)是一种非参数统计检验方法,用于比较两个独立样本的分布差异,特别是在数据不满足正态分布假设时,提供一种有效的替代方法。理解 U 检验作为“非参检验”,可以从以下几个方面入手:
1. 什么是非参数检验?
非参数检验是指在进行统计检验时,不依赖于数据的分布假设(例如不要求数据服从正态分布)。与之对应的,是参数检验(如 t 检验),这些方法通常要求数据符合某些特定的分布假设(如正态分布)。
非参数检验主要用于处理以下两种情况:
数据的分布不明确或不符合正态分布。
数据类型是顺序等级数据(Ordinal Data)或者名义数据(Nominal Data),而非连续数据。
2. U 检验的工作原理:
Mann-Whitney U 检验通过比较两个独立样本的排名顺序,来检验它们是否来自相同的分布,而不关心具体的分布类型或参数。其核心是利用所有数据点的排名来计算一个 U 统计量,然后判断是否存在显著差异。
U 检验的基本步骤如下:
将两个样本的数据合并并按升序排列。
为每个数据点分配一个排名。
计算两个样本的排名和,然后计算 U 统计量。
根据 U 值来判断两个样本是否有显著差异。
3. 为什么 U 检验是非参数检验?
不依赖分布假设:U 检验没有要求数据符合正态分布,因此不依赖于数据的特定分布形态。
基于秩次:U 检验基于数据的秩次(排名),而不是数据的具体数值。通过比较排名差异,避免了对数据分布的要求。
适用范围广:即使数据是非正态分布,或者是有序的类别数据,U 检验依然可以使用。
4. U 检验与 t 检验的区别:
t 检验是参数检验,它假设数据遵循正态分布,通常用于比较两个独立样本的均值差异。
U 检验则是非参数检验,不需要假设数据的分布。它用于检验两个独立样本是否来自相同的分布。
5. 使用场景:
U 检验适用于:
比较两组独立样本的差异,但数据不符合正态分布。
样本量较小,或者数据为有序类别(如调查问卷中的评级数据)。
t 检验则适用于:
两组数据满足正态分布,可以进行均值比较。
6. U 检验的优缺点:
优点:
不要求数据符合正态分布,适用于各种分布的数据。
可以处理顺序数据,适用范围广。
缺点:
相较于 t 检验,U 检验的统计效能可能较低,特别是在样本量较大且数据满足正态分布时。
总结:
U 检验是一种非参数检验,因为它不依赖于数据的分布假设(如正态分布),而是通过比较数据的秩次来判断两个独立样本是否有显著差异。它适用于无法假设数据符合正态分布的情况,特别是在样本量较小或数据为有序数据时非常有用。
(GPT生成)
-
回复了主题帖:
《深度学习的数学——使用Python语言》统计学
Jacktang 发表于 2025-1-11 09:42
U检验是一种非参检验,怎么理解,与正态分布没有关系?
书中是这样讲述的:t检验是一种参数检验,这意味着我们需要对数据及其分布做一定的假设,假设数据是独立同分布且服从正态分布。
非参检验不用对数据的内在分布进行假设。U检验作为一种非参检验,用于判断两组数据是否来自相同的总体分布,U检验并不依赖于数据的取值,而是利用了数据的排序信息。
我的理解是:这里的参数是指一些统计量比如均值,方差,而t检验会用到这些信息所以称为参数检验,正态分布的数据是对称的,统计量不会有太大的差异所以要假设是正态分布。
U检验是利用数据的排序信息去检验所以统计量的变化对其影响很小,所以不需要对分布进行假设,所以称为非参检验。无论是不是正态分布都可以用U检验。
(个人理解不一定准确)
- 2025-01-10
-
回复了主题帖:
《深度学习的数学——使用Python语言》概率论
-
发表了主题帖:
《深度学习的数学——使用Python语言》统计学
本帖最后由 eew_gleddk 于 2025-1-10 02:08 编辑
#《深度学习的数学——使用Python语言》统计学
# 概述
本章有六个小节分别是:
- 数据类型
- 描述性统计量
- 分位数和箱型图
- 缺失数据
- 相关性
- 假设检验
本章内容对应在深度学习中是对数据集的一些描述和处理。首先告诉我们数据都有哪些类型,怎么划分这些数据类型,讲解了一些常见的描述性统计量,可以让我们更好的理解数据的整体情况。还介绍了分位数和箱型图实现数据的可视化。
对于缺失值的处理也是十分重要,缺失数据章节告诉我们要怎么处理缺失值,接着讨论样本的相关性,最后介绍了两种假设检验的方法,了解p值的含义。
总的来说,对数据集的理解和预处理对后续的训练有着很重要的作用,所以我们要提前用合适的方法把数据集处理好,然后再进行接下来的训练。
# 数据类型
数据有四种类型:定类数据,定序数据,定距数据,定比数据。
在深度学习中需要对定类数据进行处理,需要把他们转换为定距数据,称为**独热编码**。
本质上就是将定类数据赋予数学含义,便于深度学习提取特征。比如有三个类别,单个定类变量被编码为一个三维向量,其中每一维对应一种颜色。
红色 ->(1 0 0)
绿色 ->(0 1 0)
蓝色 ->( 0 0 1)
# 描述性统计量
对于数据我们首先要根据他的一些统计量去了解它,面对一个新数据集,如果没有先了解他就进行建模计算,就相当于买二手车不检查车况直接成交(书籍中的比喻)。
统计量有很多种,本书主要讲解了均值中位数还有一些衡量变化的统计量。
均值中常用的是算术平均,但是还有几何平均和调和平均,他们都有适合的场景。中位数可以把数据集分为两半,需要和均值互相配合使用。
最常见衡量变化的统计量就是方差,还有其他的描述变化的统计量,比如离差。离差是计算数据值与均值的平均数,离差是反应单个数据和均值的差异,
下面的公式为平均离差的计算公式
当用平方替代绝对值,就是方差的计算公式,如果将前面的n替换为(n-1)则称为无偏方差,在数据量较小时,有偏和无偏方差会有差异,当数据量逐渐增大,他们的差别会越来越小。下面时当数据量逐渐增大后,有偏和无偏方差之间的差异曲线。所以在大数据量的深度学习领域,采用有偏和无偏方差的区别微乎其微。
还有一个需要讨论的用于衡量变化的指标,标准误(Stand Error, SE).根据标准差计算标准误的公式很简单。
使用标准差是为了了解样本围绕均值的情况,而标准误是为了衡量样本均值对总体均值的估计精度。标准误和中心极限定理有关,也与大数定理有关。
在深度学习中,我们用标准差描述训练集的特征。在训练和测试模型时我们可以对模型输出的某些指标求平均(比如准确率),我们除了输出均值还可以输出标准误。
总的来说,标准误是为了衡量样本的均值和总体均值之间差异的统计量。
# 分位数和箱型图
分位数用于将数据划分到固定大小的分组中,箱型图的可以将数据集的多个特征展现。
我们通过一组数据理解分位数和箱型图。我们通过模拟得到一组考试数据,计算分位数并标注在直方图中。
然后用箱型图画出三次的考试数据。
# 缺失数据
缺失值有特殊的标记方法,少量的缺失值不影响,但太多缺失值就需要我们额外处理,可以通过替换描述性统计量解决。
在Numpy中我们可以通过np.isnan来判断是否有缺失值。
如果数据集是带标签的,就应该对每个类别单独计算均值和中位数。
# 相关性
相关性检验数据集是否有关联,本书学习两种相关系数,皮尔森相关性和斯皮尔曼相关性
皮尔森相关系数公式如下,它包含两个特征的均值及其乘积的均值。
我们生成三组数据
~~~
x = np.linspace(0,1,N) + (np.random.random(N)-0.5)
y = np.random.random(N)*x
z = -0.1*np.random.random(N)*x
~~~
第一幅图给出这三个特征的折线图,展示他们之间是如何互相跟踪的,,第二幅图展示了他们之间的两两配对的散点图。
计算他们之间的皮尔森系数
| 1. | 0.68285166 | -0.85047468 |
| ------------ | ------------ | ------------ |
| 0.68285166 | 1. | -0.56536104 |
| -0.85047468 | -0.56536104 | 1. |
斯皮尔曼相关系数是基于特征取值的次序进行计算的。得到各个元素的次序后,斯皮尔曼相关系数可以定义为
其中d表示两个数据集中对应元素的差值。
两个相关系数的区别:
~~~
a = np.linspace(-20,20,1000)
b = 1.0 / (1.0 + np.exp(-a))
print(pearson(a,b))
print(spearman(a,b))
~~~
结果是
> 0.9053277293366915
1.0
在这个函数中,斯皮尔曼相关性捕捉到了参数之间的非线性关系,而皮尔森只是暗示这种可能性。在传统的机器学习算法中进行特征工程,斯皮尔曼能更好的帮我们判断哪些特征应该丢弃。
# 假设检验
假设检验是用于判断两组数据是否来自相同的分布,在深度学习中常见的有T检验(参数检验)和U检验(非参数检验)。
两组学生通过不同的学习方法学习,现在我们想知道两组学生的考试分数是否有显著的差异,我们需要对某种假设进行检验。下图是数据的箱型图绘制。
我们会有两个假设,一个原假设(两组数据来自同一个分布),一个备择假设(两组数据来自同不同分布)
我们是对均值提出假设,所以原假设表达的是两组数据的总体分布的均值相同。由于不知道真正的总体均值所以用样本均值和标准差代替。
总之我们要记住,我们不是以原假设为真作为结论,而是我们是否有充足的理由拒绝或接受原假设作为结论。
t检验使用t统计量检验,t检验是一种参数检验,我们需要对数据及其分布做一定假设。就t检验来说,我们假设数据是独立同分布且服从正态分布。如果数据不服从正态分布我们就要进行非参检验,非参检验不用对数据内在分布进行假设。U检验是一种非参检验,U检验利用数据的排序信息,他的原假设是从第一组数据随机取样的结果大于第二组随机取样结果的概率等于0.5.
所有实验代码上传附件。
- 2024-12-31
-
回复了主题帖:
《深度学习的数学——使用Python语言》概率论
liaofengheng 发表于 2024-12-29 18:11
楼主好,这本书是国内作者的还是翻译的,容易读下去吗?
这本书是翻译的,个人感觉这本书的重点还是偏一些理论知识,只不过,讲解不会像教材里那么深,点到为止,需要有一点基础,他有些地方写的比较简略。如果是完全没有接触过相关知识,我感觉可能就不是太适合,
如果是零基础的话,我推荐鸢尾花系列的图书,这个系列是比较详细的。github会有开源资料,可以看看。
- 2024-12-29
-
发表了主题帖:
《深度学习的数学——使用Python语言》概率论
本帖最后由 eew_gleddk 于 2024-12-29 15:38 编辑
# 《深度学习的数学——使用Python语言》概率论
# 概率论
## 基础概念
### 样本空间和事件
1. **样本空间(Sample Space)**
样本空间是指一个实验所有可能结果的集合。它包含了实验中所有的基本事件。
举例:
扔一枚硬币,样本空间为 S={正面,反面}。
扔两颗骰子,样本空间为 S = { (1,1), (1,2), . . ., (6,6) },包含了所有可能的结果。
2. **事件(Event)**
事件是样本空间中的一个子集,表示实验的某一特定结果或某些特定结果的组合。事件可以是基本事件(单一结果)或复合事件(多个结果的组合)。
举例:
扔一枚硬币,事件 A 可以表示硬币出现正面,即 A={正面}。
扔两颗骰子,事件 B 可以表示和为 7 的事件,即 B={(1,6),(2,5),(3,4),(4,3),(5,2),(6,1)}。
3. **关系与区分**
样本空间:包含所有可能的结果。
事件:样本空间的一个子集,可能是一个或多个结果的集合。
每次实验的结果属于某个事件,而这个事件的结果属于样本空间中的某个元素。
### 随机变量
1.**随机变量的定义**
随机变量 是一个从样本空间 S 到实数集合 R 的函数,通常用 X 或Y 表示。
给定一个实验,其结果 \omega \in S,随机变量 X 会根据某种规则将每个实验结果 \omega 映射到一个数值X(\omega) \in R
2.**举例**
扔两枚硬币,设随机变量 X 表示“正面朝上”的硬币数量。则 X 的可能取值是 {0, 1, 2},对应的概率分别是:
P(X = 0) = 1/4
P(X = 1) = 1/2
P(X = 2) = 1/4
### 人类不擅长处理概率问题
#### 蒙提-霍尔困境
蒙提-霍尔困境是一个著名的概率论问题,源自美国的电视游戏节目。在该节目中,参赛者面临三个封闭的门,背后有一个奖品和两个空的奖品。参赛者需要通过选择一个门来决定自己的奖励。
**问题描述**
1. 参赛者首先选择一个门。
2. 主持人知道各门后面的奖品,他会打开一个没有汽车的门。
3. 主持人给参赛者一个机会,让他们选择是否保持原来的选择,或换到另一个未打开的门。
4. 如果参赛者选择了汽车所在的门,就赢得汽车;如果选中了空门,就输掉奖品。
***在主持人揭示了一扇门后,参赛者是否要更改最初的选择?***
正确答案是应该选择另一扇门,因为换的话有2/3的概率获得汽车,而不换只有1/3的概率获得汽车。
是不是比较反直觉?直觉是不是觉得不应该换?
假设我们有三个门,分别标记为 A、B 和 C。假设汽车在其中一个门后,其他两个门后是山羊。
参赛者最初选择的门(假设是门 A)后有汽车的概率是 1/3,有山羊的概率是 2/3。
主持人会打开一个没有汽车的门。如果参赛者最初选择了门 A 并且门 A 后面是汽车(概率为 1/3),主持人会打开另外两扇门中的一扇,剩下的那个门是山羊。
如果参赛者最初选择了门 A 并且门 A 后面是山羊(概率为2/3),主持人将揭示另一个是山羊的门,剩下的那个门必定有汽车。
**分析**:
- **保持选择**:假设参赛者保持最初选择的门(门 A)。那么,赢得汽车的概率仍然是最初选择时的 1/3。
- **如果更换门**:如果参赛者更换门,那么在他们最初选择的是山羊的情况下,他们必定会选择到汽车。因为主持人已经排除了一个山羊门,所以换门后,参赛者赢得汽车的概率是 2/3。
如果我们第一次选错,在揭示另一个错误选项后,我们换门必定会获得汽车,我们第一次选错的概率是2/3,所以换门获胜的概率是2/3.
用python模拟一千次的结果,当次数逐渐增加,概率逐渐趋近1/3和2/3.
#### 是否患有癌症
**问题**:40岁女性在乳房X光检查中结果为阳性时患有乳腺癌概率。
我们知道以下三个事实:
(1)40岁女性患乳腺癌的概率为0.8%。
(2)当女性确实患有乳腺癌时,X光检查能够正确显示为阳性的概率为90%。
(3)当女性没有乳腺癌时,X光检查错误地显示为阳性的概率为7%。
假设有1000名女性
根据(1)可以知道大概有8个人患有乳腺癌。
根据(2)可知大概有7位患者检查为阳性。
根据(3)可知大概有69位正常人检查为阳性。
所以总共有7+69=76人会的到阳性结果,其中7个为真阳性。
所以在乳房X光检查中结果为阳性时患有乳腺癌概率为7/76=0.092约为9%。
但是让医生去估计概率时,他们所给出的答案的中位数是70%,并且有超过1/3的回答是90%。医生的错误回答是因为没有考虑40岁女性整体患病率不高这个因素。后面还会用贝叶斯理论证明。
**根据上面两个例子可以看出来,概率是很反直觉的一门学科。**
## 概率法则
### 事件的概率
事件的概率是一个衡量某个事件发生可能性的数值,通常用数学方法来表示。事件的概率值通常在0到1之间,0表示事件不可能发生,1表示事件一定会发生。
### 加法法则
如果两个事件是互斥的(这两个事件不能同时发生),那么它们的联合概率是各自概率的和。
如果事件A和事件B是互斥的,那么:
P(A∪B)=P(A)+P(B)
**例子:**
掷一个六面骰子,掷出“1”或“2”的概率是?
事件A表示掷出“1”,事件B表示掷出“2”。则概率为:
P(A∪B)=P(A)+P(B)=1/6 + 1/6 =1/3
### 乘法法则
如果两个事件A和B是独立的(一个事件的发生不影响另一个事件的发生),那么它们同时发生的概率是各自概率的乘积。公式为:
P(A∩B)=P(A)×P(B)
**例子**:
掷两次公平的六面骰子,第一次掷到“3”,第二次掷到“5”的概率是?
事件A表示第一次掷到“3”,事件B表示第二次掷到“5”。则概率为:
P(A∩B)=P(A)×P(B)=1/6*1/6=1/36
### 加法法则修正版
如果两个事件不是互斥的,则加法法则需要考虑到它们的交集部分(它们同时发生的概率),避免重复计算。公式为:
P(A∪B)=P(A)+P(B)−P(A∩B)
**例子**
假设从一副扑克牌中抽一张牌,这张牌是红色牌或者数字牌的概率:
事件A表示抽到红色牌,事件B表示抽到一张数字牌(2到10)。
P(A∪B)=P(A)+P(B)−P(A∩B)
如果有52张牌,其中26张是红色牌,9张是红色的数字牌,那么:
P(A) =26/52, P(B) =36/52, P(A∩B) = 9/52
因此,事件A或事件B发生的概率是:
P(A∪B)= 26/52 + 36/52 - 9/52 = 11/13
### 生日难题
**问题**:一个房间里平均需要多少人,才能使他们中有两个人的生日在同一天的概率大于50%?
假设一年有365天(忽略闰年),每个人的生日是独立的,且均匀分布在365天之内。
第一人的生日可以是任意一天,因此没有限制。
第二人的生日与第一个人不同的概率是364/365
第三人的生日与前两个人都不同的概率是 363/365
以此类推,第n 个人的生日与前 n-1 个人都不同的概率是365-(n-1)/365
因此,所有n 个人的生日都不同的概率是:
P(所有人生日不同)= 365/365× 364/365× 363/365×⋯× 365−(n−1)/365
对于 n=23,我们计算:
P(所有人生日不同)≈0.4927
因此,至少两人生日相同的概率约为:
P(至少两人生日相同)=1−0.4927≈0.5073
这意味着在23个人的群体中,至少有两个人生日相同的概率大约为 50.73%。
用程序模拟同一天出生的概率与房间人数的关系。
### 条件概率
**条件概率**是指在已知某个事件已经发生的前提下,另一个事件发生的概率。它表示的是在一个事件发生的条件下,另一个事件发生的可能性。条件概率通常表示为 P(A∣B),在事件B已经发生的条件下,事件A发生的概率。
条件概率的公式定义为:
P(A|B) = P(A ∩ B)/P(B)
**例子:**
假设一个班级有10个学生,其中7个是男生,3个是女生。假设其中有4个男生和2个女生是学过编程的。计算在已知某个学生是男生的情况下,他学过编程的概率。
事件A:学生学过编程。事件B:学生是男生。
P(A∣B)=P(A∩B)/ P(B) =P(学过编程的男生人数)/P(男生人数)= 4/7
**注意:P(A∣B) != P(B∣A)**
### 全概率公式
假设事件 B_1, B_2, ..., B_n 是一个完整的事件分划B_1, B_2, ..., B_n 互不相交,且它们的并集为整个样本空间,并且对于每个 i ,事件 B_i的概率 P(B_i) > 0 。
那么,任何事件 A 的概率可以表示为:
P(A) = P(A|B_1)P(B_1) + P(A|B_2)P(B_2) + ... + P(A|B_n)P(B_n)
或者更简洁地写作:
$$
P(A) = \sum_{i=1}^{n} P(A|B_i)P(B_i)
$$
**例子:**
假设有一个袋子,其中有三种颜色的球:红球、绿球和蓝球。我们定义以下事件:
- \( A \):从袋子中随机取出一个球是红色的。
- \( B_1 \):选择的是包含 50 个红球的袋子。
- \( B_2 \):选择的是包含 30 个绿球的袋子。
- \( B_3 \):选择的是包含 20 个蓝球的袋子。
假设选择袋子 B_1 的概率是 \( P(B_1) = 0.4 \),选择袋子 \( B_2 \) 的概率是 \( P(B_2) = 0.3 \),选择袋子 \( B_3 \) 的概率是 \( P(B_3) = 0.3 \)。
现在我们要求事件计算事件 A 的概率,我们可以使用全概率公式:
P(A) = P(A|B_1)P(B_1) + P(A|B_2)P(B_2) + P(A|B_3)P(B_3)
P(A|B_1) = 1 (因为袋子 \( B_1 \) 只包含红球)。
P(A|B_2) = 0 (袋子 \( B_2 \) 没有红球)。
P(A|B_3) = 0 (袋子 \( B_3 \) 也没有红球)。
因此:
P(A) = 1 * 0.4 + 0 * 0.3 + 0 * 0.3 = 0.4
所以,取出一个红球的概率是 0.4。
## 联合概率和边缘概率
### 联合概率表
联合概率表是一个二维表格,通常用来表示两个或多个离散随机变量的联合分布。联合概率表的每个单元格都表示对应随机变量组合的概率。
**定义**:
对于两个离散随机变量 X 和 Y,联合概率 P(X=x,Y=y) 表示 X 取值为x 且 Y 取值为 y 的事件发生的概率。
| X\Y | Y = 正面 | Y=反面 |
| ------------ | ------------ | ------------ |
| X=1 | 1/12 | 1/12 |
| X=2 | 1/12 | 1/12 |
| X=3 | 1/12 | 1/12 |
| X=4 | 1/12 | 1/12 |
| X=5 | 1/12 | 1/12 |
| X=6 | 1/12 | 1/12 |
联合概率表的计算过程:
掷骰子的概率 P(X = x) = 1/6,每个骰子结果出现的概率相等。
掷硬币的概率 P(Y = 正面) = 1/2和 P(Y = 反面) =1/2
因为掷骰子和掷硬币是独立事件,联合概率是各自概率的乘积:
P(X = x, Y = y) = P(X = x) * P(Y = y)
P(X=x,Y=y)=P(X=x)*P(Y=y)
例如, P(X = 1, Y = 正面) = 1/6 * 1/2 = 1/12
### 概率链式法则
**基本概念**
链式法则的核心思想是:
对于一组随机变量 \( X_1, X_2, ..., X_n \),联合概率 \( P(X_1, X_2,..., X_n \) 可以通过一系列的条件概率逐步分解成多个因子。
**链式法则的公式**
对于 \( n \) 个随机变量 \( X_1, X_2, ..., X_n \),其联合概率可以表示为:
$$
P(X_1, X_2, ..., X_n) = P(X_1) * P(X_2 | X_1) * P(X_3 | X_1, X_2) * ... * P(X_n | X_1, X_2, ..., X_{n-1})
$$
这条公式说明,联合概率可以从一个变量的边际概率开始,然后逐步条件化以涉及更多的变量。
**例子**
两个随机变量的链式法则
假设有两个随机变量 \( X \) 和 \( Y \),链式法则可以表示为:
P(X, Y) = P(X) * P(Y | X)
- \( P(X) \):是 \( X \) 的边际概率。
- \( P(Y | X) \):是在已知 \( X \) 的情况下 \( Y \) 的条件概率。
三个随机变量的链式法则
假设有三个随机变量 \( X_1, X_2, X_3 \),链式法则则为:
P(X_1, X_2, X_3) = P(X_1) * P(X_2 | X_1) * P(X_3 | X_1, X_2)
- \( P(X_1) \) 是 \( X_1 \) 的边际概率。
- \( P(X_2 | X_1) \) 是在已知 \( X_1 \) 的情况下 \( X_2 \) 的条件概率。
- \( P(X_3 | X_1, X_2) \) 是在已知 \( X_1 \) 和 \( X_2 \) 的情况下 \( X_3 \) 的条件概率。
通过这种分解,我们可以一步步计算复杂的联合概率。
# 概率论进阶
## 概率分布
### 直方图与概率
直方图是一种用来表示数据分布的图形。它将数据集分成若干个连续的区间,然后显示每个区间内数据的频数或频率。
横轴:代表数据的取值范围,通常分为若干个区间。
纵轴:表示每个区间内数据出现的频数或频率。
通过直方图,我们可以大致看到数据的集中趋势、分散程度以及分布形态。
我们用直方图来描述一张图片的像素分布特征,其中行人上楼梯的图片命名为ascent,小浣熊的图片命名为face。
这是上面两张图的概率直方图,可以看到两张图有明显差异。
### 离散性概率分布
离散概率分布用于描述离散型随机变量的概率分布。离散型随机变量的取值是可数的,通常是有限个或可列的无限个值。每个取值都有一个与之相关的概率,这些概率的总和为 1。
离散概率分布通过列出每个可能的结果及其对应的概率,来描述随机变量的行为。常见的离散概率分布包括伯努利分布、二项分布、泊松分布、几何分布等。
#### 二项分布
二项分布是一种离散概率分布,用于描述在固定次数的独立试验中,每次试验的结果只有两种可能(通常称为“成功”和“失败”)时,成功次数的概率分布。。
假设我们进行 n 次独立的试验,每次试验的成功概率为 p,则二项分布给出了k次成功的概率(0 ≤ k ≤ n)。该概率的公式为:
$$
P(X = k) = \binom{n}{k} p^k (1 - p)^{n-k}
$$
#### 伯努利分布
伯努利分布是最简单的离散概率分布之一,它描述了一个二项试验(只有两种可能结果:成功或失败)的单次试验结果。
伯努利分布用于描述一个随机变量 X,其值只有两种可能:0 或 1,表示“失败”或“成功”。具体来说,如果 X=1 表示成功,则 X = 0 表示失败。
成功的概率为 p(0≤p≤1)。
失败的概率为 1 - p。
#### 泊松分布
泊松分布是一种离散概率分布,用于描述在单位时间或单位面积等范围内,某个事件发生的次数,且这些事件发生的概率是独立且均匀分布的。
泊松分布广泛应用于描述随机事件发生的次数,特别是当这些事件发生的平均频率已知时,如交通事故、电话呼叫、系统故障等。
$$
P(X=k)=\frac{\lambda^{k} e^{-\lambda}}{k!}
$$
#### FLDR算法
FLDR(Fast Loaded Dice Roller)算法的核心思想是将离散概率分布转化为一个累积概率表,并通过此表进行有效的采样。其主要优势在于,算法能够在 O(1) 的时间复杂度内进行采样,从而比直接使用传统的方式(如重复的概率计算)更为高效。
FLDR算法使用分为两步:
首先定义采样的分布,这属于预处理,对任何分布只需要做一次即可,然后就是对分布进行采样。
我们使用之前的小浣熊图片检验FLDR算法。下图是小浣熊图片灰度值分布(实线),与FLDR算法生成的分布的对比(虚线)
### 连续性概率分布
连续性概率分布是用于描述连续型随机变量的概率分布。与离散型随机变量不同,连续型随机变量的取值可以是一个区间内的任意实数,因此其取值的可能性是无限的。
对于连续型随机变量,其概率并不是指某一个具体取值的概率,而是指该随机变量落在某个区间内的概率。概率密度函数(PDF)是描述连续型随机变量概率分布的工具。
**几种常见的连续性概率分布**
### 中心极限定理
中心极限定理描述了大样本下样本均值的分布特性。无论原始数据的分布形式如何,只要样本容量足够大,样本均值的分布趋近于正态分布。
对于任意分布,如果对其采样得到一个有N个样本构成的样本集,则可以计算这个样本集的均值,然后重复这个过程多次,得到多个大小为N的样本集,其中每个样本集都有自己的均值,这些均值的分布趋近于正态分布。
下图是B(5,2)分布采样后的结果。
### 大数法则
大数法则描述了当独立同分布的随机变量数量增加时,样本均值与总体均值之间的关系。当样本容量趋于无穷大时,样本均值会几乎确定地趋近于总体均值。
下图展示为对均值为1的正态分布采样后,样本的均值关于样本量的变换曲线。,随着样本量增大,样本均值趋于总体均值。
## 贝叶斯定理
贝叶斯定理的公式为:
$$
P(A | B) = \frac{P(B | A) P(A)}{P(B)}
$$
各个符号的含义:
P(A∣B) 是后验概率,即在事件 B 发生的条件下,事件 A 发生的概率。
P(B∣A) 是似然度,即在事件 A 发生的情况下,事件 B 发生的概率。
P(A) 是先验概率,即事件 A 发生的初始概率,通常是我们在没有新证据时对 A 的估计。
P(B)是边际概率,即事件 B 发生的总概率,它可以通过全概率公式计算,表示所有可能情况下 B 发生的概率。
### 乳腺癌的例子
在是否患有癌症章节我们通过具体的例子进行计算,现在我们通过贝叶斯定理计算。
我们要求解的条件概率是:在乳房X光检查结果为阳性的情况下,40岁女性患乳腺癌的概率,记为 P(bc+∣+) ,bc+为患乳腺癌,+为阳性。
根据贝叶斯定理:
$$
P(bc+∣+)=\frac{P(+ |bc+)P(bc+)}{P(+)}
$$
其中,P(+) 是检查结果为阳性的总概率,可以通过全概率公式计算:
P(+) = P(+ |bc+) P(bc+) + P(+ |bc-) P(bc-)
其中, P(bc-) = 1 - P(bc+) 是没有乳腺癌的概率。
P(bc+∣+) = (0.9 x 0.008)/(0.9 x 0.008 + 0.07 x 0.992) ≈ 0.094
所以在乳房X光检查结果为阳性的情况下,40岁女性患乳腺癌的概率大约是 9%。
### 更新先验
如果一位女士拿到阳性结果,再换一家医院再做一次X光检验,并重新找一位医生解读,此时他患有乳腺癌的概率是多少呢?
在贝叶斯看来,此时需要用到第一次计算的 P(bc+∣+)作为新的先验概率 P(bc+)。
P(bc+∣+) = (P(+ |bc+)P(bc+))/P(+) = (0.9 x 0.094)/(0.9 x 0.094 + 0.07 x 0.906) ≈ 0.572
此时更有理由相信这位女士患有乳腺癌。
### 机器学习中的贝叶斯定理
在机器学习中,贝叶斯定理主要用于通过数据来更新我们的信念。它允许我们基于先验知识(先验概率)和观察到的数据(似然函数)来调整和计算后验概率。
**朴素贝叶斯分类器(Naive Bayes)**是贝叶斯定理在机器学习中的一种经典应用。它用于基于条件概率对样本进行分类,假设特征之间是独立的(这就是“朴素”的原因)。
假设有一个分类问题,目标是根据特征 \( X = (x_1, x_2, ..., x_n) \) 来预测类别 \( C \)。根据贝叶斯定理,类别 \( C \) 的后验概率为:
P(C | X) = (P(X | C) P(C))/P(X)
- \( P(C | X) \) 是类别 \( C \) 给定特征 \( X \) 的后验概率,表示样本属于类别 \( C \) 的概率。
- \( P(X | C) \) 是似然概率,表示在类别 \( C \) 下,样本特征 \( X \) 出现的概率。
- \( P(C) \) 是类别 \( C \) 的先验概率,表示在没有观察到特征 \( X \) 时,样本属于类别 \( C \) 的概率。
- \( P(X) \) 是边际概率,表示样本特征 \( X \) 出现的总概率(通常可以忽略,因为它对于所有类别都是常数)。
**假设特征条件独立**
朴素贝叶斯的关键假设是“特征条件独立性假设”,即假设给定类别 \( C \) 后,特征 \( x_1, x_2, ..., x_n \) 之间相互独立。这样,似然 \( P(X | C) \) 可以简化为:
P(X | C) = P(x_1 | C) P(x_2 | C) * P(x_n | C)
因此,后验概率 \( P(C | X) \) 可以表示为:
$$
P(C | X) ∝ P(C) ∏_{i=1}^n P(x_i | C)
$$
这使得计算变得非常简单,因为我们只需要计算每个特征 \( x_i \) 在给定类别 \( C \) 下的条件概率,然后将它们相乘,最后选择使得后验概率最大的类别作为预测结果。
# 后记
本来这篇文章应该上个周末发布的,一直拖到现在才大概完成,28号先发布一个草稿版,争取在30号前把剩余内容补充完整。
中间有一次写好一大半,但是没有保存好,刷新之后只能从头开始X﹏X。这两周事情也有点多,慢慢就拖到现在。因为写的时候公式在预览模式下不正常,不知道正式发布后会怎么样,所以先发布一个草稿版,看看效果,还有一些插图,代码也没有补充。
感觉每次的写的内容有点多,可有有点脱离阅读分享这个主题了,下次更新还是着重谈谈感受和代码内容,对书籍的一些概念内容就不多做展述了,不然篇幅过长,而且花费时间也会过多。
目前书籍已经读到第六章,读后分享的进度差太多,下次更新做些调整,慢慢赶上进度。
文中所有代码在附件中可查看。
- 2024-12-17
-
发表了主题帖:
《深度学习的数学——使用Python语言》①基础环境搭建
# 《深度学习的数学——使用Python语言》①基础环境搭建
[**① 环境搭建和概率论基础**](https://bbs.eeworld.com.cn/thread-1302019-1-1.html)
感谢eeworld提供这次机会。这是我第一次入围类似的活动,收到书的时候还是很激动的。以至于在上班路上就读完了第一章。(拖到现在才写完第一篇 😣)
***书籍样式***
目前收到书已经一个星期了,用了前面三天的时间把前两章读完。书籍中的示例代码是在Linux系统下运行,所以打算趁这次机会熟悉Linux,这次就在Linux系统下进行学习。
后面的时间就一直在配置Linux系统的环境,把我的笔记本换成Ubuntu系统进行使用(以前装过双系统,还有虚拟机,但是有windows环境的情况下,还是会一直用windows,这次为了逼自己用起来,索性直接换到Linux系统进行使用)。一直拖到到周末准备工作才算彻底完成。
接下来进入正文。
# 书籍感悟
收到书后,发现他没有想象中的厚(潜意识里会觉得书的薄厚和书本包含的内容是有关系的)。入围前看的介绍目录总共会有十一章,介绍页面的图片看起来也觉得实书会比较厚,所以下意识里会觉得这是一本很有份量的书(~~果然图片仅供参考~~)。
***介绍页书籍样式***
阅读之后,感觉内容还是很有份量的。作者对书的定位还是挺准确的,这是一本适合对python有一定基础,且有一定的数学基础的人学习深度学习的参考书。他没有深奥的公式推导,对于相关数学原理他尽量使用简单的公式并辅以代码仿真。在刚开始学习的阶段,还是非常友好的。本书更侧重于培养我们的实际动手能力。
第一章是环境搭建。虽然书籍的代码是运行在Linux系统下,但是作者也贴心的介绍了Windows和macOS下的环境配置步骤。
后续就是介绍需要安装的几个库的基本作用还有展示了一些用法。本章中主要安装以下几个库:
- **numpy** : 对数组操作的库。
- **scipy** :拥有大量的函数库。
- **matplotlib** : 绘图库。
- **scikit-learn** : 神经网络模型相关库。
第二章是概率论基础,主要介绍一些概率论中的基本概念和一些法则,最后还介绍了联合概率和边缘概率的相关知识。
# 实验过程
## 第一章实验
第一章的实验主要是对安装的几个库的介绍
### 实验一:Numpy的使用
首先导入模块,验证版本信息。
```
>>>import numpy as np
>>> np.__version__
'1.26.4'
```
numpy后面部分的实验包含怎么定义数组,数据类型,二维数组,全0和全1数组,高级索引以及读写磁盘几个部分。示例代码都是运行在命令行中。
#### 定义数组
在进行数据运算的时候,使用数组的效率会很高,所以可以用np.array函数把列表转换为数组,a还包含size,shape,dtype属性。shape有两个元素分别对应行和列。
```
>>> a=np.array([1,2,3,4])
>>> a.size
4
>>> a.shape
(4,)
>>> a.dtype
dtype('int32')
>>> b=np.array([[1,2,3,4],[5,6,7,8]])
>>> print(b)
[[1 2 3 4]
[5 6 7 8]]
>>> b.shape
(2, 4)
```
#### 数据类型
numpy底层是用c语言实现的,所以numpy支持c语言中的所有数据类型,我们既可以让numpy自动选择数据类型,也可以显示指定。
```
>>> a=np.array([1,2,3,4],dtype="uint8")
>>> a.dtype
dtype('uint8')
>>> a=np.array([1,2,3,4],dtype="int16")
>>> a=np.array([1,2,3,4],dtype="uint32")
>>> b=np.array([1,2,3,4.0])
>>> b.dtype
dtype('float64')
>>> b=np.array([1,2,3,4.0],dtype="float32")
>>> c=np.array([111,222,333,444],dtype="uint8")
>>> c
array([111, 222, 77, 188], dtype=uint8)
```
#### 二维数组
把列表转换为数组得到一维向量,把列表的列表转换为数组得到二维向量。
```
>>> d=np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> d.shape
(3, 3)
>>> d.size
9
>>> d
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
```
#### 全0和全1数组
numpy有两个有用的初始化函数:np.zeros和np.ones。可以指定数组大小,并置为全0或全1。
```
>>> a=np.zeros((3,4),dtype="uint32")
>>> a[0,3] = 42
>>> a[1,1] = 66
>>> a
array([[ 0, 0, 0, 42],
[ 0, 66, 0, 0],
[ 0, 0, 0, 0]], dtype=uint32)
>>> b=11*np.ones((3,1))
>>> b
array([[11.],
[11.],
[11.]])
```
#### 高级索引
numpy支持简单索引也可以进行切片索引,用法和python中一样。
```
>>> a=np.arange(12).reshape((3,4))
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> a[1]
array([4, 5, 6, 7])
>>> a[1]=[44,55,66,77]
>>> a
array([[ 0, 1, 2, 3],
[44, 55, 66, 77],
[ 8, 9, 10, 11]])
>>> a=np.arange(12).reshape((3,4))
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> a[1]
array([4, 5, 6, 7])
>>> a[1]=[44,55,66,77]
>>> a
array([[ 0, 1, 2, 3],
[44, 55, 66, 77],
[ 8, 9, 10, 11]])
>>> a[:2]
array([[ 0, 1, 2, 3],
[44, 55, 66, 77]])
>>> a[:2,:]
array([[ 0, 1, 2, 3],
[44, 55, 66, 77]])
>>> a[:2,:3]
array([[ 0, 1, 2],
[44, 55, 66]])
>>> b=np.arange(12)
>>> b
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>> b[::2]
array([ 0, 2, 4, 6, 8, 10])
>>> b[::3]
array([0, 3, 6, 9])
>>> b[::-1]
array([11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
>>> a=np.arange(24).reshape((4,3,2))
>>> a
array([[[ 0, 1],
[ 2, 3],
[ 4, 5]],
[[ 6, 7],
[ 8, 9],
[10, 11]],
[[12, 13],
[14, 15],
[16, 17]],
[[18, 19],
[20, 21],
[22, 23]]])
>>> a[1,:,:]=[[11,22],[33,44],[55,66]]
>>> a
array([[[ 0, 1],
[ 2, 3],
[ 4, 5]],
[[11, 22],
[33, 44],
[55, 66]],
[[12, 13],
[14, 15],
[16, 17]],
[[18, 19],
[20, 21],
[22, 23]]])
>>> a[2,...]=[[99,99],[99,99],[99,99]]
>>> a
array([[[ 0, 1],
[ 2, 3],
[ 4, 5]],
[[11, 22],
[33, 44],
[55, 66]],
[[99, 99],
[99, 99],
[99, 99]],
[[18, 19],
[20, 21],
[22, 23]]])
```
#### 读写磁盘
numpy可以调用np.save把数据保存在本地也可以通过np.load从本地加载。
```
>>> a=np.random.randint(0,5,(3,4))
>>> a
array([[1, 2, 0, 4],
[1, 4, 0, 2],
[0, 0, 3, 2]])
>>> np.save("random.npy",a)
>>> b=np.load("random.npy")
>>> b
array([[1, 2, 0, 4],
[1, 4, 0, 2],
[0, 0, 3, 2]])
```
### 实验二:SciPy的使用
SciPy 是一个开源的 Python 库,旨在为科学计算提供高效的算法和数学工具。它建立在 NumPy 基础之上,扩展了许多高级功能,涉及的领域包括数值积分、优化、信号处理、线性代数、统计分析等。
scipy的只有一个简单的实验,关于t检验。
首先还是导入模块
```
>>> import numpy as np
>>> import scipy
>>> scipy.__version__
'1.14.1'
```
随机生成三个数组,并对他们进行t检验。a,b,c都是取自高斯曲线,他们只是均值和标准差不同。normal函数的前一个参数定义均值,后一个定义标准差。均值觉得曲线的对称中心,标准差决定的曲线的宽度。
其中a,b的均值一样,a,c的标准差一样。
```
>>> from scipy.stats import ttest_ind
>>> a=np.random.normal(0,1,1000)
>>> b=np.random.normal(0,0.5,1000)
>>> c=np.random.normal(0.1,1,1000)
>>> ttest_ind(a,b)
TtestResult(statistic=-0.46835586027423864, pvalue=0.6395812165361968, df=1998.0)
>>> ttest_ind(a,c)
TtestResult(statistic=-2.3566057547650168, pvalue=0.01853885989238996, df=1998.0)
```
### 实验三:matplotlib的使用
matplotlib是python中常用的画图库,可以绘制二维图像和三维图像。
#### 二维图像
```
>>> import numpy as np
>>> import matplotlib.pylab as plt
>>> x = np.random.random(100)
>>> plt.plot(x)
[]
>>> plt.show()
```
***二维图像绘制示例***
#### 三维图像
```
>>> import numpy as np
>>> import matplotlib.pylab as plt
>>> from mpl_toolkits.mplot3d import Axes3D
>>> x = np.random.random(20)
>>> y = np.random.random(20)
>>> z = np.random.random(20)
>>> fig=plt.figure()
>>> ax=fig.add_subplot(111,projection='3d')
>>> ax.scatter(x,y,z)
>>> plt.show()
```
***三维图像绘制示例***
### 实验四:scikit-learn的使用
这个实验用sklearn这个库构建了一个简单的神经网络模型。虽然本书侧重深度学习的数学知识但是用一两个简单的简单的模型更有助于我们理解。这里的实验是在py文件中运行。
```
import numpy as np
from sklearn.datasets import load_digits
from sklearn.neural_network import MLPClassifier
d=load_digits()
digits = d["data"]
labels = d["target"]
N=200
idx = np.argsort(np.random.random(len(labels)))
x_test,y_test=digits[idx[:N]],labels[idx[:N]]
x_train,y_train=digits[idx[N:]],labels[idx[N:]]
clf = MLPClassifier(hidden_layer_sizes=(128,))
clf.fit(x_train,y_train)
score= clf.score(x_test,y_test)
pred =clf.predict(x_test)
err = np.where((y_test!=pred))[0]
print("score:",score)
print("errors:")
print("actual:",y_test[err])
print("predicted:",pred[err])
```
运行结果
>score: 0.98
>errors:
>actual: [6 7 9 3]
>predicted: [5 8 3 8]
# 实验感悟
第一章的实验都是比较简单基础的,主要是熟悉书籍后续的操作环境。
# 后续计划
感觉这一章的篇幅有点长,所以第二章的实验部分就不在这篇更新了,留到下一章和第三章一起发布,正好他们都是概率论部分。争取在下周末前可以发布下一篇。(┬┬﹏┬┬)
(刚开始写博客,有需要改进的地方,佬们可以多提提意见)
- 2024-12-05
-
回复了主题帖:
读书活动入围名单: 《深度学习的数学——使用Python语言》
个人信息无误,确认可以完成阅读分享计划
- 2024-05-14
-
加入了学习《小梅哥FPGA入门到实践特训班全程高清实录(2019)》,观看 使用移位寄存器实现一行数据寄存
-
加入了学习《小梅哥FPGA入门到实践特训班全程高清实录(2019)》,观看 RAW数据流转换到RGB888图像数据原理分析