[python資料分析] 簡述冪率定律及繪製Power-law函式

Eastmount發表於2017-03-23

        這篇文章主要是最近研究人類行為應用的內容,主要簡單敘述下複雜網路的冪率分佈以及繪製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()

    

        國足今天真的不負英雄之名。
        第一次聽到給韓國的時間不多了,爽!
        第一次因為國足把虎撲伺服器搞崩了,哈哈。
        第一次見國足贏了還秀恩愛的,對不起大家,我激動啦,別遮蔽我。
        晚上躲在辦公室看球,程式碼也不寫了,學生敲門也不開了,假老師一個。
        感謝東方神祕的力量,奶死韓國,6666。



        同時今天給學生講了一節資料探勘課,站在講臺前還是那麼享受,回來教書真的不虧,而且一節課就贏得學生的好感,多為學生考慮真的挺好,為了學生的一切。終於12點前在辦公室寫完這篇部落格,回寢睡覺了,還有好多事情等著我啦,加油,秀璋,最感謝的是娜娜的一路同行,一路理解。
        娜娜值得我去愛,怎能負了她的選擇。
        她的氣質是藏在她的經歷和讀過的書中。

        (By:Eastmount 2017-03-23 晚上12點  http://blog.csdn.net/eastmount/ )


相關文章