數據分析與數據挖掘 - 05統計機率

一 統計學基礎運算

1 方差的計算

在統計學中爲了觀察數據的離散程度,咱們須要用到標準差,方差等計算。咱們如今擁有如下兩組數據,表明着兩組同窗們的成績,如今咱們要研究哪一組同窗的成績更穩定一些。方差是中學就學過的知識,可能有的同窗忘記了 ,一塊兒來回顧下。


A組 = [50,60,40,30,70,50] B組 = [40,30,40,40,100]


爲了便於理解,咱們能夠先使用平均數來看,它們的平均數都是50,沒法比較出他們的離散程度的差別。針對這樣的狀況,咱們能夠先把分數減去平均分進行平方運算後,再取平均值。
image.png
想上面這樣就是方差的計算方式,就是數組中的每個數減去平均值,而後再分別計算它們的平方值,最後再取平均數的運算就叫方差。方差很適合用來研究數據的離散程度,可是會存在兩個問題:python

  • 有時數值會變得特別大
  • 運算的結果變成了原來的平方

爲了解決上面的問題,咱們會把最後的結果開方,就像這樣:
image.png
在方差的結果上,開一個根號,運算出來的結果就叫作標準差了。經過標準差的計算後,咱們一下就可以看出來,標準差越小的,證實其成績越穩定。算法

2 使用numpy計算標準差和方差

import numpy as np

# 建立一個二維數組
arr = np.array([[3, 7, 25, 8, 15, 20],
                [4, 5, 6, 9, 14, 21]])

# 計算方差
print(arr.var())
print(np.var(arr))
# 計算標準差
print(arr.std())
print(np.std(arr))

# 計算軸0方向方差
print(arr.var(axis=0))
print(np.var(arr, axis=0))
# 計算軸1方向方差
print(arr.var(axis=1))
print(np.var(arr, axis=1))

# 計算軸0方向標準差
print(arr.std(axis=0))
print(np.std(arr, axis=0))
# 計算軸1方向標準差
print(arr.std(axis=1))
print(np.std(arr, axis=1))

二 二項式定理

1 二項式係數

二項式定理很是重要,是理解和應用機率分佈的前提,這都是中學學過的,咱們一塊兒來回顧一下。





2ab這一項能夠用排列組合的知識來理解,從(a+b)(a+b)分別選出a和b的可能性,那麼一共有兩種狀況:
數組

  • 從第一個(a+b)中選出a,從第二個(a+b)選出b
  • 從第二個(a+b)中選出a,從第一個(a+b)中選出b


因此ab左邊的係數就是2,這個2就是二項式係數,同理:





WechatIMG62副本.png
咱們從上邊的兩個例子中能夠看到,不管是第一個例子中的從兩個括號中選出一個b,仍是後邊的從3個括號中選出一個b(這裏咱們把b做爲研究對象,其實不管是誰都是同樣的)都是組合的問題,因此結合咱們中學學過的知識二項係數能夠總結爲以下公式:
image.png
在統計學中,對於二項分佈來講,二項係數是必不可少的知識,關於二項分佈咱們後邊會講到。dom

2 用Python得到二項係數

首先須要聲明一個函數,函數接收兩個參數,一個是n,一個是k,返回值爲其二項係數的值。函數

import itertools
import numpy as np

# 等待排列的數組
arr = [1, 2, 3, 4, 5]
# 排列的實現P
print(list(itertools.permutations(arr, 3)))

# 組合的實現C
print(list(itertools.combinations(arr, 3)))


# 獲取二項係數的函數
# 支持兩個參數,第一個是n,第二個是k
def get_binomial_coefficient(n, k):
    return len(list(itertools.combinations(np.arange(n), k)))


print(get_binomial_coefficient(3, 1))

使用二項式係數就能夠展開(a+b)^n,因此有二項式定理,以下:
image.png學習

三 獨立實驗與重複實驗

