赞
踩
- #coding:utf-8
- import scrapy
- import xlwt, lxml
- import re, json
- import matplotlib.pyplot as plt
- import numpy as np
- import pylab
- from scipy import linalg
- #文档:igraph.org/python/doc/
- #社交网络分析
- #
-
- from igraph import *
- '''
- 社交网络算法介绍
- 分析-权利的游戏-网络(Jupyter Notebook)
- 社交网络算法在金融反欺诈中的应用
- 社交网络算法应用场景:
- 在社交网络中社区圈子的识别(Community Detection)
- Facebook/Wechat是基于朋友之间的强关系网络,有助于朋友之间的联系与关系维系
- Twitter/Weibo/Douban是基于单向关注的弱关系社交网络,有助于消息的传播和塑造意见领袖
- Linkedin是面向工作的职业社交网络,帮助商务交流与求职招聘
- 基于好友关系为用户推荐商品或内容
- 社交网络中人物影响力的计算
- 信息在社交网络上的传播模型
- 虚假信息和机器人账号的识别
- 基于社交网络信息对股市、大选的预测
- 互联网金融行业中的反欺诈预测
- '''
- # g=Graph([(0,1),(0,2),(2,3),(3,4),(4,2),(2,5),(5,0),(6,3),(5,6)])
- # summary(g)
- # print(g)
- # print(g.degree())
- '''
- degree#二分图(Bipatite):有两类节点,同一类内部各节点之间没有关联关系,不同类节点之间互相关联
- Multigraph
- http://snap.stanford.edu/data/
- http://www-personal.umich.edu/~mejn/netdata
- 社交网络算法-分析指标
- 一个具体的网络可抽象为一个由节点(vertex或node)集合V和边(edge)集合E组成的图G=(V,E),节点数记为n=|V|,边数记为m=|E|
- 衡量指标:度,密度,团,度中心性,紧密中心性,介数中心性,聚集系数
- 团:各节点之间有相互联系
- 互联网特性:small world/power law/Community
- '''
-
-
- #度
- import csv
- edges=[]
- with open('C://Users/SunChao/Desktop/igraph/net.data','r') as f:
- for row in csv.reader(f.read().splitlines()):
- u,v=[i for i in row]
- edges.append((u,v))
- from igraph import Graph as IG
- g=IG.TupleList(edges,directed=False,vertex_name_attr='name',edge_attrs=None,weights=False)
- print(g)
- # for p in g.vs:
- # print(p['name'],p.degree())
- '''
- #紧密中心性:某个节点到达其他节点的难易程度,也就是其他所有节点距离的平均值的倒数
- paths=g.get_all_shortest_paths('7')
- #g.vs把整个图中的节点作为一个列表,对应有参数name
- names=g.vs['name']
- cc=0
- for p in paths:
- print([names[x] for x in p])
- cc+=len(p)-1
- print('closeness centrality=%s'%((len(paths)-1)/cc))
- ccvs=[]
- for p in zip(g.vs,g.closeness()):
- ccvs.append({'name':p[0]['name'],'cc':p[1]})
- pgvs=sorted(ccvs,key=lambda k:k['cc'],reverse=True)[:10]
- print(pgvs)
- '''
-
- '''
- #介数中心性
- #计算每对节点(i,j)之间的最短路径,当然需要得到具体路径
- #对各个节点判断该节点是否在最短路径上
- #最后将刚刚的判断进行累加得到从i到j的最短路径经过该点的数量
- #点介数
- sp=[]
- target=7
- for v in g.vs:
- # print(v,v['name'])
- paths=g.get_all_shortest_paths(v['name'])
- for p in paths:
- if(target in p and target !=p[0] and target !=p[-1]):
- print(target,p)
- sp.append(p)
- spbt=0
- tu=[]
- #去重,i到j和j到i为同一条路径
- for x in sp:
- if (set((x[0],x[-1]))) not in tu:
- tu.append(set((x[0],x[-1])))
- spbt+=1
- print(tu)
- print('betweenness=%s'%spbt)
- #--------------------------
- btvs=[]
- for p in zip(g.vs,g.betweenness()):
- btvs.append({'name':p[0]['name'],'bt':p[1]})
- pgvs=sorted(btvs,key=lambda k:k['bt'],reverse=True)
- print(pgvs)
- '''
-
- '''
- #PageRank算法
- # 思想:被大量高质量网页引用(链接)的网页也是高质量网页
-
- # A邻接矩阵*迭代时的节点权重B的转置
- pg=g.pagerank()
- pgvs=[]
- for p in zip(g.vs,pg):
- pgvs.append({'name':p[0]['name'],'pg':p[1]})
- pgvs1=sorted(pgvs,key=lambda k:k['pg'],reverse=True)
- print(pgvs1)
- '''
- '''
- #社团发现算法
- 什么是Community Structure
- 同一社区内的节点与节点之间的连接很紧密,而社区与社区之间的连接比较稀疏
- 设图G=G(V,E).所谓社团发现是指在图G中确定nc(>=1)个社区
- C={C1,C2,...,Cnc},
- 使得各社区的顶点集合构成V的一个覆盖
- 若任意两个社区的顶点集合的交集均为空,则C称为非重叠社区(disjoint communities);否则称为重叠社区(overlapping communities)
-
- GN算法
- 边介数:网络中经过每条边的最短路径的数目。
- GN:计算网络中所有边的介数
- 找到介数最高的边并将它从网络中删除
- 重复,直到每个节点就是一个社团为止
-
- '''
- # btes=[]
- # for p in zip(g.es,g.edge_betweenness()):
- # e=p[0].tuple
- # print((e[0]))
- # btes.append({'edge':(e[0],e[1]),'ebt':p[1]})
- # es=sorted(btes,key=lambda k:k['ebt'],reverse=True)
- # print(es)
-
- commnities=g.community_edge_betweenness(directed=False,weights=None)
- print(commnities)
- print(g.vs['name'])
-
- #社区评价指标-模块度Modularity
- #网络如果有社区结构的话,网络中两个节点间有边的概率要高于随机图中两个节点间有边的概率
- #对于随机图,模块度Q=0,对于一般图 模块度在0.3-0.7之间
-
- # 社区评价指标-Conductance阻断率
- # 其值越小表明社区属性越明显
- # outgoing edges/edges within
-
- #Louvain算法 通过计算模块度增量,将高的并到初始社区中
- # o(n^3)->o(n^2logn)
-
-
- #LPA算法 --o(n)
- #优点:不需要预先知识,不用预先给定社区的数量,可以控制迭代的次数来划分节点类别
- # 可扩展性强,时间复杂度接近线性,适合处理大规模复杂网络
- # 思想:
- # 1.初始化每个节点,给其唯一标签
- # 2.根据邻居节点最常见的标签更新每个节点的标签
- # 3.最终收敛后标签一致的节点属于一个社区
-
- # SLPA算法
-
-
-
-
# 安装python-igraph出错问题:
# Failed building wheel for python-igraph
# 原因是 pip install -U python-igraph官方未找到对应安装包
# 建议从第三方下载对应版本的.whl本地安装
# 可通过以下链接:http://www.lfd.uci.edu/~gohlke/pythonlibs/
# 下载后放到指定路径下(如,本人使用anaconda 创建的python35虚拟环境,打开Anaconda prompt后activate激活 显示(python35) C:\Windows\system32 则应将文件放至该目录下)
# 另外,亦可通过上述方式下载并安装pycairo库
#conda install -c marufr python-igraph=0.7.1.post6
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。