冪律分布擬合神器——Python庫powerlaw

2021-12-26 集智俱樂部

收錄於話題 #複雜科學前沿2021 227個

具有長尾特徵的分布往往一目了然,但實際擬合過程卻可能遇到各種各樣的問題。本文將為讀者介紹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進行冪律擬合
>fit.power_law.alpha  #擬合得到冪律分布冪指數alpha2.273  
>fit.distribution_compare(『power_law』, 『exponential』)  #與指數分布對比得到對數似然比和p值
(12.755, 0.152)

powerlaw庫能容易繪製概率密度函數(PDF)、累積分布函數(CDF)和互補累積分布函數(CCDF)。對應的計算工作通過pdf、cdf和ccdf完成的,而繪圖則是結合matplotlib通過plot_pdf、plot_cdf和plot_ccdf命令完成。

>powerlaw.plot_pdf(data, color = 『b』)  
>powerlaw.plot_pdf(data, linear_bins = True, color = 『r』)

該命令中的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)
>fit.plot_ccdf(color = 『r』, linewidth = 2, ax = fig2)
>fit.power_law.plot_ccdf(color = 『r』, 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)
>fit.xmin  #得到最優的冪律擬合最小值230.000
>fit.power_law.alpha
2.273
>fit.power_law.D  #選擇數據和擬合之間的Kolmogorov-Smirnov距離D0.061
>fit = powerlaw.Fit(data, xmin = 1.0)  #指定x_min進行冪律擬合
>fit.xmin
1.0
>fit.fixed_xmin
True
>fit.power_law.alpha
1.220
>fit.power_law.D
0.376
>fit = powerlaw.Fit(data, xmin = (250.0, 300.0))  #給定x_min範圍
>fit.given_xmin
(250.000, 300.000)
>fit.xmin
272.0

另外,一些領域也希望分布有一個精確的上界x_max,因為有時考慮實際情況一些數據可能超出了理論極限(例如在天體物理學中,速度的分布在光速下可能有一個上限)。powerlaw庫同樣能滿足這部分用戶的需求。

>fit = powerlaw.Fit(data, xmax = 10000.0)
>fit.xmax
10000.0
>fit.fixed_xmax
True

       圖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
2.273
>fit.power_law.parameter1
2.273
>fit.power_law.parameter1_name
>fit.lognormal.mu
0.154
>fit.lognormal.parameter1_name
『mu』
>fit.lognormal.parameter2_name
『sigma』
>fit.lognormal.parameter3_name = = None

另外,得到參數之後還需要評價哪個分布優度更好。每個分布的擬合優度可以考慮單獨或通過相互比較得到(這裡使用KS 檢驗和對數似然比來確定)。比如下方代碼直接對比冪律分布和指數分布的擬合效果。返回得到的R是兩個候選分布之間的對數似然比,如果數據更有可能在第一個分布中,這個數字將為正,如果數據更有可能在第二個分布中,這個數字將為負。p是顯著性指標。

>R, p = fit.distribution_compare(『power_law』, 『exponential』,
normalized_ratio = True)
>print R, p
16.384  0.024   #冪律分布比指數分布更優

一般認為,指數分布是長尾分布中絕對最小備選。因此,如果當下結果並不比指數分布更適合,就根本沒有理由考慮其他的長尾分布,更別說冪律分布了。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

點擊「閱讀原文」,進入集智學園聽課