寺廟在中國已經遍及大江南北了,一天小王和小李二人出遊,登山後,偶遇一寺廟,寺廟中有一個大師,善占卜。因而二人決定請大師幫忙占卜一次。大師見二人結伴而來,便問二人是占卜獨卦,仍是連卦呢?二人不解,何爲獨卦,何爲連卦?因而大師解答到:獨卦爲第一人占卜後,將卦籤放回籤桶中後,再進行第二次占卜。連卦爲第一人占卜後,已抽出的卦籤不放回籤桶中,直接進行第二次占卜。人工智能

假設籤筒中,只有5根籤,其中2根是上籤,而其餘3根是下籤。小王先抽籤,小王抽籤的行爲記爲S,小李抽籤的行爲記爲T。在獨卦的占卜規則下,S的結果並不影響T的結果。也就是說無論小王是否抽中上籤,小李抽中上籤的機率都是2/5。而在連卦的占卜規則下,S的結果對T的結果產生影響。由於小王抽完籤以後,並不把籤放回桶中。若是小王抽中上籤,那麼小李抽中上籤的機率就是1/4,若是小王沒有抽中上籤,那麼小李抽中上籤的機率就是2/4。在獨卦的占卜規則下,兩次抽籤行爲S與T的。它們的結果互不影響,咱們在統計學中稱S與T是獨立試驗。


當S與T相互獨立時,S中發生事件A和T中發生的事件B的機率P能夠表示爲:


P(A∩B) = P(A) * P(B)


顯然,在獨卦的占卜規則下,小王和小李都抽中上籤的機率是4/25。
3d

如今有這樣一個場景,擲骰子的遊戲,仍然是小王和小李一塊兒玩,每人拿3顆骰子。遊戲規則是三顆骰子每一個擲一次,最後誰的點數大誰贏。這裏無論他們擲骰子多少次,每一次的結果對於其餘次的結果都不會產生影響,因此他們都是相互獨立的實驗。code

對於這樣反覆的獨立試驗,咱們稱其爲重複試驗或者叫獨立重複試驗。如今咱們把擲3次骰子,每一次擲骰子時,其中2顆骰子都出現1的狀況畫圖以下(X表明其餘數字):
image.png
咱們先來看一下第一次擲骰子的狀況前兩顆骰子爲1,第三顆骰子爲其餘數字的機率分別爲1/六、1/六、5/6,由於每一次的試驗都是相互獨立的,因此發生的機率爲1/6×1/6×5/6。三次擲骰子,每一次有兩顆骰子是1的狀況的種類爲3種,因爲3種狀況是互斥的(不可能同時發生),因此機率應該爲3次的機率相加。也就是:3×(1/6)²×5/6。A事件和B事件相互排斥時,公式能夠表示爲:


P(A∪B)=P(A)+P(B)


根據以上試驗結果,可得重複試驗的機率公式爲:
WechatIMG2.png
重複試驗對於下一章咱們要學習的二項分佈的理解很是有幫助,因此必定要理解。若是不是特別的理解,你能夠如今把上邊擲骰子的狀況修改爲爲4顆骰子擲6次,每一次出現兩個1的狀況畫圖從新按照我們上邊的思路梳理一下,相信你就已經可以掌握了。


練習題:
如今有5道4選1的問題。A同窗對這5道題目徹底不會,但在亂答的狀況下,可以答對一半以上的機率是多少,用代碼實現一下。對象

import itertools
import numpy as np

"""
題目解析:答對一半以上的狀況分別爲3題,4題和5題
不用考慮其順序,答對任意題目均可以,因此這是一個組合的問題
"""


# 聲明一個函數來求組合問題
def get_binomial_coefficient(n, k):
    return len(list(itertools.combinations(np.arange(n), k)))


# 每題答對的機率
P_true = 1 / 4
# 每題答錯的機率
P_false = 3 / 4

# 求答對0到5題的組合狀況
# 答對0題的組合狀況
zero = get_binomial_coefficient(5, 0)
# 答對1題的組合狀況
one = get_binomial_coefficient(5, 1)
# 答對2題的組合狀況
two = get_binomial_coefficient(5, 2)
# 答對3題的組合狀況
three = get_binomial_coefficient(5, 3)
# 答對4題的組合狀況
four = get_binomial_coefficient(5, 4)
# 答對5題的組合狀況
five = get_binomial_coefficient(5, 5)
# # # 答對一半以上的機率(答對3題、4題、5題)
last = three * pow(P_true, 3) * pow(P_false, 2) + four * pow(P_true, 4) * pow(P_false, 1) + five * pow(P_true, 5) * pow(
    P_false, 0)
