[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的常數次冪存在簡單的反比關係:
三. 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) 新節點擇優連線到具有大量連線的節點上,第二點即新節點連線到已有節點的概率與該節點的度數成正比例如:
關於複雜網路的統計學機制可以參考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。
娜娜值得我去愛,怎能負了她的選擇。
她的氣質是藏在她的經歷和讀過的書中。
(By:Eastmount 2017-03-23 晚上12點 http://blog.csdn.net/eastmount/ )
相關文章
- 動畫函式的繪製及自定義動畫函式動畫函式
- Flutter的繪製流程簡述Flutter
- ORACLE函式介紹第五篇 分析函式簡述Oracle函式
- Python繪製正餘弦函式影像Python函式
- [Python輿情分析] 二.時間間隔分佈研究及冪律分佈圖繪製Python
- [Python輿情分析] 一.輿情事件的冪律特性分析及時間間隔分佈圖繪製Python事件
- 【python資料探勘課程】十五.Matplotlib呼叫imshow()函式繪製熱圖Python函式
- 每日一問:簡述 View 的繪製流程View
- 函式的遞迴及科赫曲線繪製函式遞迴
- 雜篇:Android繪製函式圖象及正弦函式的介紹Android函式
- Python資料分析入門(十七):繪製條形圖Python
- 分段函式圖形繪製函式
- 高階函式簡述 js函式JS
- python之matplotlib模組繪製常見的啟用函式及各啟用函式的優缺點Python函式
- 簡述箭頭函式和普通函式的區別函式
- Matplotlib 系列之【繪製函式影像】函式
- Matplotlib 系列之【繪製函式影象】函式
- JavaScript繪製sin正弦函式曲線JavaScript函式
- JavaScript 繪製sin正弦函式曲線JavaScript函式
- 使用 Python 和 GNU Octave 繪製資料Python
- 迴圈_推導式_繪製棋盤_函式函式
- Python資料分析--Numpy常用函式介紹(2)Python函式
- Python資料分析--Numpy常用函式介紹(3)Python函式
- javascript 冪函式運算JavaScript函式
- Matplotlib呼叫imshow()函式繪製熱圖函式
- 好程式設計師Python培訓分享簡述fetchone()函式程式設計師Python函式
- 使用python繪出常見函式Python函式
- 【Python資料探勘課程】七.PCA降維操作及subplot子圖繪製PythonPCA
- Python-split()函式用法及簡單實現Python函式
- 資料複製策略綜述
- 一元、二元函式影象繪製函式
- 簡述回撥函式的意義和作用函式
- Python資料分析--Numpy常用函式介紹(5)--Numpy中的相關性函式Python函式
- Python資料分析--Numpy常用函式介紹(7)--Numpy中矩陣和通用函式Python函式矩陣
- 函式的冪級數展開式函式
- oracle的分析函式over 及開窗函式Oracle函式
- mysql 自定義分析函式 least 及 日期函式MySql函式AST
- 資料視覺化之matplotlib實戰:plt.pie()函式 繪製餅狀圖視覺化函式