概率及常用概率分布的实现——计算机视觉修炼之路(零) ゝ一纸荒年。 2023-01-24 03:27 73阅读 0赞 # 引言 # 计算机视觉是一门用计算机模拟生物视觉的学科。该学科让计算机代替人眼实现对目标的识别、分类、跟踪和场景理解。 计算机视觉是人工智能的重要分支,也是一门具有很强综合性的学科,涉及计算机科学与工程、信号处理、光学、应用数学、统计学、神经生理学和认知科学等学科。 OpenCV 是一个开源、跨平台的计算机视觉库,基于 C/C++,支持 Linux/Windows/MacOS/Android/iOS,并提供了 Python,Matlab 和 Java 等语言的接口。因为有着丰富的接口、优秀的性能和商业友好的使用许可,OpenCV 不管是在学术界还是业界中都非常受欢迎。 Python 作为当前非常流行的动态语言之一,使用简单且功能强大,已经用于大量人工智能项目的开发。OpenCV 提供了 Python 开发的接口,该接口下的学习框架称为 Python-OpenCV 视觉学习框架。该框架最显著的特点是,它提供了整套流程的工具,开发者根本不需要了解各个模型的具体实现原理,就能一个个 API 构建视觉任务。 本项目主要聚焦于计算机视觉的核心技术与算法,基于 Python-OpenCV 视觉学习框架进行实战训练,帮助你更好地掌握计算机视觉的技术要点。 # 随机事件及概率 # 概率亦称“或然率”,它反映随机事件出现的可能性( likelihood )大小。随机现象是在一定条件下,并不总是出现相同结果的现象。 例如,抛一枚硬币,观察正面或反面出现的情况。抛硬币的实验就是个随机实验,它满足: * **可重复性**。在相同条件下,可以进行大量次重复试验。 * **偶然性**。每次试验中可以出现不同的结果,而不能预先知道发生哪种结果。 * **统计规律性**。试验中一切可能出现的结果可以预先知道。 **随机变量可以是离散的或连续的**。 离散变量从一组预先确定的集合中取值,这组值可能是有序的(掷骰子的点数从1到6)或者无序的(预测天气)。它可能是有限的(从标准扑克牌中随机抽出一张牌,有52种可能的结果)或者无限的(预测水流量)。离散变量的概率分布可以可视化为一个直方图。每个结果都有一个与之相关的正概率,且所有结果的概率之和总是1。 连续随机变量取实数值。这些取值可能是有限的或无限的。无限连续变量可能取遍整个实数范围,或者可能是仅有上界或下界的区间。连续变量的概率分布可以通过绘制概率密度函数( PDF )来可视化。一个结果的概率密度表示随机变量取该值的相对可能性。它可以取任何正值并且积分总是1。图1描述了一个离散分布列(直方图表示)与概率密度函数函数的图像,形象的表示出了两个概念的不同。 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N0YXJfb2Zfc2NpZW5jZQ_size_16_color_FFFFFF_t_70][] 图1. 离散分布列(左)和概率密度分布函数 # 联合概率分布和边缘概率 # 联合概率分布简称联合分布,是两个及以上随机变量组成的随机向量的概率分布。根据随机变量的不同,联合概率分布的表示形式也不同。对于离散型随机变量,联合概率分布可以以列表的形式表示,也可以以函数的形式表示;对于连续型随机变量,联合概率分布通过一非负函数的积分表示。 假设X和Y都服从正态分布,那么P(X>1,Y=0)就是一个联合概率,表示X>1和Y=0两个条件同时成立的概率。A与B的联合概率表示为P(AB)或者P(A,B),或P(A∩B)。 边缘概率是与联合概率对应的。这些仅与单个随机变量有关的概率称为边缘概率,如P(X=a)或P(Y=b)。 # 条件概率 # 条件概率是指事件A在另外一个事件B已经发生条件下的发生概率。条件概率表示为: ![P(A|B)=\\frac\{A\}\{B\}][P_A_B_frac_A_B] 读作“在B的条件下A的概率”。条件概率其实反应了一个朴素的概念,你平时在推理不确定的事情时,下意识的需要去找和事情有关的证据。因为证据越多,你对不确定的事情的推理就越有信心。 ![20210716184409104.png][] 图2. 条件概率图 用图2更能容易的说明上述问题。当进行某一实验,该实验所有的样本集合为 Ω , A 和 B 代表事件 A 和 B 各自包括的所有样本。 通过图2,我们再来理解一下这样的问题:“ B 已经发生的条件下, A 发生的概率”。该问题中,“ B 已经发生”就相当于已经把样本的可选范围限制在了圆圈 B 中,其实就等价于这句话:“在圆圈 B 中, A 发生的概率”,显然P(A∣B)就等于AB交集中样本的数目除以 B 的样本数目。 # 联合概率、边缘概率与条件概率之间的关系 # 联合概率、边缘概率与条件概率之间的关系可以写为: ![P(X=a|Y=b)= \\frac\{P(X=a,Y=b)\}\{P(Y=b)\}][P_X_a_Y_b_ _frac_P_X_a_Y_b_P_Y_b] 其中: 联合概率P(X=a,Y=b)满足X=a且Y=b的样本; 边缘概率P(Y=b)不考虑X的取值,所有满足Y=b的样本; 条件概率P(X=a∣Y=b)在Y=b的前提下,满足X=a的样本(比例)。 # 全概率公式与贝叶斯公式 # 全概率公式为概率论中的重要公式,它将对复杂事件 A 的概率求解问题转化为了在不同情况下发生的简单事件的概率的求和问题。它的具体解释为:如果事件B1,B2,B3...Bn构成一个完备事件,即它们两两互不相容,其和为全集并且P(Bi)大于0,则对任一事件 A有 ![P(A)=P(A|B1)P(B1)+ P(A|B2)P(B2)+...+ P(A|Bn)P(Bn)][P_A_P_A_B1_P_B1_ P_A_B2_P_B2_..._ P_A_Bn_P_Bn] 全概率就是表示达到某个目的有多种方式(或者造成某种结果,有多种原因),求达到目的的概率是多少(造成这种结果的概率是多少)。 贝叶斯定理由英国数学家贝叶斯提出,用来描述两个条件概率之间的关系。所谓贝叶斯公式,是指当分析样本大到接近总体数时,样本中事件发生的概率将接近于总体中事件发生的概率。P(A∣B) 和P(B∣A)是两个条件概率,贝叶斯公式表示为 P(A∣B)=P(B∣A)×P(A)/P(B) 贝叶斯公式就是当已知结果,求导致这个结果的第 i 原因的可能性是多少。其原理相当于执果索因。 在贝叶斯法则中,每个名词都有约定俗成的名称: P(A) 是 A 的先验概率或边缘概率。之所以称为”先验”是因为它不考虑任何B方面的因素; P(A|B) 是已知 B 发生后 A 的条件概率,也由于得自 B 的取值而被称作 A 的后验概率; P(B|A)是已知 A 发生后 B 的条件概率,也由于得自 A 的取值而被称作 B 的后验概率; P(B) 是 B 的先验概率或边缘概率,也作标准化常量(normalized constant)。 1、设连续型随机变量X的概率密度和分布函数分别为f(x)和F(x),则下列各式正确的是 A、0 ≤ f(x) ≤ 1 B、P(X=x) = f(x) C、P(X=x) = F(x) D、P(X=x) ≤ F(x) 正确答案:ABD # 二项分布 # 二项分布是由伯努利提出的概念,指的是重复n次独立的伯努利试验。在每次试验中只有两种可能的结果,而且两种结果发生与否互相对立,与其它各次试验结果无关,事件发生与否的概率在每一次独立试验中都保持不变,则这一系列试验总称为n重伯努利实验,当试验次数为1时,二项分布服从 0−1 分布。 考虑只有两种可能结果的随机试验,当成功的概率(π)是恒定的,且各次试验相互独立,这种试验在统计学上称为伯努利试验(Bernoulli trial)。如果进行n次伯努利试验,取得成功次数为X(X=0,1,2…,n)的概率可用下面的二项分布概率公式来描述: ![P=C(X,n)\\times \\pi^X\\times (1-\\pi )^\{(n-X)\}][P_C_X_n_times _pi_X_times _1-_pi _n-X] 其中,式中n为独立的伯努利试验次数,π为成功的概率,(1−π)为失败的概率。C(X,n)表示在n次试验中出现X的各种组合情况,在此称为二项系数。 ## 二项分布的示例 ## 抛硬币试验就是伯努利试验。在一次试验中硬币要么正面朝上,要么反面朝上,每次正面朝上的概率都一样p=0.5。且每次抛硬币的事件相互独立,即每次正面朝上的概率不受其他试验的影响。如果独立重复抛n=10次硬币,正面朝上的次数k可能为0,1,2,3,4,5,6,7,8,9,10中的任何一个,那么k显然是一个随机变量,这里就称随机变量k服从二项分布。 ## 基于 scipy 的二分布计算 ## 在 Python 中, scipy 包提供了丰富的可用函数。其中,计算每次观测的二项分布概率密度函数为: `stats.binom.pmf(k,n,p)` 其中n 表示测量次数, k 是目标结果的次数, p 为抽样概率。输出为k个元素的数组,数组的每个元素表示出现k次目标结果的概率。 下面我们通过一个具体例子来说明一下该函数的用法。 有一个质地均匀的骰子,投掷5次骰子,求出现3次点数为6的概率。 使用 scipy 进行求解为: `binom.pmf(range(6), 5, 1/6)` 得到输出: `array([0.401878, 0.401878, 0.166751, 0.032150, 0.003215, 0.000129])` 由结果可知:出现0或1次6点的概率为40.2%,而出现3次6点的概率为3.215%。 编程示例 使用`stats.binom.pmf`伯努利分布函数解决实际问题,具体要求如下: * 从后台获取数据 n 和 p,n 为样本数,p 为抽样概率; * 已知实际问题为:抛硬币 n 次,现在每一次朝上的概率是 p,依次求出 0-n 次正面朝上的概率; * 通过`stats.binom.pmf`求出概率值,并打印结果。 import numpy as np from scipy import stats n = input() #n是样本数 p = input() #p是抽样概率 n = int(n) p = float(p) y = stats.binom.pmf(range(n+1),n,p) print(y) 测试输入: 1. `5` 2. `0.5` 预期输出: 1. `[0.03125 0.15625 0.3125 0.3125 0.15625 0.03125]` # # # beta分布 # 贝塔分布( Beta Distribution ) 是一个作为伯努利分布和二项式分布的共轭先验分布的密度函数,在机器学习和数理统计学中有重要应用。在概率论中,贝塔分布,是指一组定义在(0,1)区间的连续概率分布。其概率密度函数为: ![f(x;\\alpha ,\\beta )=\\frac\{1\}\{B(\\alpha ,\\beta )\}x^\{\\alpha -1\}(1-x)^\{\\beta -1\}][f_x_alpha _beta _frac_1_B_alpha _beta _x_alpha -1_1-x_beta -1] **beta 分布的期望**为:![\\mu =\\frac\{\\alpha \}\{\\alpha +\\beta \}][mu _frac_alpha _alpha _beta] 下面我们通过一个问题来具体的分析 beta 分布的使用。假设一个概率实验只有两种结果,一个是成功,概率是X;另一个是失败,概率为(1−X)。其中,X的值我们是不知道的,但是它所有可能的情况也是等概率的。如果我们对X的不确定性用一种方式描述,那么,可以认为X是个来自于\[0,1\]区间的均匀分布的样本。 这是很合理的,因为X只可能是\[0,1\]之间的某个值。同时,我们对X也一无所知,认为它是\[0,1\]之间任何一个可能的值。这些都与\[0,1\]均匀分布的性质契合。 现在,假设我们做了n次独立重复的实验,我们观察到k次成功,n−k次失败。这时候我们就可以使用这些实验结果来修订之前的假设了。换句话说,我们就要计算X的条件概率,其条件是我们观察到的成功次数和失败次数。这里计算的结果就是 beta 分布了。 在这里,在总共n次实验,k次成功的条件下,X的条件概率是一个 beta 分布,其参数是k+1和n−k+1。 ## 示例:beta分布用于评价旧货商服务质量 ## 假设亚马逊上有三家旧货商,其评价结果分别如下: 商家一:85193个评论,94%的正向 商家二:20785个评论,98%的正向 商家三:840个评论,99%的正向 那么这三个商家中,哪一家的服务质量最好呢?假设我们对三家旧货商的信息一无所知,那么这些参数的先验可以认为是一个均匀分布,也可以等同于 beta(1,1) 。根据之前的知识,我们知道,最终这三家旧货商的服务质量应当服从三个不同参数的 beta 分布,即 beta(80082,5113)、beta(20370,417)和beta(833,9)。 > 注意,当 beta 分布的参数很大的时候,我们可以使用相同均值和方差的正态分布代替这个 beta 分布。 因此,最终这三家供货商,商家3的服务质量的标准差是0.003,是最大的。其他两家的标准差比这个还小。因此,我们可以认为这三家供货商的服务质量都高度聚焦于他们的均值。因此,从第一个或第二个分布中抽取的样本不太可能比第三个样本的值高。也就是说前两个服务商不太可能质量比第三个高。 ## scipy 的 beta 分布计算 ## Python 的`scipy`中含有 beta 分布函数。下面给出该函数的用法: `beta.pdf(x,a,b)` 其中`x`是给定的取值范围,`a`为α值,`b`为β值。它的返回值就是指定输入的概率值。 例如,在旧货商的正向评论率问题中,我们使用 scipy 的 `beta` 函数就可以得到三家供货商的服务质量函数。在本问题中,x∈\[0,1\]表示正向评论率,三个旧货商的 `beta` 函数为`beta.pdf(x,80082,5113),beta.pdf(x,20370,417),beta.pdf(x,833,9)`。 使用 `beta` 函数后得到的值就是正向评论率的概率。 编程示例 我们现在考虑这么个问题: 问题1. 在一个收费站,收费站一段时间(比如每隔1小时)会经过一些车(n辆)。假设经过的车只分两种,大车和小车。我们希望通过观察收费站一长段时间的车辆经过情况,估计小车占所有车的比例 p 。 首先我们使用这样的策略:每隔一个小时统计一次,那么在每个小时内,小车的数量应该服从(n,p)二项分布。但是有个问题,就是每个小时的 n (车辆总数)是不同的, p 也不同,那么十个小时的观测到的小车数目,就是十个不同的二项分布的期望,所以不好假设是二项分布了。 估计小车的比例 p 显然仅能出现于0到1之间。任何时刻的小车的比例具有随机性,这些提示我们一段时间的小车比例的分布可能符合贝塔分布。 记每小时的小车数为α ,大车数β,则小车的比例为![\\frac\{\\alpha \}\{\\alpha +\\beta \}][frac_alpha _alpha _beta]。而这个比例就服从B(α,β)。也就是说,计算每小时观测到的小车比例,可以认为小车车流量服从 beta 分布,并进行求解。因此,小车的占比p的可能性为`0 ~ 1`,作为beta分布的输入`x`,α 和β为函数的参数。 from scipy.stats import beta import numpy as np a = input() #贝塔分布的alpha值 b = input() #贝塔分布的beta值 a = float(a) b = float(b) x=np.arange(0.1,1,0.1) #给定的输入数据 print(beta.pdf(x,a,b)) 测试输入: 1. `0.5` 2. `0.5` 预期输出: 1. `[1.06103295 0.79577472 0.69460912 0.64974733 0.63661977 0.649747330.69460912 0.79577472 1.06103295]` # # # 正态分布 # 正态分布(Normal distribution)正态分布又称高斯分布,是一种很重要的连续型分布,应用甚广。在医学卫生领域中有许多变量的频数分布资料可绘制成直方图而且频数分布是中间(靠近均数处)频数多,两边频数少,且左右对称。正态分布在统计学上十分重要,经常用在自然和社会科学来代表一个不明的随机变量。 正态曲线呈钟型,两头低,中间高,左右对称因其曲线呈钟形,因此人们又经常称之为钟形曲线。下图表示均值为0.0178,标准差为0.00707的正态分布函数的图像。 ![图1][1] 正态分布函数曲线 若随机变量X服从一个数学期望为u、方差为![\\sigma ^2][sigma _2]的正态分布,记为N(u,![\\sigma ^2][sigma _2])。其概率密度函数为正态分布的期望值u决定了其位置,其标准差σ决定了分布的幅度。一维正态分布的概率密度函数为: ![f(x)=\\frac\{1\}\{\\sqrt\{2\\pi \}\\sigma \}exp(-\\frac\{(x-\\mu )^2\}\{2\\sigma ^2\})][f_x_frac_1_sqrt_2_pi _sigma _exp_-_frac_x-_mu _2_2_sigma _2] μ是正态分布的位置参数,描述正态分布的集中趋势位置。概率规律为取与μ邻近的值的概率大,而取离μ越远的值的概率越小。正态分布以x=μ为对称轴,左右完全对称。正态分布的期望、均数、中位数、众数相同,均等于μ。 σ描述正态分布资料数据分布的离散程度,σ越大,数据分布越分散;σ越小,数据分布越集中。也称为是正态分布的形状参数,σ越大,曲线越扁平,反之,σ越小,曲线越瘦高。如图2所示。 ![图2][2] 不同参数的正态分布函数曲线 ## 正态分布的应用 ## 正态分布有极其广泛的实际背景,生产与科学实验中很多随机变量的概率分布都可以近似地用正态分布来描述。例如,在生产条件不变的情况下,产品的强力、抗压强度、口径、长度等指标;同一种生物体的身长、体重等指标;同一种种子的重量;测量同一物体的误差;弹着点沿某一方向的偏差;某个地区的年降水量;以及理想气体分子的速度分量,等等。 一般来说,如果一个量是由许多微小的独立随机因素影响的结果,那么就可以认为这个量具有正态分布。从理论上看,正态分布具有很多良好的性质,许多概率分布可以用它来近似;还有一些常用的概率分布是由它直接导出的,例如对数正态分布、t 分布、F 分布等。 在计算机视觉中,高斯函数是极为重要的一个函数。使用核方法,高斯核函数可以把低维数据映射到高维,我们在这个高维的非线性流行上处理数据;高斯噪声、高斯滤波器等方法经常在图像加噪去噪过程中用到。在信息论中,相关熵引导度量就是基于高斯函数推导的出的。还有很多基于高斯函数的方法会在今后的学习中用到。因此熟记并理解高斯函数十分的重要。 编程示例 根据一维正态分布的公式,使用 Python 来实现一个一维正态分布的概率密度函数,并输出给定数据的函数值。 import numpy as np u = input() # 均值μ sig = input() # 标准差δ u = float(u) sig = float(sig) x = np.linspace(u - 3 * sig, u + 3 * sig, 50) #给定的数据样本x #高斯分布概率 def guass(data,avg,sig): sqrt_2pi=np.power(2*np.pi,0.5) coef=1/(sqrt_2pi*sig) powercoef=-1/(2*np.power(sig,2)) mypow=powercoef*(np.power((data-avg),2)) return coef*(np.exp(mypow)) print(guass(x,u,sig)) 测试输入: 1. `1` 2. `1` 预期输出: 1. `[0.00443185 0.00635135 0.00896675 0.01247075 0.01708592 0.02306069` 2. `0.03066159 0.04016108 0.05182083 0.0658706 0.08248352 0.10174921` 3. `0.12364689 0.1480211 0.17456307 0.20280069 0.2320998 0.26167871` 4. `0.29063661 0.31799518 0.34275126 0.36393672 0.38068082 0.39226937` 5. `0.39819528 0.39819528 0.39226937 0.38068082 0.36393672 0.34275126` 6. `0.31799518 0.29063661 0.26167871 0.2320998 0.20280069 0.17456307` 7. `0.1480211 0.12364689 0.10174921 0.08248352 0.0658706 0.05182083` 8. `0.04016108 0.03066159 0.02306069 0.01708592 0.01247075 0.00896675` 9. `0.00635135 0.00443185]` [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N0YXJfb2Zfc2NpZW5jZQ_size_16_color_FFFFFF_t_70]: /images/20221004/ddc188d4aaaa417bada7af06c0d782f7.png [P_A_B_frac_A_B]: https://latex.codecogs.com/gif.latex?P%28A%7CB%29%3D%5Cfrac%7BA%7D%7BB%7D [20210716184409104.png]: /images/20221004/b5610c415a454932b3cba58a7681269b.png [P_X_a_Y_b_ _frac_P_X_a_Y_b_P_Y_b]: https://latex.codecogs.com/gif.latex?P%28X%3Da%7CY%3Db%29%3D%20%5Cfrac%7BP%28X%3Da%2CY%3Db%29%7D%7BP%28Y%3Db%29%7D [P_A_P_A_B1_P_B1_ P_A_B2_P_B2_..._ P_A_Bn_P_Bn]: https://latex.codecogs.com/gif.latex?P%28A%29%3DP%28A%7CB1%29P%28B1%29+%20P%28A%7CB2%29P%28B2%29+...+%20P%28A%7CBn%29P%28Bn%29 [P_C_X_n_times _pi_X_times _1-_pi _n-X]: https://latex.codecogs.com/gif.latex?P%3DC%28X%2Cn%29%5Ctimes%20%5Cpi%5EX%5Ctimes%20%281-%5Cpi%20%29%5E%7B%28n-X%29%7D [f_x_alpha _beta _frac_1_B_alpha _beta _x_alpha -1_1-x_beta -1]: https://latex.codecogs.com/gif.latex?f%28x%3B%5Calpha%20%2C%5Cbeta%20%29%3D%5Cfrac%7B1%7D%7BB%28%5Calpha%20%2C%5Cbeta%20%29%7Dx%5E%7B%5Calpha%20-1%7D%281-x%29%5E%7B%5Cbeta%20-1%7D [mu _frac_alpha _alpha _beta]: https://latex.codecogs.com/gif.latex?%5Cmu%20%3D%5Cfrac%7B%5Calpha%20%7D%7B%5Calpha%20+%5Cbeta%20%7D [frac_alpha _alpha _beta]: https://latex.codecogs.com/gif.latex?%5Cfrac%7B%5Calpha%20%7D%7B%5Calpha%20+%5Cbeta%20%7D [1]: /images/20221004/8fef5d6a63ba4b9796e8173adfa7d763.png [sigma _2]: https://latex.codecogs.com/gif.latex?%5Csigma%20%5E2 [f_x_frac_1_sqrt_2_pi _sigma _exp_-_frac_x-_mu _2_2_sigma _2]: https://latex.codecogs.com/gif.latex?f%28x%29%3D%5Cfrac%7B1%7D%7B%5Csqrt%7B2%5Cpi%20%7D%5Csigma%20%7Dexp%28-%5Cfrac%7B%28x-%5Cmu%20%29%5E2%7D%7B2%5Csigma%20%5E2%7D%29 [2]: /images/20221004/63d6ae128e2c4896aab69690e5373bc0.png
还没有评论,来说两句吧...