print(last)

學霸的世界:有一兩個不太肯定的,蒙一下吧,考完了很沒信心,感受考得不怎麼樣,結果是除了蒙的,其餘的都對了,數學140分。

學渣的世界:好多不會的,我感受選這個就應該對,畢竟蒙對的經驗很豐富,感受考得還能夠,結果是會的馬虎作錯了,蒙的就對了一個,數學89分,啪啪打臉。

根據機率結果可知,亂答看似機率還不錯,但實際運算出來後機率低的可憐,因此每次亂答後,實際得分總比想象中的得分低。

四 ∑符號及其意義

在之前,咱們表示a1到a5的和會這樣寫:S5 = a1 + a2 + a3 + a4 + a5。同理,若是咱們要表示a1到a10的和會這樣寫:S10 = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10。若是咱們要表示a1到a1000的和咱們會這樣寫S1000 = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + …… + a1000。可是中間的……總給人一種很差的感受,就像咱們在學習二項定理時的表達方式,總感受特別的冗長。爲了解決這個問題,咱們就引入了Σ(讀西格瑪)符號,也能夠叫作求和符號。像上邊的表示a1到a1000的和咱們能夠這樣表達:



Σ(讀西格瑪)符號在數學中很是的常見,在之後的學習中,你也幾乎能夠在任意一個算法模型中見到這個符號,因此它的特色也必定要掌握。


Σ可使用分配率,咱們一塊兒來看一個例子:
WechatIMG64.png
下面咱們一塊兒來學習一下幾個關於Σ的計算公式,記住它們,之後你的計算將會很是的方便。


公式一及其證實過程以下:
WechatIMG65.png
公式二及其證實過程以下:
image.png
Σ的計算公式咱們暫時先學習這兩個,其餘的公式後邊用到的時候咱們再來結合着場景進行學習。

五 隨機變量

終於到了隨機變量,隨機變量後邊就是機率分佈的知識了,隨機變量在人工智能領域中的應用很是的廣泛。首先說一下隨機變量的分類,隨機變量分爲離散型隨機變量和連續型隨機變量。離散型隨機變量的基本定義就是在實數範圍內取值並不連續,或者說他的取值不是一個區間,而是一些固定的值。連續型隨機變量則相反,它的取值是一個區間,在實數範圍內是連續的。


仍是舉個例子比較形象,請看下面的示例:

離散型隨機變量:一次擲20個硬幣,k個硬幣正面朝上,k是隨機變量,k的取值只能是天然數0,1,2,…,20,而不能取小數3.五、無理數√20,於是k是離散型隨機變量。

連續型隨機變量:公共汽車每15分鐘一班,某人在站臺等車時間x是個隨機變量,x的取值範圍是[0,15),它是一個區間,從理論上說在這個區間內可取任一實數3.五、√20等,於是稱這隨機變量是連續型隨機變量。

六 伯努利分佈

伯努利分佈也被稱爲「零一分佈」或「兩點分佈」。從名字上,咱們就可以看出來,伯努利分佈中事件的發生就兩種狀況。伯努利分佈指的是一次隨機試驗,結果只有兩種。生活中這樣的場景不少,拋硬幣是其中一個,咱們拋一次硬幣,其結果只有正面或反面。或某一個事件的成功和失敗,病情的康復或未康復等等。


咱們用字母x來表示隨機變量的取值,而且它的機率計算公式爲:


P(x=1) = pP(x=0) = 1-p


當x=1時,它的機率爲p,當x-0時,它的機率爲1-p,咱們就稱隨機變量x服從伯努利分佈。


