1. 程式人生 > >資料科學中的常見的6種概率分佈(Python實現)

資料科學中的常見的6種概率分佈(Python實現)

作者:Pier Paolo Ippolito@南安普敦大學 編譯:機器學習演算法與Python實戰(微信公眾號:tjxj666) 原文:https://towardsdatascience.com/probability-distributions-in-data-science-cce6e64873a7 ![](https://imgkr.cn-bj.ufileos.com/c6847742-fb46-475d-9cca-0cd063cce7cf.png) ## 介紹 擁有良好的統計背景對於資料科學家的日常工作可能會大有裨益。每次我們開始探索新的資料集時,我們首先需要進行探索性資料分析(EDA),以瞭解某些特徵的概率分佈是什麼。如果我們能夠了解資料分佈中是否存在特定模式,則可以量身定製最適合我們的機器學習模型。這樣,我們將能夠在更短的時間內獲得更好的結果(減少優化步驟)。實際上,某些機器學習模型被設計為在某些分佈假設下效果最佳。因此,瞭解我們正在使用哪個概率分佈可以幫助我們確定最適合使用哪些模型。 ## 不同型別的資料 每次我們使用資料集時,我們的資料集都會代表總體的樣本。然後使用這個樣本,我們可以嘗試瞭解其概率分佈,以便我們可以使用它對總體進行預測。 假設我們要根據一組資料來預測房屋的價格,我們可以找到一個包含舊金山所有房價的資料集(我們的樣本),進行一些統計分析之後,我們就可以對美國其他任何城市的房價做出相當準確的預測(我們的總體)。 資料集由兩種主要型別的資料組成:數值(例如整數,浮點數)和標籤(例如名字,電腦品牌)。 數值資料還可以分為其他兩類:離散和繼續。離散資料只能採用某些值(例如,學校中的學生人數),而連續資料可以採用任何實際或分數值(例如,身高和體重的概念)。 從離散隨機變數中,可以計算出概率質量函式,而從連續隨機變數中,可以得出概率密度函式。 概率質量函式給出了變數可以等於某個值的概率,概率密度函式的值本身並不是概率,需要在給定範圍內進行積分。 自然界中存在許多不同的概率分佈,在本文中,我將向大家介紹資料科學中最常用的概率分佈。 ![概率分佈流程圖](https://imgkr.cn-bj.ufileos.com/6172dfa7-d9dc-4645-b2bf-2b3d7583882e.png) 在本文中,我將提供有關如何建立每個不同概率分佈的程式碼。首先,讓我們匯入所有必要的庫: ``` import pandas as pd import numpy as np import matplotlib.pyplot as plt import scipy.stats as stats import seaborn as sns ``` ## 伯努利分佈 伯努利分佈是最容易理解的分佈之一,可用作匯出更復雜分佈的起點。這種分佈只有兩個可能的結果,一個簡單的例子就是拋擲偏斜/無偏硬幣。在此示例中,可以認為結果可能是正面的概率等於p,而對於反面則是(1-p)(包含所有可能結果的互斥事件的概率總和為1)。 ``` probs = np.array([0.75, 0.25]) face = [0, 1] plt.bar(face, probs) plt.title('Loaded coin Bernoulli Distribution', fontsize=12) plt.ylabel('Probability', fontsize=12) plt.xlabel('Loaded coin Outcome', fontsize=12) axes = plt.gca() axes.set_ylim([0,1]) ``` ![](https://imgkr.cn-bj.ufileos.com/ce4af8ac-4450-4228-9397-160c229086d1.png) ## 均勻分佈 均勻分佈可以很容易地從伯努利分佈中得出。在這種情況下,結果的數量可能不受限制,並且所有事件的發生概率均相同。例如擲骰子,存在多個可能的事件,每個事件都有相同的發生概率。 ``` probs = np.full((6), 1/6) face = [1,2,3,4,5,6] plt.bar(face, probs) plt.ylabel('Probability', fontsize=12) plt.xlabel('Dice Roll Outcome', fontsize=12) plt.title('Fair Dice Uniform Distribution', fontsize=12) axes = plt.gca() axes.set_ylim([0,1]) ``` ![](https://imgkr.cn-bj.ufileos.com/1257ec61-1ebe-4f91-93bf-f4ee76be2820.png) ## 二項分佈 二項分佈被認為是遵循伯努利分佈的事件結果的總和。因此,二項分佈用於二元結果事件,並且所有後續試驗中成功和失敗的概率均相同。此分佈採用兩個引數作為輸入:事件發生的次數和試驗成功與否的概率。二項式分佈最簡單的示例就是將有偏/無偏硬幣拋擲一定次數。 大家可以觀察一下不同概率情況下二項分佈的圖形: ``` # pmf(random_variable, number_of_trials, probability) for prob in range(3, 10, 3): x = np.arange(0, 25) binom = stats.binom.pmf(x, 20, 0.1*prob) plt.plot(x, binom, '-o', label="p = {:f}".format(0.1*prob)) plt.xlabel('Random Variable', fontsize=12) plt.ylabel('Probability', fontsize=12) plt.title("Binomial Distribution varying p") plt.legend() ``` ![](https://imgkr.cn-bj.ufileos.com/eb9b78c9-f912-4ac3-afdb-64188e8124a4.png) 二項式分佈的主要特徵是: - 給定多個試驗,每個試驗彼此獨立(一項試驗的結果不會影響另一項試驗)。 - 每個試驗只能得出兩個可能的結果(例如,獲勝或失敗),其概率分別為p和(1- p)。 如果獲得成功概率(p)和試驗次數(n),則可以使用以下公式計算這n次試驗中的成功概率(x)。 ![](https://imgkr.cn-bj.ufileos.com/3e03c4c0-8a81-4200-b354-e69bfebec05f.png) ## 正態(高斯)分佈 正態(高斯)分佈是資料科學中最常用的分佈之一。 我們日常生活中發生的許多常見現象都遵循正態分佈,例如:經濟中的收入分佈,學生的平均報告數量,平均身高等。此外,中心極限定理說明,在適當的條件下,大量相互獨立隨機變數的均值經適當標準化後依分佈收斂於正態分佈。 ``` n = np.arange(-50, 50) mean = 0 normal = stats.norm.pdf(n, mean, 10) plt.plot(n, normal) plt.xlabel('Distribution', fontsize=12) plt.ylabel('Probability', fontsize=12) plt.title("Normal Distribution") ``` ![高斯分佈](https://imgkr.cn-bj.ufileos.com/1eccb5e1-8677-4016-ad9f-479467f41385.png) 可以看出正態分佈的特徵: - 曲線在中心對稱。 因此,均值,眾數和中位數都相等,從而使所有值圍繞均值對稱分佈。 - 分佈曲線下的面積等於1(所有概率之和必須等於1) 可以使用以下公式得出正態分佈 ![正態分佈公式](https://imgkr.cn-bj.ufileos.com/64275a8e-d755-4266-9257-77d5391e563b.png) 使用正態分佈時,均值和標準差起著非常重要的作用。如果我們知道它們的值,通過概率分佈即可輕鬆找出預測精確值的概率。根據正態分佈的特性,68%的資料位於均值的一個標準差範圍內,95%的資料位於均值的兩個標準差範圍內,99.7%的資料位於均值的三個標準差範圍內。 ![](https://imgkr.cn-bj.ufileos.com/751fe09e-c396-4c72-8f78-447f6776a058.png) 許多機器學習模型被設計為遵循正態分佈有最佳效果。以下是一些示例: - 高斯樸素貝葉斯分類器 - 線性判別分析 - 二次判別分析 - 基於最小二乘的迴歸模型 在某些情況下可以通過對數和平方根等變換將非正態資料轉換為正態形式。 ## 泊松分佈 泊松分佈通常用於查詢事件可能發生或不發生的頻率,還可用於預測事件在給定時間段內可能發生多少次。 例如,保險公司經常使用泊松分佈來進行風險分析(預測在預定時間段內發生的車禍事故數),以決定汽車保險的定價。 當使用泊松分佈時,我們可以確信發生不同事件之間的平均時間,但是事件發生的確切時刻在時間上是隨機間隔的。 泊松分佈可以使用以下公式建模,其中λ表示單位時間(或單位面積)內隨機事件的平均發生率。 ![](https://imgkr.cn-bj.ufileos.com/da04a1bb-36b8-4cdb-8bee-9caca0b6380d.png) 泊松分佈的主要特徵是: - 事件彼此獨立 - 一個事件可以發生任何次數(在定義的時間段內) - 兩個事件不能同時發生 - 事件發生之間的平均發生率是恆定的。 下圖顯示了改變λ的值是如何影響泊松分佈的: ``` for lambd in range(2, 8, 2): n = np.arange(0, 10) poisson = stats.poisson.pmf(n, lambd) plt.plot(n, poisson, '-o', label="λ = {:f}".format(lambd)) plt.xlabel('Number of Events', fontsize=12) plt.ylabel('Probability', fontsize=12) plt.title("Poisson Distribution varying λ") plt.legend() ``` ![泊松分佈變化λ](https://imgkr.cn-bj.ufileos.com/580aa054-94cb-4ade-902e-b02286de4f35.png) ## 指數分佈 指數分佈用於對不同事件之間的時間進行建模。 舉例來說,假設我們在一家餐廳工作,並且希望預測不同顧客來就餐的時間間隔。針對此類問題使用指數分佈一個理想的起點。指數分佈的另一個常見應用是生存分析(例如裝置/機器的預期壽命)。 指數分佈由引數λ調節。λ值越大,曲線的斜率變化越快。 ``` for lambd in range(1,10, 3): x = np.arange(0, 15, 0.1) y = 0.1*lambd*np.exp(-0.1*lambd*x) plt.plot(x,y, label="λ = {:f}".format(0.1*lambd)) plt.xlabel('Random Variable', fontsize=12) plt.ylabel('Probability', fontsize=12) plt.title("Exponential Distribution varying λ") plt.legend() ``` ![](https://imgkr.cn-bj.ufileos.com/e0ff23cf-35e6-4081-906f-a188b048c9e4.png) 指數分佈使用以下公式建模 ![](https://imgkr.cn-bj.ufileos.com/31ad42c8-072a-4213-9ee8-49afedafbc5b.png) ## 參考書目 [1]https://medium.com/diogo-menezes-borges/introduction-to-statistics-for-data-science-7bf596237ac6 [2]https://bolt.mph.ufl.edu/6050-6052/unit-3b/binomial-random-variables/ [3]https://www.thoughtco.com/normal-distribution-bell-curve-formula-3126278 [4]https://towardsdatascience.com/understanding-the-68-95-99-7-rule-for-a-normal-distribution-b7b7cbf760c2 [5]http://makemeanalyst.com/wp-content/uploads/2017/05/Poisson-Distribution-Formula.png [6]https://www.andlearning.org/exponential-formula/ ![](https://imgkr.cn-bj.ufileos.com/fb85ed4f-c5c7-449c-bdcd-7601adb892c0.png)