概率论中均值、方差、标准差介绍及C++/OpenCV/Eigen的三种实现
概率論是用于表示不確定性聲明(statement)的數(shù)學(xué)框架。它不僅提供了量化不確定性的方法,也提供了用于導(dǎo)出新的不確定性聲明的公理。在人工智能領(lǐng)域,概率論主要有兩種用途。首先,概率法則告訴我們AI系統(tǒng)如何推理,據(jù)此我們設(shè)計一些算法來計算或者估算由概率論導(dǎo)出的表達(dá)式。其次,我們可以用概率和統(tǒng)計從理論上分析我們提出的AI系統(tǒng)的行為。
概率論使我們能夠作出不確定的聲明以及在不確定性存在的情況下進(jìn)行推理,而信息論使我們能夠量化概率分布中的不確定性總量。
1.??????為什么要使用概率
機(jī)器學(xué)習(xí)通常必須處理不確定量,有時也可能需要處理隨機(jī)(非確定性的)量。不確定性和隨機(jī)性可能來自多個方面。
不確定性有三種可能的來源:(1)、被建模系統(tǒng)內(nèi)在的隨機(jī)性。(2)、不完全觀測。即使是確定的系統(tǒng),當(dāng)我們不能觀測到所有驅(qū)動系統(tǒng)行為的變量時,該系統(tǒng)也會呈現(xiàn)隨機(jī)性。(3)、不完全建模。當(dāng)我們使用一些必須舍棄某些觀測信息的模型時,舍棄的信息會導(dǎo)致模型的觀測出現(xiàn)不確定性。
在很多情況下,使用一些簡單而不確定的規(guī)則要比復(fù)雜而確定的規(guī)則更為實用,即使真正的規(guī)則是確定的并且我們建模的系統(tǒng)可以足夠精確地容納復(fù)雜的規(guī)則。
概率可以被看作是用于處理不確定性的邏輯擴(kuò)展。邏輯提供了一套形式化的規(guī)則,可以在給定某些命題是真或假的假設(shè)下,判斷另外一些命題是真的還是假的。概率論提供了一套形式化的規(guī)則,可以在給定一些命題的似然后,計算其它命題為真的似然。
2.??????隨機(jī)變量
隨機(jī)變量(random variable)是可以隨機(jī)地取不同值的變量。就其本身而言,一個隨機(jī)變量只是對可能的狀態(tài)的描述;它必須伴隨著一個概率分布來指定每個狀態(tài)的可能性。
隨機(jī)變量可以是離散的或者連續(xù)的。離散隨機(jī)變量擁有有限或者可數(shù)無限多的狀態(tài)。注意這些狀態(tài)不一定非要是整數(shù);它們也可能只是一些被命名的狀態(tài)而沒有數(shù)值。連續(xù)隨機(jī)變量伴隨著實數(shù)值。
隨機(jī)變量:給定樣本空間(S、F),如果其上的實值函數(shù)X: S→R是F(實值)可測函數(shù),則稱X為(實值)隨機(jī)變量。初等概率論中通常不涉及到可測性的概念,而直接把任何X:S→R的函數(shù)稱為隨機(jī)變量。
如果X指定給概率空間S中每一個事件e有一個實數(shù)X(e),同時針對每一個實數(shù)r都有一個事件集合Ar與其相對應(yīng),其中Ar={e:X(e)≤r},那么X被稱作隨機(jī)變量。隨機(jī)變量實質(zhì)上是函數(shù)。如果隨機(jī)變量X的取值是有限的或者是可數(shù)無窮盡的值,X={x1,x2,x3,…,} 則稱X為離散隨機(jī)變量。如果X由全部實數(shù)或者由一部分區(qū)間組成,X={x|a≤x≤b}, -∞<a<b<∞,則稱X為連續(xù)隨機(jī)變量,連續(xù)隨機(jī)變量的取值是不可數(shù)及無窮盡的。
隨機(jī)變量在不同的條件下由于偶然因素影響,其可能取各種隨機(jī)變量不同的值,具有不確定性和隨機(jī)性,但這些取值落在某個范圍的概率是一定的,此種變量稱為隨機(jī)變量。隨機(jī)變量可以是離散型的,也可以是連續(xù)型的。簡單地說,隨機(jī)變量是指隨機(jī)事件的數(shù)量表現(xiàn)。
隨機(jī)試驗結(jié)果的量的表示。一個隨機(jī)試驗的可能結(jié)果(稱為基本事件)的全體組成一個基本空間Ω。隨機(jī)變量x是定義于Ω上的函數(shù),即對每一基本事件ω∈Ω,有一數(shù)值x(ω)與之對應(yīng)。
3.??????概率分布
概率分布(probability distribution)用來描述隨機(jī)變量或一簇隨機(jī)變量在每一個可能取到的狀態(tài)的可能性大小。我們描述概率分布的方式取決于隨機(jī)變量是離散的還是連續(xù)的。
(1)、離散型變量和概率質(zhì)量函數(shù):
離散型變量的概率分布可以用概率質(zhì)量函數(shù)(probability mass function, PMF)來描述。我們通常用大寫字母P來表示概率質(zhì)量函數(shù)。通常每一個隨機(jī)變量都會有一個不同的概率質(zhì)量函數(shù),并且讀者必須根據(jù)隨機(jī)變量來推斷所使用的PMF,而不是根據(jù)函數(shù)的名字來推斷。
概率質(zhì)量函數(shù)將隨機(jī)變量能夠取得的每個狀態(tài)映射到隨機(jī)變量取得該狀態(tài)的概率。概率質(zhì)量函數(shù)可以同時作用于多個隨機(jī)變量。這種多個變量的概率分布被稱為聯(lián)合概率分布(joint probability distribution)。P(X=x,Y=y)表示X=x和Y=y同時發(fā)生的概率。我們也可以簡寫為P(x,y)。
如果一個函數(shù)P是隨機(jī)變量x的PMF,必須滿足下面這幾個條件:
1)、P的定義域必須是x所有可能狀態(tài)的集合。
2)、x∈X, 0≤P(x)≤1.不可能發(fā)生的事件概率為0,并且不存在比這概率更低的狀態(tài)。類似的,能夠確保一定發(fā)生的事件概率為1,而且不存在比這概率更高的狀態(tài)。
3)、∑x∈XP(x)=1.我們把這條性質(zhì)稱之為歸一化的(normalized)。如果沒有這條性質(zhì),當(dāng)我們計算很多事件其中之一發(fā)生的概率時可能會得到大于1的概率。
(2)、連續(xù)型變量和概率密度函數(shù):
當(dāng)我們研究的對象是連續(xù)型隨機(jī)變量時,我們用概率密度函數(shù)(probability density function, PDF)而不是概率質(zhì)量函數(shù)來描述它的概率分布。如果一個函數(shù)p是概率密度函數(shù),必須滿足下面這幾個條件:
1)、p的定義域必須是x所有可能狀態(tài)的集合。
2)、x∈X,p(x)≥0.注意,我們并不要求p(x)≤1。
3)、∫p(x)dx=1.
概率密度函數(shù)p(x)并沒有直接對特定的狀態(tài)給出概率,相對的,它給出了落在面積為δx的無限小的區(qū)域內(nèi)的概率為p(x) δx。我們可以對概率密度函數(shù)求積分來獲得點集的真實概率質(zhì)量。特別地,x落在集合S中的概率可以通過p(x)對這個集合求積分來得到。在單變量的例子中,x落在區(qū)間[a, b]的概率是∫[a,b]p(x)dx
概率分布(probability distribution):或簡稱分布,是概率論的一個概念。使用時可以有以下兩種含義:
(1)、廣義地,它指稱隨機(jī)變量的概率性質(zhì),當(dāng)我們說概率空間(Ω、F、P)中的兩個隨機(jī)變量X和Y具有同樣的分布(或同分布)時,我們是無法用概率P來區(qū)別它們的。換言之,稱X和Y為同分布的隨機(jī)變量,當(dāng)且僅當(dāng)對任意事件A∈F,有P(X∈A)=P(Y∈A)成立。但是,不能認(rèn)為同分布的隨機(jī)變量是相同的隨機(jī)變量。事實上即使X與Y同分布,也可以沒有任何點ω使得X(ω)=Y(ω)。在這個意義上,可以把隨機(jī)變量分類,每一類稱作一個分布,其中的所有隨機(jī)變量都同分布。用更簡要的語言來說,同分布是一種等價關(guān)系,每一個等價類就是一個分布。需注意的是,通常談到的離散分布、均勻分布、伯努利分布、正態(tài)分布、泊松分布等,都是指各種類型的分布,而不能視作一個分布。
(2)、狹義地,它是指隨機(jī)變量的概率分布函數(shù)。設(shè)X是樣本空間(Ω、F)上的隨機(jī)變量,P為概率測度,則稱如下定義的函數(shù)是X的分布函數(shù)(distribution function),或稱累積分布函數(shù)(cumulative distribution function,簡稱CDF):FX(a)=P(X≤a),對任意實數(shù)a定義。具有相同分布函數(shù)的隨機(jī)變量一定是同分布的,因此可以用分布函數(shù)來描述一個分布,但更常用的描述手段是概率密度函數(shù)(probability density function, pdf)。
4.??????邊緣概率
有時候,我們知道了一組變量的聯(lián)合概率分布,但想要了解其中一個子集的概率分布。這種定義在子集上的概率分布被稱為邊緣概率分布(marginal probability distribution)。
例如,假設(shè)有離散型隨機(jī)變量x和y,并且我們知道P(x,y)。我們可以根據(jù)下面的求和法則(sum rule)來計算P(x):
對于連續(xù)型變量,我們需要用積分替代求和:p(x)=∫p(x,y)dy.
邊緣分布(Marginal Distribution)指在概率論和統(tǒng)計學(xué)的多維隨機(jī)變量中,只包含其中部分變量的概率分布。在實際應(yīng)用中,例如人工神經(jīng)網(wǎng)絡(luò)的神經(jīng)元互相關(guān)聯(lián),在計算它們各自的參數(shù)的時候,就會使用邊緣分布計算得到某一特定神經(jīng)元(變量)的值。
5.??????條件概率
在很多情況下,我們感興趣的是某個事件,在給定其它事件發(fā)生時出現(xiàn)的概率。這種概率叫做條件概率。我們將給定X=x,Y=y發(fā)生的條件概率記為P(Y=y |X=x)。這個條件概率可以通過下面的公式計算:
條件概率只在P(X=x)>0時有定義。我們不能計算給定在永遠(yuǎn)不會發(fā)生的事件上的條件概率。
條件概率(conditional probability):就是事件A在另外一個事件B已經(jīng)發(fā)生條件下的發(fā)生概率。條件概率表示為P(A|B),讀作”在B條件下A的概率”。
聯(lián)合概率:表示兩個事件共同發(fā)生的概率。A與B的聯(lián)合概率表示為P(A∩B)或者P(A,B)或者P(AB)。
邊緣概率:是某個事件發(fā)生的概率。邊緣概率是這樣得到的:在聯(lián)合概率中,把最終結(jié)果中不需要的那些事件合并成其事件的全概率而消失(對離散隨機(jī)變量用求和得全概率,對連續(xù)隨機(jī)變量用積分得全概率)。這稱為邊緣化(marginalization)。A的邊緣概率表示為P(A),B的邊緣概率表示為P(B)。需要注意的是,在這些定義中A與B之間不一定有因果或者時間順序關(guān)系。A可能會先于B發(fā)生,也可能相反,也可能二者同時發(fā)生。A可能會導(dǎo)致B的發(fā)生,也可能相反,也可能二者之間根本就沒有因果關(guān)系。
條件概率定義:設(shè)A與B為樣本空間Ω的兩個事件,其中P(B)>0。那么在事件B發(fā)生的條件下,事件A發(fā)生的條件概率為:P(A|B)=P(A∩B)/P(B),條件概率有時候也稱為后驗概率。
6.??????條件概率的鏈?zhǔn)椒▌t
任何多維隨機(jī)變量的聯(lián)合概率分布,都可以分解成只有一個變量的條件概率相乘的形式:
這個規(guī)則被稱為概率的鏈?zhǔn)椒▌t(chain rule)或者乘法法則(product rule)。
7.??????獨立性和條件獨立性
兩個隨機(jī)變量x和y,如果它們的概率分布可以表示成兩個因子的乘積形式,并且一個因子只包含x另一個因子只包含y,我們就稱這兩個隨機(jī)變量是相互獨立的(independent):
如果關(guān)于x和y的條件概率分布對于z的每一個值都可以寫成乘積的形式,那么這兩個隨機(jī)變量x和y在給定隨機(jī)變量z時是條件獨立的(conditionally independent):
我們可以采用一種簡化形式來表示獨立性和條件獨立性:x⊥y表示x和y相互獨立,x⊥y|z表示x和y在給定z時條件獨立。
在概率論和統(tǒng)計學(xué)中,兩事件R和B在給定的另一事件Y發(fā)生時條件獨立,類似于統(tǒng)計獨立性,就是指當(dāng)事件Y發(fā)生時,R發(fā)生與否和B發(fā)生與否就條件概率分布而言是獨立的。換句話講,R和B在給定Y發(fā)生時條件獨立,當(dāng)且僅當(dāng)已知Y發(fā)生時,知道R發(fā)生與否無助于知道B發(fā)生與否,同樣知道B發(fā)生與否也無助于知道R發(fā)生與否。
R和B在給定Y發(fā)生時條件獨立,用概率論的標(biāo)準(zhǔn)記號表示為:Pr(R∩B|Y)=Pr(R|Y)Pr(B|Y),也可以等價地表示為Pr(R|B∩Y)=Pr(R|Y)。
兩個隨機(jī)變量X和Y在給定第三個隨機(jī)變量Z的情況下條件獨立當(dāng)且僅當(dāng)它們在給定Z時的條件概率分布互相獨立,也就是說,給定Z的任一值,X的概率分布和Y的值無關(guān),Y的概率分布也和X的值無關(guān)。
8.??????期望、方差
函數(shù)f(x)關(guān)于某分布P(x)的期望(expectation)或者期望值(expected value)是指,當(dāng)x由P產(chǎn)生,f作用于x時,f(x)的平均值。對于離散型隨機(jī)變量,這可以通過求和得到:
對于連續(xù)型隨機(jī)變量可以通過求積分得到:
當(dāng)概率分布在上下文中指明時,我們可以只寫出期望作用的隨機(jī)變量的名稱來進(jìn)行簡化,例如Ex[f(x)]。如果期望作用的隨機(jī)變量也很明確,我們可以完全不寫腳標(biāo),就像E[f(x)]。默認(rèn)地,我們假設(shè)E[·]表示對方括號內(nèi)的所有隨機(jī)變量的值求平均。期望是線性的。
方差(variance)衡量的是當(dāng)我們對x依據(jù)它的概率分布進(jìn)行采樣時,隨機(jī)變量x的函數(shù)值會呈現(xiàn)多大的差異:
Var(f(x))=E[(f(x)-E[f(x)])2]
當(dāng)方差很小時,f(x)的值形成的簇比較接近它們的期望值。方差的平方根被稱為標(biāo)準(zhǔn)差(standard deviation)。
期望值:在概率論和統(tǒng)計學(xué)中,一個離散性隨機(jī)變量的期望值(或數(shù)學(xué)期望、或均值,亦簡稱期望)是試驗中每次可能的結(jié)果乘以其結(jié)果概率的總和。換句話說,期望值像是隨機(jī)試驗在同樣的機(jī)會下重復(fù)多次,所有那些可能狀態(tài)平均的結(jié)果,便基本上等同”期望值”所期望的數(shù)。需要注意的是,期望值并不一定等同于常識中的”期望”------“期望值”也許與每一個結(jié)果都不相等。(換句話說,期望值是該變量輸出值的平均數(shù)。期望值并不一定包含于變量的輸出值集合里。)
期望值數(shù)學(xué)定義:如果X是在概率區(qū)間(Ω,P)中的隨機(jī)變量,那么它的期望值E[X]的定義是:E[X]=∫ΩXdP,并不是每一個隨機(jī)變量都有期望值的,因為有的時候這個積分不存在。如果兩個隨機(jī)變量的分布相同,那它們的期望值也相同。
如果X是離散的隨機(jī)變量,輸出值為x1,x2,…,和輸出值相應(yīng)的概率為p1,p2,…(概率和為1)。若級數(shù)∑ipixi絕對收斂,那么期望值E[X]是一個無限數(shù)列的和:E[X]=∑pixi
期望值性質(zhì):
(1)、期望值E是線性函數(shù):E[aX+bY]=aE[X]+bE[Y],X和Y為在同一概率空間的兩個隨機(jī)變量(可以獨立或者非獨立),a和b為任意實數(shù)。
(2)、一般的說,一個隨機(jī)變量的函數(shù)的期望值并不等于這個隨機(jī)變量的期望值的函數(shù)。
(3)、在一般情況下,兩個隨機(jī)變量的積的期望值不等于兩個隨機(jī)變量的期望值的積。特殊情況是當(dāng)這兩個隨機(jī)變量是相互獨立的時候E[XY]=E[X]E[Y](也就是說一個隨機(jī)變量的輸出不會影響另一個隨機(jī)變量的輸出)。
在統(tǒng)計學(xué)中,當(dāng)估算變量的期望值時,經(jīng)常用到的方法是重復(fù)測量此變量的值,然后用所得數(shù)據(jù)的平均值來作為此變量的期望值的估計。在概率分布中,期望值和方差或標(biāo)準(zhǔn)差是一種分布的重要特征。
期望值也可以通過方差計算公式來計算方差:Var(X)=E[X2]-(E[X])2。
方差(Variance):在概率論和統(tǒng)計學(xué)中,一個隨機(jī)變量的方差描述的是它的離散程度,也就是該變量離其期望值的距離。一個實隨機(jī)變量的方差也稱為它的二階炬或二階中心動差,恰巧也是它的二階累積量。這里把復(fù)雜說白了,就是將各個誤差將之平方(而非取絕對值),使之肯定為正數(shù),相加之后再除以總數(shù),透過這樣的方式來算出各個數(shù)據(jù)分布、零散(相對中心點)的程度。繼續(xù)延伸的話,方差的算術(shù)平方根稱為該隨機(jī)變量的標(biāo)準(zhǔn)差(此為相對各個數(shù)據(jù)點間)。
方差定義:設(shè)X為服從分布F的隨機(jī)變量,如果E[X]是隨機(jī)變數(shù)X的期望值(平均數(shù)μ=E[X]),隨機(jī)變量X或者分布F的方差為: Var(X)=E[(X-μ)2] ,這個定義涵蓋了連續(xù)、離散、或兩者都有的隨機(jī)變數(shù)。方差亦可當(dāng)作是隨機(jī)變數(shù)與自己本身的協(xié)方差:Var(X)=Cov(X,X)。
方差表示式展開成為:Var(X)=E[X2-2XE[X]+(E[X])2]=E[X2]-2E[X]E[X]+(E[X])2=E[X2]-(E[X])2,上述的表示式可記為”平方的平均減掉平均的平方”。
方差不會是負(fù)的。
標(biāo)準(zhǔn)差(Standard Deviation, SD),數(shù)學(xué)符號σ(sigma),在概率統(tǒng)計中最常使用作為測量一組數(shù)值的離散程度之用。標(biāo)準(zhǔn)差定義:為方差開算術(shù)平方根,反映組內(nèi)個體間的離散程度。標(biāo)準(zhǔn)差與期望值之比為標(biāo)準(zhǔn)離差率。
簡單來說,標(biāo)準(zhǔn)差是一組數(shù)值自平均值分散開來的程度的一種測量觀念。一個較大的標(biāo)準(zhǔn)差,代表大部分的數(shù)值和其平均值之間差異較大;一個較小的標(biāo)準(zhǔn)差,代表這些數(shù)值較接近平均值。
總體的標(biāo)準(zhǔn)差:基本定義:
以上內(nèi)容摘自:《深度學(xué)習(xí)中文版》和?維基百科
以下是分別采用C++和OpenCV實現(xiàn)的求矩陣的均值、方差、標(biāo)準(zhǔn)差code:
#include "funset.hpp"
#include <math.h>
#include <iostream>
#include <string>
#include <vector>
#include <opencv2/opencv.hpp>
#include "common.hpp"// =============================== 計算均值、方差、標(biāo)準(zhǔn)差 =====================
template<typename _Tp>
int meanStdDev(const std::vector<std::vector<_Tp>>& mat, double* mean, double* variance, double* stddev)
{int h = mat.size(), w = mat[0].size();double sum{ 0. }, sqsum{ 0. };for (int y = 0; y < h; ++y) {for (int x = 0; x < w; ++x) {double v = static_cast<double>(mat[y][x]);sum += v;sqsum += v * v;}}double scale = 1. / (h * w);*mean = sum * scale;*variance = std::max(sqsum*scale - (*mean)*(*mean), 0.);*stddev = std::sqrt(*variance);return 0;
}int test_meanStdDev()
{std::vector<std::vector<float>> vec{ { 1.2f, 2.5f, 5.6f, -2.5f },{ -3.6f, 9.2f, 0.5f, 7.2f },{ 4.3f, 1.3f, 9.4f, -3.4f } };const int rows{ 3 }, cols{ 4 };fprintf(stderr, "source matrix:\n");fbc::print_matrix(vec);double mean1 = 0., variance1 = 0., stddev1 = 0.;if (fbc::meanStdDev(vec, &mean1, &variance1, &stddev1) != 0) {fprintf(stderr, "C++ implement meanStdDev fail\n");return -1;}fprintf(stderr, "\nc++ implement meanStdDev: mean: %f, variance: %f, standard deviation: %f\n",mean1, variance1, stddev1);cv::Mat mat(rows, cols, CV_32FC1);for (int y = 0; y < rows; ++y) {for (int x = 0; x < cols; ++x) {mat.at<float>(y, x) = vec.at(y).at(x);}}cv::Scalar mean2_, stddev2_;cv::meanStdDev(mat, mean2_, stddev2_);auto mean2 = mean2_.val[0];auto stddev2 = stddev2_.val[0];auto variance2 = stddev2 * stddev2;fprintf(stderr, "\nopencv implement meanStdDev: mean: %f, variance: %f, standard deviation: %f\n",mean2, variance2, stddev2);return 0;
}
執(zhí)行結(jié)果如下:
以下是采用Eigen實現(xiàn)的求矩陣的均值、方差、標(biāo)準(zhǔn)差 code:
#include "funset.hpp"
#include <math.h>
#include <iostream>
#include <vector>
#include <string>
#include <opencv2/opencv.hpp>
#include <Eigen/Dense>
#include "common.hpp"int test_meanStdDev()
{std::vector<std::vector<float>> vec{ { 1.2f, 2.5f, 5.6f, -2.5f },{ -3.6f, 9.2f, 0.5f, 7.2f },{ 4.3f, 1.3f, 9.4f, -3.4f } };const int rows{ 3 }, cols{ 4 };std::vector<float> vec_;for (int i = 0; i < rows; ++i) {vec_.insert(vec_.begin() + i * cols, vec[i].begin(), vec[i].end());}Eigen::Map<Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> m(vec_.data(), 1, rows * cols);fprintf(stderr, "source matrix:\n");std::cout << m << std::endl;Eigen::MatrixXf mean = m.rowwise().mean(); //<==> m.rowwise().sum() / m.cols();float mean_ = mean(0, 0);Eigen::MatrixXf sqsum = (m * m.transpose()).rowwise().sum();float sqsum_ = sqsum(0, 0);float scale = 1. / (rows*cols);float variance_ = sqsum_ * scale - mean_ * mean_;float stddev_ = std::sqrt(variance_);fprintf(stdout, "\nEigen implement:\n");fprintf(stdout, "mean: %f, variance: %f, standard deviation: %f\n", mean_, variance_, stddev_);return 0;
}
執(zhí)行結(jié)果如下:
由以上結(jié)果可見:C++、OpenCV、Eigen實現(xiàn)結(jié)果是一致的。
GitHub: https://github.com/fengbingchun/NN_Test https://github.com/fengbingchun/Eigen_Test
總結(jié)
以上是生活随笔為你收集整理的概率论中均值、方差、标准差介绍及C++/OpenCV/Eigen的三种实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++11中头文件chrono的使用
- 下一篇: C++11中头文件thread的使用