所谓机器学习和深度学习, 背后的逻辑都是数学, 因此数学基础在这个领域很是关键, 而统计学又是重中之重, 机器学习从某种意义上来讲就是一种统计学习。python
此次借着在Datawhale组织的几率统计专题学习的机会再从新温习一遍数学基础,很是感谢组织的此次学习机会。这一版块是整理几率统计的相关内容, 具体知识点参考了Datawhale的开源教程几率统计, 此次又是站在了大佬的肩膀上前行, 同时对其中的重点知识进行整理和补充, 而后进行了必要的代码实现。编程
今天是几率统计基础的第一篇文章, 咱们先从随机变量和随机事件开始,以前学习几率统计, 有些变量就迷迷糊糊的, 此次再温习一遍基础概念。首先会从几率统计的基本概念入手, 而后学习几率相关的知识, 接下来是古典概型, 而后就是条件几率和伟大的贝叶斯公式, 最后再来整理随机变量的相关知识。数组
大纲以下:app
随机事件(基本概念, 频率与几率, 古典概型, 条件几率, 全几率和贝叶斯)dom
随机变量(离散型及分布, 连续型及分布, 多维随机变量及分布, 数字特征)机器学习
随机事件是几率论中最重要的基础概念之一, 可是咱们真的理解随机事件吗? 哈哈, 不必定, 不信?你能够先尝试解释一下什么是随机事件,若是你告诉我说:所谓随机事件, 就是随机的那些事件, 那么恭喜你, 获得了继续往下看的机会。ide
要想解释随机事件, 咱们得先从随机现象的概念开始, 现实生活中,一个动做或一件事情,在必定条件下,所得的结果不能预先彻底肯定,而只能肯定是多种可能结果中的一种,称这种现象为随机现象。好比明天的天气, 或者是抛硬币的结果等, 这种现象在生活中很是常见, 就不作过多解释了。既然咱们生活中不少现象都是不肯定的或者随机的, 那么有没有一些方法去研究和观察这些随机现象呢?若是能从这样的随机现象中找到一些规律, 那么咱们是否是能够更好的认识这个世界或者更好的生活呢? 既然像抛硬币这种事情来讲不肯定, 那么咱们就能够进行一些实验嘛, 多作一些, 说不定就能发现一些规律了呢? 因此咱们能够经过随机试验使得随机现象得以实现和观察。 因此这就引出了随机试验的概念, 那么随机试验有没有条件呢? 虽然随机试验是研究随机现象的, 可是确定不是全部的随机试验都那么好研究, 好比明天的天气, 因此随机试验应该知足三个条件:函数
能够在相同条件下重复进行(可重复)学习
结果虽然不肯定, 有多种可能, 可是这些可能的结果已知, 就是跑不出这个范围spa
就拿抛硬币这个来讲, 首先抛硬币咱们能够重复进行屡次, 而且每次进行咱们都知道要么是正, 要么是反,因此可能的结果已知, 可是咱们抛掷一次是正是反就不肯定, 因此这个试验是知足上面的条件的, 因此抛硬币结果的随机现象咱们就能够经过随机试验进行观察。有了随机现象和随机试验的概念, 咱们就能够再引出三个概念, 那就是样本空间, 样本点和随机事件了。
样本空间:随机试验中全部可能结果组成的集合, 好比抛硬币里面的{正, 反}这两种结果就是样本空间,记为
样本点:试验的每个可能的结果, 好比正或者反,记为
随机事件:样本空间中知足必定条件的子集, 用大写字母表示, 随机事件在随机试验中可能出现也可能不出现, 这个子集到底怎么理解?好比抛硬币, 样本空间是{正,反}, 而其子集就是{正}, {反}, 因此抛一枚硬币获得的结果是正或者反均可以做为随机事件, 固然这个例子随机事件可能会和样本点进行混淆, 那就投掷一枚骰子的结果, 咱们知道样本空间是{1, 2, 3, 4, 5, 6}, 那么随机事件能够是这里面的子集, 好比出现的数字是偶数的结果{2, 4, 6}。当其中一个样本点出现的时候,咱们就说这个随机事件发生了。
最后还有两个概念是必然事件, 这个就是必定发生的事件, 就是包含试验里面的全部样本点, 好比样本空间, 在每次试验中它老是发生。固然有必然就有不可能, 不可能事件是不含任何样本点, 在每次试验中都不会发生, 好比投掷骰子的时候, 空集定义成结果数字大于6, 这个就不会发生了。
上面咱们已经知道了几率论里面的一些基础概念, 可是咱们上面说学几率统计是为了研究随机现象的某些规律的,那么就须要在基础概念的基础上再往前一步, 去研究一些规律了, 咱们知道了对于一个事件, 在一次随机的试验中可能发生, 可能不发生, 但若是咱们知道某些事件在一次试验中发生的可能性大小,是否是对咱们会更有帮助, 因此咱们但愿找到一个合适的数来表征事件在一次试验中发生的可能性大小, 这个数就称为几率。可是在研究几率以前, 咱们先介绍一个概念叫频率, 所谓频率, 就是在相同的条件下, 进行了次试验, 在次试验中, 事件A发生的次数(频数)与次数的比就是事件A的频率, 记作。这个很好理解吧, 好比咱们抛10次硬币, 事件A是正面朝上, 若是10次里面有6次正面朝上, 那么就说A的频率是0.6。事件A的频率大,就说明事件A发生就越频繁, 这意味着事件A在一次试验里面发生的可能性就越大, 那你说, 直接将频率表示时间A在一次试验中发生的可能性大小不就完事?emmm,有道理, 大量试验证明, 当重复试验的次数逐渐增大, 频率会逐渐稳定性到某个常数, 好比抛硬币, 若是你作不少次试验, 你会发现正面向上的频率会稳定在0.5(不信?实践是检验真理的惟一标准, 哈哈), 那么频率来表征事件发生的可能性大小是合适的。But, 在实际中, 不少状况,咱们是不可能为了获得某个事件发生的可能性大小而去作大量的实验, 而后求得频率, 再说某个事件发生的可能性, 没那个耐心和时间, 像上面那个硬币的实验, 那些实验者但是抛了20000屡次, 因此有时候不得不敬佩人家的钻研精神, 大佬之因此是大佬, 人家背后但是下足了功夫的。那咱们应该怎么表示事件发生的可能性大小呢?咱们从频率稳定性中获得了启发, 获得了表征事件发生可能性大小的几率的定义。随机试验的样本空间, 对于每一个事件, 定义一个实数与之对应, 若函数知足条件:
事件包含的基本事件数基本事件总数
古典概型比较简单, 主要是下面的例子有意思, 这里再解释一下
假设有 k 个不一样颜色的球,每一个球以一样的几率 落到 个格子 () 的每一个中,且每一个格子可容纳任意多个球。分别求出以下两个事件 A 和 B 的几率。
- A :指定的 k 个格子中各有一个球;
- B :存在 k 个格子,其中各有一个球。
这里再解释一下这个题目, 咱们的目标是求和, 那么咱们根据上面的公式, 咱们得须要事件包含的基本事件数(m)和基本事件的总数(n)。那么咱们就先从基本事件总数n开始:
把个不一样颜色的球放到个格子里的全部可能的结果就是, 那么可能的结果有多少呢?咱们先从1个球开始, 若是把这1个球放入个格子的棋盘中, 那么会有种可能, 由于这个球有可能落在任何一个格子里面。好, 那么第二个球也会有中可能, 依次类推, 这k个球, 每一个球都会有中可能落入这个格子, 而且这k个球互不影响,这样若是把全部球都安顿下来, 那么全部可能会是, 这样说应该好理解些吧。由于第1个球有中状况, 对于第一个球的每一种状况第二个球又有种状况, 对于第一个球,第二个球的每一种状况, 第三个球又有种状况, 这样类推到第k个球。
总的可能结果肯定以后, 那么再想包含的基本结果, 指定的个格子中各有一个球, 也就是若是某个球落到了第一个格子里面, 这时候k种可能, 那么第二个格子种会有剩下的k-1个球的某一个会落入,就是k-1种可能, 依次类推,其实就是一种全排列, 即, 那么
再考虑事件B:存在个格子, 其中各有一个球, 与A的区别就是否是咱们指定好的个, 是存在个, 可是不肯定是哪个, 若是肯定了是哪, 就又回到了事件A, 因此B至关于A的基础上又进了一步, 那么好说, 只要咱们可以肯定出从个格子里面肯定的会有多少种状况, 而后每一个状况都会对应A的那些可能, 二者乘起来就是B含有的结果数, 因此B含有的结果数就是, 那么
好了, 但愿上面这样解释会清楚一些, 有了这个例子, 就能够考虑几率论史上的著名问题---生日问题了:求个同班同窗没有两人生日相同的几率。 这个文档里面解释的很清楚, 因此直接把图截过来:
这里主要是想补充 的python编程实现的另外一种实现方式, 就是求阶乘那块, 想复习一下python的reduce函数, 因此尝试用reduce函数实现阶乘部分做为补充。关于reduce函数, 在python幕后的鲜为人知二中有, 这里想借机会用一下:from functools import reduce
def mul(x, y): return x * y
def cal_pB(k, days=365): l_fac = reduce(mul, range(1, days+1)) l_k_fac = reduce(mul, range(1, days+1-k)) l_k_exp = days**k
return l_fac / (l_k_fac*l_k_exp)
P_B = cal_pB(40)print("事件B的几率为:",P_B)print("40个同窗中⾄至少两我的同⼀天过⽣日的几率是:",1 - P_B)
结果:事件B的几率为:0.10876819018205101。40个同窗中⾄至少两个⼈同⼀天过⽣日的几率是:0.891231809817949
研究随机事件之间的关系时,在已知某些事件发生的条件下考虑另外一些事件发生的几率规律有无变化及如何变化,是十分重要的。设和是两个事件, 且, 称为事件发生的条件下,事件发生的几率。条件几率的公式比较重要, 这里记住这个形式便可, 原型依然是从样本点的角度化简过来的。
基于条件几率, 才有了后面伟大的全几率公式和贝叶斯公式。
5. 全几率公式和贝叶斯公式
在介绍这俩公式以前, 先看看几率乘法公式和样本空间划分的。
若是事件组,知足:
则称事件组是样本空间的一个划分。
5.1 全几率公式设是样本空间 的一个划分, 为任一事件,则:
称为全几率公式。
5.2 贝叶斯公式
设是样本空间 的一个划分,则对任一事件 ,有:
称为贝叶斯公式, 称为先验几率, 为后验几率。
在实际中,常取对样本空间的有限划分 。 视为致使试验结果发生的“缘由”,而表示各类“缘由”发生的可能性大小,故称为先验几率; 则反应当试验产生告终果后,再对各类“缘由”几率的新认识,故称为后验几率 。
贝叶斯公式, 先验几率和后验几率的概念超级重要, 也是机器学习中朴素贝叶斯的核心。
这一块基于文档会补充一些知识, 好比连续型随机变量和常见分布, 而后在数字特征那里补充方差,协方差和相关系数的numpy和pandas的实现。 固然随机变量这里还有多维随机变量及其分布的内容, 可是篇幅有些多, 就不整理到这里了, 之后用到现查吧。
上面的讨论中, 咱们发现有些随机试验, 它们结果能够用数来表示, 此时样本空间的元素是数, 而有些则不是, 对于后者, 咱们就难以描述和研究, 那么咱们能不能想办法将随机试验的每个结果,即样本空间中的每一个元素与实数对应起来呢?那样咱们就能够从数学的角度研究这些随机试验的规律了, 从而引入了随机变量的概念。设是随机试验,是样本空间,若是对于每个 。都有一个肯定的实数 与之对应,若对于任意实 ,有,则称上的单值实函数为一个随机变量。简单的理解, 随机变量就是样本空间样本点到实数的一种映射。
举个例子:咱们假设抛掷一枚硬币抛三次, 那么咱们的样本空间是
正正正,正正反正反正,反正正,正反反,反正反,反反正,反反反以记三次投掷获得正面的总数, 那么样本空间中的每一个样本点, 都有一个数与之对应, 那么就是定义在样本空间上的实值单值函数。它的定义域是样本空间, 值域是实数集合{0, 1, 2, 3}, 使用函数可将表示成:
经过这种方式, 就把样本点映射到了实数上。
从定义可知随机变量是定义在样本空间上,取值在实数域上的函数。因为它的自变量是随机试验的结果,而随机试验结果的出现具备随机性,所以,随机变量的取值也具备必定的随机性。这是随机变量与普通函数的不一样之处。既然随机变量的取值有随机性, 那么咱们就关心它取值的可能性大小,也就是取某个值的几率, 那么在数轴上咱们如何肯定这种几率的呢? 又引入了随机变量分布函数的概念。设是一个随机变量, 对任意的实数, 令
则为随机变量的分布函数, 或者几率累积函数。有了分布函数, 若是咱们再想研究随机变量取值的几率, 就比较容易了, 而且对于随机变量的取值, 咱们每每不是研究去某一个值(由于对于连续型随机变量某一个值会发现几率是0), 而是研究一段区间, 那么对于任意实数, 有:
这样就获得了落在某一段区间上的几率。所以分布函数完整的描述了随机变量的统计规律性, 而且分布函数就是一个普通的函数了, 经过这个咱们就能经过数学的方法研究随机变量。这个太厉害了。
若是随机变量的所有可能取值只有有限多个或可列无穷多个(上面抛掷硬币的例子), 则称 为离散型随机变量。若是要研究离散型随机变量的统计规律, 必须知道的全部可能取值及每一个可能取值的几率。对于离散型随机变量 可能取值为 的几率为:上面的式子就是离散型随机变量的分布律。咱们能够用下表来表示分布律:
离散型随机变量的分布函数:
下面介绍三种重要的离散型随机变量及分布。
2.1. (0-1)分布
设随机变量只可能取0和1两个值, 它分布律是则称服从以为参数的(0-1)分布或者两点分布。对于一个随机试验, 若是样本空间只包含两个元素, , 咱们就能在上定义一个服从(0-1)分布的随机变量
来描述随机试验的结果。好比抛硬币的试验, 好比检验产品是否合格等。
2.2. 二项分布
提及二项分布, 咱们得先说一种试验叫作伯努利试验, 重复表示的每一次试验几率不变, 独立指的是每次试验互不干扰。好比抛掷硬币的那个例子, 抛掷一次观察是正面仍是反面, 这是一个伯努利试验, 将硬币抛掷次, 就是重伯努利试验。设:
则
这就是著名的二项分布, 记作分布函数
分布函数:
numpy 中提供了产生二项分布的API:
np.random.binomial(n, p, size)
2.3. 泊松分布
设随机变量全部可能取值为0, 1, 2,..., 而取各个值的几率为
则称服从参数为的泊松分布, 记为
泊松定理:设是一个常数, 是任意正整数, 设, 则对于任意固定非负整数, 有
这个东西也就是说以为参数的二项分布的几率值能够又参数为的泊松分布来近似。
numpy中提供了产生泊松分布随机数的API:
numpy.random.poisson([lam, size])
还有一点要注意就是虽然几率密度的大小能够反映随机变量取某段值的可能性大小, 可是几率密度并不表明着几率, 由于有个积分号。
也就是
下面看看三种重要的连续型随机变量及分布:
3.1. 均匀分布若连续型随机变量具备几率密度
则称在区间(a,b)上服从均匀分布, 记为几率密度和分布函数长这样:
下面看一下用numpy的random来产生服从均匀分布的随机样本:
# 均匀分布import numpy as npimport matplotlib.pyplot as plt看一下均匀分布的效果:
np.random.rand(10) # (0-1)的一组均匀分布的数np.random.uniform(low=0, high=100, size=10) # 从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high
# 画个图感觉一下x = np.random.uniform(-1, 1, 10000000)plt.hist(x, bins=10)
3.2.指数分布
若连续型随机变量的几率密度为:
则称服从参数为的指数分布。几率密度图以下:
指数分布有个性质就是无记忆性。即
numpy中提供了指数分布随机数的API:
numpy.random.exponential(scale, size)
3.3. 正态分布
正态分布若连续型随机变量 的几率密度为# numpy.random.randn(d0, d1, ..., dn)#返回一个指定形状的数组,数组中的值服从标准正态分布(均值为0,方差为1)a = np.random.randn(3, 2)
# numpy.random.normal(loc=0.0, scale=1.0, size=None)# 返回一个由size指定形状的数组,数组中的值服从 μ=loc,σ=scale 的正态分布。a = np.random.normal(0, 1, (3, 2))
关于更多numpy产生随机数的方法, 比较经常使用的就是
均匀分布:rand, uniform
正态分布:randn, normal
离散均匀抽样:randint, random
这里要注意一下,就是这里的数学指望和样本平均数可不是一回事。指望是针对于随机变量而言的一个量,能够理解是一种站在“上帝视角”的值。针对于他的样本空间而言的。而样本平均数是一个统计量(对观察样本的统计),指望是一种几率论概念,是一个数学特征。可是平均数和指望能够经过大数定律联系起来, 即指望就是平均数随样本趋于无穷的极限。因此后面会学习到数理统计的内容, 就是经过观察已有的样本去估计“上帝视角”的这些未知值。
数学指望表明了随机变量取值的平均值, 是很是重要的数字特征。数学指望有下面的性质:
关于指望, 咱们是无法直接求得, 可是给咱们样本, 咱们能够求均值(np.mean)
方差是用来描述随机变量取值相对于均值的离散程度的一个量,也是很是重要的数字特征。方差有以下性质:
一样样本的方差能够np.var()
协方差和相关系数都是描述随机变量X与随机变量Y之间的线性联系程度的数字量。
固然, 衡量两个随机变量的线性相关程度, 咱们通常用的是相关系数:
关于理论, 这里就直接截图了,由于公式的编辑太费时间了。下面就经过代码的方式看点有意思的事情了:
首先咱们能够经过np.mean(), np.std(), np.var()计算给定数据的均值, 标准差, 方差。
import numpy as np
x=np.array([[1 ,5 ,6] ,[4 ,3 ,9 ],[ 4 ,2 ,9],[ 4 ,7 ,2]])x.mean() # 全部数的均值x.mean(axis=1) # 每一行的均值x.mean(axis=0) # 每一列的均值
# 方差np.var(x)np.var(x, axis=1)np.var(x, axis=0)
# 标准差np.std(x)np.std(x, axis=1)np.std(x, axis=0)
而后咱们看看协方差np.cov():
numpy.cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None, aweights=None)计算协方差, 必定要清楚每一行表明一个变量仍是每一列表明一个变量, 咱们计算协方差是计算变量与变量之间的线性关系, 因此首先得知道哪是变量哪是样本。numpy里面的cov函数默认是每一行是变量(特征)
x=np.array([[1 ,5 ,6] ,[4 ,3 ,9 ],[ 4 ,2 ,9],[ 4 ,7 ,2]])np.cov(x) # 每一行是一个变量
结果以下:
若是咱们的每一列是变量, 这时候求协方差, 须要指定rowvar=0
np.cov(x, rowvar=0) # 每一列是一个变量
# 结果array([[ 2.25 , -0.75 , 0.5 ], [-0.75 , 4.91666667, -7.16666667], [ 0.5 , -7.16666667, 11. ]])
可是注意, 若是是pandas的话, 默认是每一列是一个变量
import pandas as pddf = pd.DataFrame(x)
df.cov()
若是是求相关系数, 咱们能够用np.corrcoef(), 或者是pd.corr(), 一样的前者默认行为变量, 后者默认列为变量, 用法的话和上面的协方差相似, 只不过corr()函数能够指定相关系数的类型。
np.corrcoef(x, rowvar=0) # 求皮尔逊相关系数df.corr() # pandas默认是列是变量
# 这两个结果同样array([[ 1. , -0.22549381, 0.10050378], [-0.22549381, 1. , -0.97450816], [ 0.10050378, -0.97450816, 1. ]])
可是corr()不只能够求皮尔逊相关系数, 还能够求其余的相关系数, 好比spearman等。
最后再看一个有意思的现象:
x = [1, 2, 3, 4]np.var(x) * 4 # 5.0np.cov(x) * 3 # 5.0
就是当x是一个变量的时候, np.cov和np.var都是再求方差, 可是后者是有偏的, 前者是无偏的, 关于有偏无偏, 这里就很少说了, 有偏就是分母除的是n, 无偏是除的n-1. 那若是想这时候让cov也求有偏, 就指定np.cov(x, ddof=0) , 这时候就和np.var(x)的结果同样了。
这篇文章的内容属于几率统计基础部分, 内容也很多, 下面简单回顾一下, 咱们从随机变量开始, 介绍了几率统计中很重要且容易混的一些概念, 随机现象, 随机试验, 随机事件, 样本空间, 样本点等。而后想找到衡量事件发生可能性大小的标准就引出了频率和几率的概念, 而后再走一步学习了古典概型, 条件几率并引出了伟大的全几率公式和贝叶斯公式。随机变量这块, 正式的把几率和数学函数联系到了一块, 研究了离散型随机变量和分布, 连续型随机变量分布, 最后学习了随机变量的数字特征:指望, 方差,协方差和相关系数, 并基于numpy实现了样本的均值,方差,协方差和相关系数。