練習:
甲和乙,兩我的用一個均勻的硬幣來賭博,均勻的意思就是不存在做弊行爲,硬幣拋出正面和反面的機率各佔一半。硬幣拋出正面時,甲輸給乙一塊錢,拋出反面時,乙輸給甲一塊錢。咱們來用Python實現這一過程和輸贏的總金額呈現的分佈狀況。
分析:
咱們用數字1來表示拋得的結果爲正面,用數字-1來表示拋得的結果爲反面。爲了呈現出機率分佈的狀況,咱們須要有足夠多的人來參與這個遊戲,而且讓他們兩兩一組來進行對決。

# 導入 matplotlib庫,用來畫圖,關於畫圖咱們後邊會有專門的章節進行講解
import matplotlib.pyplot as plt

# 導入numpy
import numpy as np

n_person = 200
n_times = 500

t = np.arange(n_times)

# 建立包含1和-1兩種類型元素的隨機數組來表示輸贏
# *2 -1 是爲了隨機出1 和-1,(n_person, n_times)表示生成一個200*500的二維數組
steps = 2 * np.random.random_integers(0, 1, (n_person, n_times)) - 1

# 計算每一組的輸贏總額
amount = np.cumsum(steps, axis=1)

# 計算平方
sd_amount = amount ** 2

# 計算全部參加賭博的組的平均值
average_amount = np.sqrt(sd_amount.mean(axis=0))
print(average_amount)

# 畫出數據,用綠色表示,並畫出平方根的曲線,用紅色表示
plt.plot(t, average_amount, 'g.', t, np.sqrt(t), 'r')
plt.show()

七 二項分佈

離散型隨機變量最多見的分佈就是二項分佈,咱們仍是以擲骰子爲例子來開始這一章節的知識講解。好比咱們擁有一個骰子,那麼每擲一次骰子的取值可能性爲一、二、三、四、五、6,這些取值每一次的可能性都爲六分之一,由於每一次擲骰子的行爲都是獨立的,第一次的結果並不影響第二次的任何行爲和結果,這也叫機率的獨立性。


總結一下,它一共有兩個特色:

  • 每一次事件的機率都大於等於0,若是咱們用P來表示機率,用X來表示事件,其數學表示就是P(X)>=0
  • 全部事件的機率的總和爲1,也就是說骰子一共有6個面,咱們每投擲一次骰子,必定會得到一、二、三、四、五、6數字其中的一個,其數學表示就是∑P(Xi)=1


如今有兩我的A和B在進行某種對決,瓶子裏有兩個紅球,一個白球,從裏面隨機抽取,抽到紅球A獲勝,抽到白球B獲勝,抽完球再放進去。顯然,A獲勝的機率爲2/3,在這種狀況下,A能贏的次數就是一個隨機變量了,而這個隨機變量是如何分佈的呢?


假設對局3次,A能贏的次數爲x,則x的值有多是0、一、二、3中的一個,關於其分別出現的機率,咱們能夠用反覆試驗的機率來進行求解(這其實就是3重伯努利試驗)。


機率計算結果以下:
image.png
將x的機率分佈整理成表,並替換成二項係數以下圖:
image.png
這就是二項分佈的典型例子啦。通常來講,成功機率爲p的試驗,獨立重複n次後的成功次數爲X的機率分佈,被稱爲關於發生機率爲p、次數爲n的二項分佈。


這中狀況下,X=k(k=0、一、二、…、n)的機率爲n次重複中有k次成功(一次成功機率爲p),整理後的公式以下:
image.png
那麼二項分佈又與伯努利分佈是什麼樣的關係呢?看着好像感受有一些類似的地方,這種結果爲成功或失敗,勝或負等,結果是二選一的試驗,被稱爲伯努利試驗。在伯努利試驗中,已知其中一個結果發生的機率(多數取成功的機率)時,此伯努利試驗重複n次(也叫n重伯努利試驗)時,其事件發生的次數(成功次數)遵循二項分佈。若是二項分佈中的試驗次數變成了1次,那麼這就叫作伯努利試驗了,其隨機變量是服從二項分佈的。因此伯努利分佈是二項分佈在n=1時的特例,這就是它們的關係了。


最後總結一下二項分佈,以下圖:
WechatIMG67.png

八 條件機率

