[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 
版权声明:本文为博主原创文章,转载请附上博文链接!

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