[python數據分析] 簡述冪率定律及繪製Power-law函數

 這篇文章主要是最近研究人類行爲應用的內容,主要簡單敘述下複雜網絡的冪率分佈以及繪製Power-law函數一些知識,同時是一篇在線筆記。希望對您有所幫助,如果文章中存在不足或錯誤的地方,還請海涵~
        1.冪率分佈
        2.Zipf定律
        3.Scale free
        4.Python繪製冪率分佈
        這篇文章基礎知識轉載了別人的內容,這裏強烈推薦大家閱讀原文。此篇文章主要是講述代碼部分,定律我也還在學習中,和大家共勉。

一. 冪率分佈

        在我們的日常生活中Power Law(冪次分佈,Power-law Distributions)是常見的一個數學模型,如二八原則。這個世界上是20%的人掌握80%的人的金錢去經營,20%的人口擁有80%的財富,20%的上市公司創造了80%的價值,80%的收入來自20%的商品,80%的利潤來自20%的顧客等等。
        下圖表示人類的財富冪率分佈圖,極少數人擁有微弱優勢的人卻擁有天文級別的財富。

        爲什麼會有這樣的差別呢?
        這是因爲時間的乘積效應,智力上的微弱優勢,乘以時間,就會得到價值(財富)幾何級的增長。
        經濟學財富分佈滿足Pareto Power law tail分佈,語言中有詞頻的冪律分佈,城市規模和數量滿足冪律分佈,音樂中有f分之1噪音(冪律分佈)。通常人們理解冪律分佈就是所謂的馬太效應,二八原則,即少數人聚集了大量的財富,而大多數人的財富數量都很小,因爲勝者通吃的原則。
        f(x)表示某一數量指標x的發生次數,即冪率分佈公式。

        冪率公式推導參考kevinelstri大神的博客,如下圖所示:


        再如錢學森通信反應間隔分佈:

        參考資料:
        關於冪律分佈的一個筆記 - 哈克
        複雜網絡的一些相關概念:power law(冪率分佈)以及 scale free(無標度) - 劉永軒
        Python數據可視化:冪律分佈 - kevinelstri


二. Zipf定律
        PS:這部分內容引用哈克老師的博客 "關於冪律分佈的一個筆記 ",推薦給大家。
        Zipf是哈佛大學的語言學家,他在1932年研究英文單詞的出現頻率時,發現如果把單詞頻率從高到低排列,每個單詞的出現頻率和它的排名之間存在簡單的反比關係:


 
        在對其取對數變換後成爲:


        則在雙對數座標系下,該分佈呈現爲一條斜率爲負冪指數的直線。這裏r表示一個單詞出現頻率的排名,P(r)表示排名爲r的單詞的出現頻率。在單詞分佈中,C約等於0.1,α約等於1。
        總結規律:只有少數英文單詞纔會被經常使用,大部分的單詞很少被使用。
        這個規律在其他領域的數據分佈裏也得到了驗證。
        另一個類似的定律是意大利經濟學家Pareto提出的80/20法則,即20%的人口占據了80%的社會財富。個人收入X不小於某個值x的概率與x的常數次冪存在簡單的反比關係:


        稱爲Pareto定律。


三. Scale free

        PS:這部分內容引用哈克老師的博客 "關於冪律分佈的一個筆記 ",推薦給大家。
        一個網絡的度分佈如果服從power law,即有P(k)∼k−γ,(直觀的看,就是少部分節點度極大,與許多節點相連,而大部分節點度都比較小),那麼,這個網絡就叫做無標度網絡(scale free network)。 
        許多現實中的網絡包括WWW,社交網絡,性伴侶網絡,PPI網絡等都被認爲是無標度網絡,並且大部分實際網絡中power law的指數γ一般都在2和3之間,並且網絡直徑極小(d~lnN,N爲節點數)。
        對應的,隨機網絡的度分佈是泊松分佈,也就是鐘形分佈的,節點的度值一般不會比平均值高出很多或低很多。
        複雜網絡的定義:具有自組織,自相似,吸引子,小世界,無標度中部分或全部性質的網絡稱爲複雜網絡。
        現實網絡的無標度特性源於衆多網絡所共有的兩種生成機制(Albert-Laszlo Barabasi ,Reka Albert,1999):
        (i) 網絡通過增添新節點而連續擴張 
        (ii) 新節點擇優連接到具有大量連接的節點上,第二點即新節點連接到已有節點的概率與該節點的度數成正比例如:


        這樣就可以生成度分佈服從power law的網絡。
        關於複雜網絡的統計學機制可以參考Reka Albert的博士論文: 
        Statistic Mechanics of complex networks

