所謂機器學習和深度學習, 背後的邏輯都是數學, 因此數學基礎在這個領域很是關鍵, 而統計學又是重中之重, 機器學習從某種意義上來講就是一種統計學習。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實現了樣本的均值,方差,協方差和相關係數。