如今假設咱們有兩個事件,事件A和事件B。當事件B發生時,事件A發生的機率,這就是條件機率的理解。條件機率公式是:


P(A|B) = P(A∩B)÷P(B)

這個公式看似有點抽象,但若是咱們把它變形爲
P(B) * P(A|B) = P(A∩B),**就很好理解,P(B)表示事件B發生的機率,肯定了事件B發生的機率再乘以P(A|B)天然就是事件A和事件B同時發生的機率。P(A|B)就是事件B發生時事件A發生的機率,P(A∩B)指的是事件A和事件B同時發生的機率。

同理,可得:

P(B|A) = P(A∩B)÷P(A)

把兩個公式變形:


P(A∩B) = P(B) * P(A|B)
P(A∩B) = P(A) * P(B|A)


便可推導出:


P(A|B) = P(B|A) * P(A) / P(B)

這就是簡單貝葉斯公式和它的推導過程,貝葉斯定理在人工智能領域但是很是重要的知識點,將來你會學到不少貝葉斯模型的,好比高斯貝葉斯、多項式貝葉斯、伯努利貝葉斯等等的分類器。


練習:

如今假設一天之中,我餓了的機率是10%,我餓了而且在吃飯的機率是50%,我吃飯的機率是40%
問:我吃飯的時候餓了的機率。


把我餓了看做事件A,則P(A) = 10%,把我吃飯的機率看做事件B,則P(B) = 40%,已知P(B|A) = 50%,則P(A|B) = P(B|A) * P(A) / P(B) = 0.5 * 0.1 / 0.4 = 12.5%

九 全機率

全機率但是機率論中很是重要的知識點,也關係着後邊咱們對貝葉斯定理進行深刻的推導。那麼什麼又是全機率呢?
先從一個故事開始講解一下,拿上班的道路選擇舉例說明吧。

我天天上班一共有4條路能夠選擇,咱們如今把這4條路編成號碼,分別是1號路到4號路。我天天會選擇不一樣的路進行上班,來碰一下本身運氣。如今我天天選擇1號路上班的機率是20%,2號路的機率是30%,3號路的機率是10%,4號路的機率是40%。可是北京的路很糟糕,尤爲是上班的高峯期,每一條路都有可能擁堵。如今1號路堵的機率爲30%,2號路堵的機率是40%,3號路堵的機率是50%,4號路堵的機率是25%。一旦發生擁堵的狀況我必定會遲到,如今來求一下我上班不遲到的機率。

這道題目首先要理解的就是若是我想要上班不遲到,那麼路上就不能遇到擁堵的狀況,也就是咱們如今要把擁堵的機率,轉換成爲不擁堵的機率。那麼對應的把擁堵的機率換算成不擁堵的機率就是1號路不堵的機率爲70%,2號路不堵的機率是60%,3號路不堵的機率是50%,4號路堵的不機率是75%。換算完成後,下一步就是計算出我選擇了其中一條路,而且這條路沒有發生擁堵的機率。


首先我選擇1號路的機率是20%,也就是0.2,而且1號路不擁堵的機率爲70%,就是0.7,那麼這件事情發生的機率就是0.20.7,結果等於0.14。這裏有兩個事件,事件A是我選擇了1號路,事件B是1號路不擁堵,那麼能夠用P(AB)來進行機率的表示。也就是P(AB)=0.14,當我選擇了1號路,而且一號路不擁堵的機率是0.14。我選擇2號路的機率是0.3,2號路不擁堵的機率是0.6,這個時候我把事件A當作是2號路不擁堵,事件B當作是我選擇了2號路,那麼就能夠寫成P(AB)=0.18。那麼如今咱們來看一下我選擇了3號路,而且3號路不堵的機率吧,就是0.10.5 = 0.05。同理,我選擇了4號路,而且4號路不堵的機率是0.4*0.75 = 0.3。那麼最終我上班不遲到的機率就是0.14+0.18+0.05+0.3=0.67。


