這篇文章主要是最近研究人類行爲應用的內容,主要簡單敘述下複雜網絡的冪率分佈以及繪製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
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!