相關焦點

  • 冪律分布擬合方法
    Plenz, powerlaw: A Python Package for Analysis of Heavy-Tailed Distributions. Plos One, 2014. 9(1).根據文獻一,對冪律分布的擬合主要包括:1.
  • 冪律分布
    這種形態叫做冪律分布(power law distribution)。  在這樣的分布中,你可以注意到從排名最靠前的幾位提交者到大多數參與者之間照片數量的急劇下降。也請注意由於少數幾位攝影者不成比例的提交量,3/4的攝影者所提交照片數量低於平均值。這個模式在博客、郵件組等社會性媒體中普遍呈現。  這其中有兩個意外之處。
  • 為「成功」建模:冪律分布
    但貌似我們的教科書當中,對於冪律分布卻是隻字不提,這個就很讓人奇怪了。其實在自然界當中最常見的兩種分布就是正態分布和冪律分布。比如人類的身高就完全可以用正態分布來描述。人與人之間的能力高低,也可以使用正態分布來做模型。
  • 力學所災變破壞的冪律奇異性前兆及災變預測方法研究獲進展
    這種加速演化通常被刻畫為冪律關係,但冪指數卻表現出極大的分散性,這為理解災變破壞的機理及建立災變破壞預測方法帶來了極大困難。  近期,中國科學院力學研究所非線性力學國家重點實驗室研究員白以龍團隊針對災變破壞冪律奇異性前兆及災變破壞預測方法的研究取得新進展。
  • 粗看長尾,細辨冪律:跨世紀的無標度網絡研究紛爭史
    這類分布的主要特徵就是長尾,即尾部近似服從冪指數大於1的冪律分布,f(i)~ i^(p+1),p為一個大於零的常數。該文舉證了五個具體數據:論著中的單詞出現頻次分布;科學家發表的文章數量分布;城市人口分布;收入多少分布;生物屬的物種數量分布。西蒙以寫書為例給出了產生冪律分布的「偏好連結」假設。
  • 【0442】正態分布和冪律分布:你的行業屬於哪種類型
    【0442】正態分布和冪律分布:你的行業屬於哪種類型——讀劉潤的《每個人的商學院》叢書
  • 冪律:自然界中的一個普遍規律
    冪律,又稱冪定律、冪法則,英文:Power law,表述兩個量之間的一種函數關係,描述其中一個量的相對變化導致另一個量相對變化的關係,而與這些量的初始大小無關:一個量隨另一個量的冪而冪律變化,例如,正方形的邊長,如果長度加倍,則面積乘以四;如計算機摩爾定律的冪數增長;又如量子計算機的能力隨量子比特數呈冪數增長。
  • 比特幣價格走廊與冪律法則:走向何方?
    令人驚訝的是,隨著時間的推移,模型傾向於更好地擬合數據:在解釋比特幣的價格時,冪律正變得越來越好x軸代表用於線性回歸模型的數據點(天)的數量,而y軸代表對擬合程度的衡量。比特幣的價格越來越符合冪律法則。讓我們稍微擴展一下。
  • 疫情後加速變化的冪律分布和馬太效應!
    因此在這種背景下,職業收入的分布正在發生變化,即職業收入的分布正在由正態分布規則轉變為冪律分布!冪律分布的含義就是某個具有分布性質的變量,只要其分布密布函數是冪函數,都可以稱其滿足冪律分布規律。這種分布是自然界中的一種常見現象。譬如地震的大小,通常震級越小發生的頻率越大,震級越大發生的頻率就越小。以震級為自變量,以其發生的頻率(或概率)為因變量,符合(負)冪函數。
  • 你努力的結果,是正態分布還是冪律分布?你努力的結果,是正態分布...
    一、正態分布和冪律分布的職業區別 我們看到很多工作,都是有天花板的。比如:送外賣,就算你再努力,單子接得再多,想要突破一個月十萬,幾乎是不可能的。所以送外賣的小哥收入,都在一個區間。這就是:正態分布。
  • ...解密資產配置邏輯——風險投資中的冪律曲線分布規律及其現實意義
    來源:金融界網站作者:母基金周刊STRATEGYVC基金的回報曲線,呈現冪律分布而不是正態分布的特徵。VC基金回報率的冪律分布冪律分布(Power-law Curve)規律是指:滿足於某個具有分布性質的變量,其分布密布函數是冪函數,的分布規律。
  • 母基金周刊:解密資產配置邏輯——風險投資中的冪律曲線分布規律...
    VC基金回報率的冪律分布冪律分布(Power-law Curve)規律是指:滿足於某個具有分布性質的變量,其分布密布函數是冪函數,的分布規律。不同投資機構(LP)的收益目標、風險偏好、流動性需求、投資期限、適用稅率等等因素並不一樣,對其適用的最優資產組合必然也不一樣,因此,其配置到VC類資產的資金比例和管理人的選擇標準也會不一樣。
  • 齊夫定律:描述詞頻分布規律的強大數學工具
    據美國《物理學家組織》(phys.org)網站報導,西班牙巴塞隆納自治大學數學研究中心的研究者最近使用數學和統計學的專業知識,對齊夫定律(Zipf's law)進行了嚴格的研究。他們使用了古登堡計劃(the Project Gutenberg)的資料庫——古登堡計劃是一項將版權過期的英語書籍電子化的網際網路計劃,包含3萬多篇英語文本,可以免費獲取。
  • :冪律分布告訴你成功不能全靠努力
    「二八法則」其實就是簡化版的「冪律分布」。 我們稱這種分布為「冪律分布」。 冪律分布曲線 「冪律分布」不僅局限在各個國家財富分配的問題上,我們生活的各個方面都能看到這種分布的影子:手機裡幾十個APP,每天用到的就那麼三四個;一個微信群裡上百人
  • 坤鵬論:讀懂了冪律,就讀懂了成功曲線
    這一概率的發生遵從一定的分布規律。這個分布規律被稱為「冪律」,又被稱為「可預期的不均衡」。這種分布呈現出來的狀態則被稱為「冪律分布」。一、什麼是冪律和冪律分布?1.通過二八法則理解冪律和冪律分布所謂冪律,其實最好的實例就是二八法則。
  • 用Python為直方圖繪製擬合曲線的兩種方法
    ,用矩形的寬度和高度表示頻數分布,通過直方圖,用戶可以很直觀的看出數據分布的形狀、中心位置以及數據的離散程度等。在python中一般採用matplotlib庫的hist來繪製直方圖,至於如何給直方圖添加擬合曲線(密度函數曲線),一般來說有以下兩種方法。方法一:採用matplotlib中的mlab模塊mlab模塊是Python中強大的3D作圖工具,立體感效果極佳。
  • 冪次法則(power law) 在生活中的應用
    當二邊均取對數(log)時,公式成為log(R(x)) = log(a) – b˙log(x)。若以log(R(x))為X軸,log(x)為Y軸,其分布圖呈直線,斜率為負。斜率之絕對值越小,代表規模差異越小。彼得·蒂爾的冪次法則也有大家熟知的另外一種表述:用80%的精力做20%的事。20%的關鍵事物帶來80%的收益,所以我們要把精力專注在最有價值的事情上。
  • python基礎--math庫
    python的強大不在於它的語法簡單,而在於它強大的生態系統,據查python有12萬以上的第三方庫,除了全面覆蓋IT領域外,還有其它諸如物理、化學等領域的第三方庫
  • 線性擬合與曲線擬合,直接在圖上添加擬合曲線、擬合方程、判別係數...
    1、什麼是線性擬合?線性擬合,顧名思義,針對兩組數據或多組數據,找出一條最佳擬合直線,常用於處理與自變量呈線性關係的因變量。線性擬合是數據處理的常用方法,擬合的目的是對呈現一定數值關係的因變量與自變量找出最佳擬合方程,一般用線性回歸來實現。
  • 高級的科學計算庫——Scipy
    4.1簡介4.2統計假設與檢驗 stats包4.3信號特徵4.4尋優4.5求解4.6曲線擬合 curve-fit4.7插值4.8模式聚類Scipy是一個高級的科學計算庫,它和Numpy聯繫很密切,Scipy一般都是操控Numpy