四. Python繪製冪率分佈
        推薦文章:Python數據可視化:冪律分佈 - kevinelstri
                       【python數據挖掘課程】十二.Pandas結合SQL語句對比圖分析
        下面是我前面文章關於博客數量的繪製圖形,X軸爲發表博客年份,Y軸爲博客數量。如下圖所示:

        下圖X軸表示發表博客的評論數,Y軸表示博客那個評論的總文章數量。

        然後分別對X、Y座標取log10對數,如下圖所示,一個完美的冪率分佈圖。

        具體代碼如下所示:(因文章未發表,佔不公開數據,抱歉)

# coding=utf-8
'''
' 這篇代碼主要講述獲取MySQL中數據,再進行簡單的統計
' 統計採用SQL語句進行 By:Eastmount CSDN 楊秀璋
'''
 
import matplotlib.pyplot as plt
import matplotlib
import pandas as pd
import numpy as np
import MySQLdb
from pandas import *
import math
 
# 根據SQL語句輸出24小時的柱狀圖
try:
    conn = MySQLdb.connect(host='localhost',user='root',
                         passwd='123456',port=3306, db='test01')
    cur = conn.cursor() #數據庫遊標
 
    #防止報錯:UnicodeEncodeError: 'latin-1' codec can't encode character
    conn.set_character_set('utf8')
    cur.execute('SET NAMES utf8;')
    cur.execute('SET CHARACTER SET utf8;')
    cur.execute('SET character_set_connection=utf8;')
    #sql = '''select DATE_FORMAT(FBTime,'%Y'), Count(*) from csdn_blog group by DATE_FORMAT(FBTime,'%Y');'''
    sql = '''select PLNum, count(*) from csdn_blog group by  PLNum;'''
    cur.execute(sql)
    result = cur.fetchall()        
    PLNum = [n[0] for n in result] #評論數
    Num = [n[1] for n in result]   #數量
    print len(PLNum), type(Num)
 
    #兩邊起對數log10
    PLNumlog = range(len(PLNum))
    Numlog = range(len(PLNum))
    i = 1
    while i < len(PLNum):
        print PLNum[i], Num[i]
        print math.log10(PLNum[i]), math.log10(Num[i])
        PLNumlog[i] = math.log10(PLNum[i])
        Numlog[i] = math.log10(Num[i])
        i = i + 1
    else:
        print 'end log10'
 
    #print PLNumlog
    #print Numlog
    
    matplotlib.style.use('ggplot')
    #df=DataFrame(Num[1:100], index=PLNum[1:100],columns=['Nums'])
    
    plt.scatter(PLNumlog[1:], Numlog[1:], marker='s')
    plt.title('Number of users published')
    plt.xlabel('The number of comment')
    plt.ylabel('The number of blog')
    plt.savefig('06csdn.png',dpi=400)
    plt.show()
 
 
#異常處理
except MySQLdb.Error,e:
    print "Mysql Error %d: %s" % (e.args[0], e.args[1])
finally:
    cur.close()
    conn.commit()  
    conn.close()
 
    

        

--------------------- 
作者:Eastmount 
來源:CSDN 
原文:https://blog.csdn.net/Eastmount/article/details/65443025 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章