具有長尾特徵的分布往往一目了然,但實際擬合過程卻可能遇到各種各樣的問題。本文將為讀者介紹2014年由新加坡科技設計大學和麻省理工研究者聯合發布的python庫:powerlaw,專門適用於冪律等長尾特徵分布的擬合,解決擬合煩惱。
期刊來源:PLOS ONE
論文標題:
powerlaw: A Python Package for Analysis of Heavy- Tailed Distributions
論文網址:
https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0085777
冪律分布作為長尾分布的一種,滿足可以用來印證生活中很多有趣的現象,比如最為大家熟知的「二八定律」「富者越富」等等。早在上世紀早期就先後有克萊伯定律、Zipf定律等冪律現象的發現,而千禧年之際BA無標度網絡的正式提出更是掀起一波「冪律熱潮」,大家越來越接受「冪律分布是複雜系統中的普適現象」這一觀點。
圖1. 人們常說「20%的人掌握著80%的財富」就是典型的冪律分布,其具有尖峰、長尾特徵。
圖2. 三個不同數據集用powerlaw擬合後的可視化圖像
圖2顯示了可視化、擬合和評估長尾分布的基本要素,每組子圖將在後續部分中進行進一步的詳細描述。
圖1中三列子圖包含三個示例數據集和擬合結果,分別表示冪律良好擬合、中等擬合和較差擬合。第一列的數據,也是最好的擬合數據集可能是所有冪律分布中最著名和最可靠的:英語單詞使用頻率。具體使用的數據是Herman Melville的小說《Moby Dick》中詞語的使用頻率。第二列的數據是線蟲每個神經元的連接數。最後一個擬合不佳的數據是1984年至2002年間受停電影響的美國人數。
圖2中的子圖A表示了三個樣本數據集的概率密度函數,子圖B顯示了只有少數分布的尾部可能遵循冪律,子圖C表示了如何將冪律擬合與其他長尾分布進行比較。
下面以1984年至2002年間受停電影響的美國人數數據為例進行操作說明。
>fit = powerlaw.Fit(data) #對導入的數據data進行冪律擬合powerlaw庫能容易繪製概率密度函數(PDF)、累積分布函數(CDF)和互補累積分布函數(CCDF)。對應的計算工作通過pdf、cdf和ccdf完成的,而繪圖則是結合matplotlib通過plot_pdf、plot_cdf和plot_ccdf命令完成。
>powerlaw.plot_pdf(data, color = 『b』)該命令中的linear_bins參數控制對數坐標軸與否。線性刻度不利於冪律尾部「大值」的觀察,採用對數刻度增加在尾部觀察一系列數據的可能性。圖2子圖A顯示了選擇對數刻度如何極大地提高數據分布的可視化。在這裡默認為對數刻度,但也可以用linear_bins = True進行線性劃分。
關於PDF、CDF和CCDF的擬合示例如下,具體選擇需結合擬合需求。如果要在同一畫布中呈現多條擬合曲線,需要傳遞帶有ax的matplotlib對象。例如下方同時畫出神經元連接數據的CCDF(紅色)和PDF(藍色)曲線。
>fig2 = fit.plot_pdf(color = 『b』, linewidth = 2)>fit.power_law.plot_pdf(color = 『b』, linestyle = 『–』, ax = fig2) 圖3. 神經元連接數據的CCDF(紅色)和PDF(藍色)曲線。
在繪圖之外,PDF、CDF和CCDF信息也可用。擬合對象返回擬合數據和排序數據(CDF)和bin的邊緣概率(PDF)。分布對象默認使用全部擬合數據,也可以指定具體的數據範圍。
>x, y = fit.cdf() #冪律分布CDF擬合
>bin_edges, probability = fit.pdf()
>y = fit.lognormal.cdf(data = [300, 350]) #對數正態分布CDF擬合
>y = fit.lognormal.pdf()
擬合冪律的第一步是確定擬合數據的哪一部分。長尾分布的有趣特徵是尾部及其屬性,所以如果數據的初始小值不遵循冪律分布,用戶有可能會選擇忽略它們。powerlaw庫會為用戶提供最優的冪律擬合最小值,當然用戶也可以選擇指定最小值或給最小值框定範圍,不同的最小值選擇往往會帶來不一樣的擬合結果,如下方代碼所示。
>fit = powerlaw.Fit(data)另外,一些領域也希望分布有一個精確的上界x_max,因為有時考慮實際情況一些數據可能超出了理論極限(例如在天體物理學中,速度的分布在光速下可能有一個上限)。powerlaw庫同樣能滿足這部分用戶的需求。
>fit = powerlaw.Fit(data, xmax = 10000.0) 圖4. 不同的x_min和x_max選擇可能導致不同的擬合結果。
這裡的x_min和x_max默認使用KS距離D最小的值。然而,這個距離D對分布尾部的差異明顯不敏感,而尾部正是冪律的大部分有趣行為發生的地方。可能需要使用其他指標,如Kuiper或AndersonDarling,它們在測量分布之間的距離時給予尾部額外的權重,用戶可以根據實際需要進行調整。
>fit = powerlaw.Fit(data, xmin_distance = 『D』)
>fit = powerlaw.Fit(data, xmin_distance = 『V』)
>fit = powerlaw.Fit(data, xmin_distance = 『Asquare』)
為了適合冪律和其他分布的連續形式,數據默認是連續的。然而,許多數據是離散的。離散分布的概率分布不能精確地與連續分布相提並論。離散(整數)分布通過適當的規範化,可以在初始化時指定。不過離散形式的概率分布通常比連續形式更難計算,因此某些操作運行可能會比較慢。
>fit = powerlaw.Fit(data, xmin = 230.0)
>fit.discrete
False
>fit = powerlaw.Fit(data, xmin = 230.0, discrete = True)
>fit.discrete
True
從創建的Fit對象中,用戶可以很容易地訪問評估長尾分布所需的所有統計分析。Fit對象也能適用於其他可能的分布形式。每個分布都有適合該分布的最佳參數,可通過參數名稱或更通用的「parameter1」訪問。
>fit.power_law.alpha另外,得到參數之後還需要評價哪個分布優度更好。每個分布的擬合優度可以考慮單獨或通過相互比較得到(這裡使用KS 檢驗和對數似然比來確定)。比如下方代碼直接對比冪律分布和指數分布的擬合效果。返回得到的R是兩個候選分布之間的對數似然比,如果數據更有可能在第一個分布中,這個數字將為正,如果數據更有可能在第二個分布中,這個數字將為負。p是顯著性指標。
>R, p = fit.distribution_compare(『power_law』, 『exponential』,一般認為,指數分布是長尾分布中絕對最小備選。因此,如果當下結果並不比指數分布更適合,就根本沒有理由考慮其他的長尾分布,更別說冪律分布了。fit對象的fit.supported_distribution中支持的分布列表包括:冪律、截斷冪律、指數、對數正態、威布爾和伽馬分布。distribution_compare可以使用這些分布中的任何一個。
1. 該論文中的擬合數據和代碼均可見:https://github.com/jeffalstott/powerlaw2. 關於冪律分布和複雜網絡的相關聯繫可以參考:集智之前關於冪律分布的一些長文連結。4. 關於冪律分布擬合及檢驗原理可以參考集智學園陳清華老師授課視頻:https://campus.swarma.org/course/1747 。課程地址:https://campus.swarma.org/course/647
點擊「閱讀原文」,進入集智學園聽課