以上就是全機率的計算過程。咱們來總結一下全機率公式。這裏咱們把上班不遲到的這件事情叫作事件A,它能夠表示爲P(A)。選擇上班路線的事件叫作事件B,那麼4條路的選擇機率分別能夠表示爲P(B1)=0.二、P(B2)=0.三、P(B3)=0.一、P(B4)=0.4。那麼分別對應着4條路,而且選擇後它們不堵的機率能夠表示爲P(A|B1)=0.七、P(A|B2)=0.六、P(A|B3)=0.五、P(A|B4)=0.75。

也就是說,我上班不遲到的全機率的計算方法就是


P(A)=P(A|B1)P(B1)+P(A|B2)P(B21)+P(A|B3)P(B3)+P(A|B4)P(B4)
**
以上只有4種狀況的發生,那麼針對於n中狀況的全機率公式,咱們能夠這樣寫P(A)=P(A|B1)P(B1) + P(A|B2)P(B2) + ... + P(A|Bn)P(Bn),進一步簡化公式,用求和符號Σ(西格瑪)來進行表示就是:




以上這就是全機率公式和他的推導過程。

十 貝葉斯定理

上面的章節咱們分別學習了簡單貝葉斯公式和全機率公式,如今咱們把全機率公式A和B作一個互換,可得:





把如今的P(B)帶入到簡單貝葉斯公式中,並替換P(B),可得:





這個最終的公式就叫作貝葉斯定理,下面咱們用一個經典的題目來練習一下。

有一種疾病,發病率爲千分之一。目前的基因檢測技術,只要發病了就必定可以檢測到。但若是沒有發病的話,其誤診的機率爲百分之五。這裏咱們用陽性表明生病了,這是醫院裏的檢測報告的術語。如今一我的的化驗結果呈陽性(結果表明它得病了),求這我的真實患病的機率。


這道題目的解題思路是,首先咱們要列出已知條件:

  • 第一個已知條件是這種疾病的發病率爲千分之一,那麼用能夠用P(病)=0.001來表示。
  • 第二個已知條件是隻要發病了就必定可以檢測到,那麼也就是P(陽性|病)=1,也就是生病了那麼其檢測結果就是陽性,由於陽性表明着生病。
  • 第三個條件是誤診率爲百分之五,也就是P(陽性|健康)=0.05。


梳理清楚了三個條件,那麼問題是其化驗結果呈陽性,其真實的患病機率是多少,其實求的就是P(病|陽性)的值是多少?

  1. 根據簡單貝葉斯公式來進行計算一下,也就是P(病|陽性)=P(陽性|病)P(病)/P(陽性)。
  2. 進一步的把P(陽性)換算成全機率公式P(陽性)=P(病)P(陽性|病)+P(健康)P(陽性|健康)。
  3. 最終獲得P(病|陽性)=P(陽性|病)P(病)/(P(病)P(陽性|病)+P(健康)P(陽性|健康))


P(病|陽性) = 1 * 0.001 / (0.001 * 1 + 0.999 * 0.05) = 0.0196 = 1.96%


這一章到這裏就結束了,最後留一個小題目:垃圾郵件篩選


判斷郵件標題中包含"購買商品,不是廣告",這樣一個郵件是垃圾郵件嗎?

咱們經過分詞技術已經把"購買商品,不是廣告"切分爲4個單詞,分別是購買、商品、不是、廣告。
在已知的數據樣本中,共有36封郵件。其中的24封郵件爲正常郵件,12封郵件爲垃圾郵件。其中正常郵件包含"購買"這個詞的有2封,包含"商品"的郵件有4封,包含"不是"的郵件有4封,包含"廣告"的郵件有5封。
在垃圾郵件中包含"購買"這個詞的有5封,包含"商品"的郵件有3封,包含"不是"的郵件有3封,包含"廣告"的郵件有3封。注:一封郵件標題能夠包含一個或多個關鍵詞。

問題:判斷一封新來的郵件,標題是"購買商品,不是廣告",是正常郵件仍是垃圾郵件。 思路提示:求的就是P("購買商品,不是廣告")P("正常")的機率大仍是P("購買商品,不是廣告")P("垃圾")的機率大,誰的機率大結果就是誰。

相關文章
相關標籤/搜索