数据分析实战45讲
陈旸
清华大学计算机博士
立即订阅
17314 人已学习
课程目录
已完结 48 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你为什么需要数据分析能力?
免费
第一模块:数据分析基础篇 (16讲)
01丨数据分析全景图及修炼指南
02丨学习数据挖掘的最佳路径是什么?
03丨Python基础语法:开始你的Python之旅
04丨Python科学计算:用NumPy快速处理数据
05丨Python科学计算:Pandas
06 | 学数据分析要掌握哪些基本概念?
07 | 用户画像:标签化就是数据的抽象能力
08 | 数据采集:如何自动化采集数据?
09丨数据采集:如何用八爪鱼采集微博上的“D&G”评论
10丨Python爬虫:如何自动化下载王祖贤海报?
11 | 数据科学家80%时间都花费在了这些清洗任务上?
免费
12 | 数据集成:这些大号一共20亿粉丝?
13 | 数据变换:考试成绩要求正态分布合理么?
14丨数据可视化:掌握数据领域的万金油技能
15丨一次学会Python数据可视化的10种技能
16丨数据分析基础篇答疑
第二模块:数据分析算法篇 (20讲)
17 丨决策树(上):要不要去打篮球?决策树来告诉你
18丨决策树(中):CART,一棵是回归树,另一棵是分类树
19丨决策树(下):泰坦尼克乘客生存预测
20丨朴素贝叶斯分类(上):如何让机器判断男女?
21丨朴素贝叶斯分类(下):如何对文档进行分类?
22丨SVM(上):如何用一根棍子将蓝红两色球分开?
23丨SVM(下):如何进行乳腺癌检测?
24丨KNN(上):如何根据打斗和接吻次数来划分电影类型?
25丨KNN(下):如何对手写数字进行识别?
26丨K-Means(上):如何给20支亚洲球队做聚类?
27丨K-Means(下):如何使用K-Means对图像进行分割?
28丨EM聚类(上):如何将一份菜等分给两个人?
29丨EM聚类(下):用EM算法对王者荣耀英雄进行划分
30丨关联规则挖掘(上):如何用Apriori发现用户购物规则?
31丨关联规则挖掘(下):导演如何选择演员?
32丨PageRank(上):搞懂Google的PageRank算法
33丨PageRank(下):分析希拉里邮件中的人物关系
34丨AdaBoost(上):如何使用AdaBoost提升分类器性能?
35丨AdaBoost(下):如何使用AdaBoost对房价进行预测?
36丨数据分析算法篇答疑
第三模块:数据分析实战篇 (7讲)
37丨数据采集实战:如何自动化运营微博?
38丨数据可视化实战:如何给毛不易的歌曲做词云展示?
39丨数据挖掘实战(1):信用卡违约率分析
40丨数据挖掘实战(2):信用卡诈骗分析
41丨数据挖掘实战(3):如何对比特币走势进行预测?
42丨当我们谈深度学习的时候,我们都在谈什么?
43丨深度学习(下):如何用Keras搭建深度学习网络做手写数字识别?
第四模块:数据分析工作篇 (2讲)
44丨如何培养你的数据分析思维?
45丨求职简历中没有相关项目经验,怎么办?
加餐 (1讲)
加餐丨在社交网络上刷粉刷量,技术上是如何实现的?
结束语 (1讲)
结束语丨当大家都在讲知识和工具的时候,我更希望你重视思维和实战
数据分析实战45讲
登录|注册

33丨PageRank(下):分析希拉里邮件中的人物关系

陈旸 2019-02-27
上节课我们讲到 PageRank 算法经常被用到网络关系的分析中,比如在社交网络中计算个人的影响力,计算论文的影响力或者网站的影响力等。
今天我们就来做一个关于 PageRank 算法的实战,在这之前,你需要思考三个问题:
如何使用工具完成 PageRank 算法,包括使用工具创建网络图,设置节点、边、权重等,并通过创建好的网络图计算节点的 PR 值;
对于一个实际的项目,比如希拉里的 9306 封邮件(工具包中邮件的数量),如何使用 PageRank 算法挖掘出有影响力的节点,并且绘制网络图;
如何对创建好的网络图进行可视化,如果网络中的节点数较多,如何筛选重要的节点进行可视化,从而得到精简的网络关系图。

如何使用工具实现 PageRank 算法

PageRank 算法工具在 sklearn 中并不存在,我们需要找到新的工具包。实际上有一个关于图论和网络建模的工具叫 NetworkX,它是用 Python 语言开发的工具,内置了常用的图与网络分析算法,可以方便我们进行网络数据分析。
上节课,我举了一个网页权重的例子,假设一共有 4 个网页 A、B、C、D,它们之间的链接信息如图所示:
针对这个例子,我们看下用 NetworkX 如何计算 A、B、C、D 四个网页的 PR 值,具体代码如下:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《数据分析实战45讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(11)

  • szm
    有2个问题:
    第一个:pagerank已经是字典类型了,为什么还要用pagerank_list = {node: rank for node, rank in pagerank.items()}将其转换为字典呢?是不是删掉这个语句也没关系?
    第二个:阈值大于0.005的图仍有很多重叠在一起,无法观看,请问怎样才能让画出来的图像美观呢?

    编辑回复: 第一个问题:对的,pagerank是字典类型,直接使用nx.set_node_attributes(graph, name = 'pagerank', values=pagerank)是OK的
    第二个问题,阈值大于0.005时,很多图重叠在一起,可以采用nx.circular_layout(graph)来进行显示。这样可以让筛选出来的点都分布到一个圆上,来显示出来他们之间的关系。

    2019-03-04
    2
  • third
    pagerank 值是: {'C': 0.22514635472743896, 'A': 0.3245609358176832, 'D': 0.22514635472743894, 'B': 0.22514635472743896}

    import networkx as nx
    # 创建有向图
    G = nx.DiGraph()
    # 有向图之间边的关系
    edges = [("A", "B"), ("A", "C"), ("A", "D"), ("B", "A"), ("B", "D"), ("C", "A"), ("D", "B"), ("D", "C")]
    for edge in edges:
        G.add_edge(edge[0], edge[1])
    pagerank_list = nx.pagerank(G, alpha=0.85)
    print("pagerank 值是:", pagerank_list)

    编辑回复: 正确。

    2019-02-27
    2
  • %15跳转概率,对应的阻尼因子是0.85 , 阻尼因子默认就是0.85,所以在创建的时候可以直接省略啊alpha参数的设定。
    import networkx
    #创建有向图
    digraph = networkx.DiGraph()
    #有向图之间边的关系
    edges = [("A", "B"), ("A", "C"), ("A", "D"), ("B", "A"), ("B", "D"), ("C", "A"), ("D", "B"), ("D", "C")]
    for edge in edges:
        digraph.add_edge(edge[0],edge[1])
    pagerank_list = networkx.pagerank(digraph)
    print('PageRank 值是:',pagerank_list)
    输出结果:
    PageRank 值是: {'A': 0.3245609358176831, 'B': 0.22514635472743894, 'C': 0.22514635472743894, 'D': 0.22514635472743894}

    编辑回复: 正确,默认是0.85,所以可以省略。

    2019-04-21
    1
  • 白夜
    默认阻尼就是0.85,alpha去掉完事、、
    pagerank 值是: {'A': 0.3245609358176831, 'B': 0.22514635472743894, 'C': 0.22514635472743894, 'D': 0.22514635472743894}

    编辑回复: 这样使用最方便,alpha默认是0.85

    2019-02-27
    1
  • third
    提问:
     UserWarning: Pandas doesn't allow columns to be created via a new attribute name - see https://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access

    不允许列被新属性创建???

    点击网页进去,也没有找到这个警告。
    需要修改或者别的什么东西吗?
    2019-02-27
    1
  • Ronnyz
    将alpha=0.85
    pagerank值为: {'A': 0.3245609358176831, 'B': 0.22514635472743894, 'C': 0.22514635472743894, 'D': 0.22514635472743894}

    作者回复: 对的 正确

    2019-11-23
  • S.Mona
    pagerank计算的影响力,搜索结果按照影响力评分排序,这个和ElasticSearch的相关度评分排序搜索排序搜索结果有什么异同?
    2019-10-16
  • WS
    老师,怎么筛选出某个人物的有向图?
    2019-08-05
  • 永降不息之雨
    老师关于希拉里邮件的案例,这一段一直看不懂。
    我print(temp)只有得到两个人名,
    但是我print(edges_weights_temp)后
    除了人名,后面还多了一个数字,
    老师这数字是怎么来的,这段语法能帮忙解释一下吗?
        temp=(rew[0],row[1])
    if temp not in edges_weights_temp:
            edges_weights_temp[temp] = 1
        else:
            edges_weights_temp[temp] = edges_weights_temp[temp] + 1

    编辑回复: 我在程序里保存边(发送者->接受者)的权重的代码:
    for row in zip(emails.MetadataFrom, emails.MetadataTo, emails.RawText):
        temp = (row[0], row[1])
        if temp not in edges_weights_temp:
            edges_weights_temp[temp] = 1
        else:
            edges_weights_temp[temp] = edges_weights_temp[temp] + 1

    如果你print(edges_weights_temp)应该是类似这样的结果:
    {('Jake Sullivan', 'Hillary Clinton'): 815, ('nan', 'Hillary Clinton'): 20, ('Cheryl Mills', ';h'): 1, ...
    这里('Jake Sullivan', 'Hillary Clinton') 就是我们的temp,也就(row[0], row[1]),也就是保存的发送者->接收者的次数,次数为815次。
    if temp not in edges_weights_temp 判断下在字典edges_weights_temp中是否已经存在了边temp,如果没有存在就创建一个,赋值为1,也就是代表他们通信了1次。如果存在了,就找出来当时的次数,然后+1

    2019-07-03
  • mickey
    import networkx as nx
    # 创建有向图
    G = nx.DiGraph()
    # 有向图之间边的关系
    edges = [("A", "B"), ("A", "C"), ("A", "D"), ("B", "A"), ("B", "D"), ("C", "A"), ("D", "B"), ("D", "C")]
    for edge in edges:
        G.add_edge(edge[0], edge[1])
    pagerank_list = nx.pagerank(G) #alpha为阻尼因子,默认值:0.85
    print("pagerank值是:", pagerank_list)

    pagerank值是: {'A': 0.3245609358176831, 'B': 0.22514635472743894, 'C': 0.22514635472743894, 'D': 0.22514635472743894}
    2019-03-05
  • 王彬成
    1、pagerank_list=nx.pagerank(G,alpha=1)理解
    参考链接:https://networkx.github.io/documentation/networkx-1.10/reference/generated/networkx.algorithms.link_analysis.pagerank_alg.pagerank.html
    alpha指的是阻尼因子。根据公式了解到,这因子代表用户按照跳转链接来上网的概率。
    题目说15%的概率随机跳转,所以阻尼因子为0.85

    2、代码
    import networkx as nx
    # 创建有向图
    G=nx.DiGraph()
    # 有向图之间边的关系
    edges = [("A", "B"), ("A", "C"), ("A", "D"), ("B", "A"), ("B", "D"), ("C", "A"), ("D", "B"), ("D", "C")]
    for edge in edges:
        G.add_edge(edge[0],edge[1])
    pagerank_list=nx.pagerank(G,alpha=0.85)
    print('pagerank 值是: ', pagerank_list)

    3、结果
    pagerank 值是: {'A': 0.3245609358176831, 'B': 0.22514635472743894, 'C': 0.22514635472743894, 'D': 0.22514635472743894}

    编辑回复: 结果正确,对alpha阻尼因子的理解也正确

    2019-03-01
收起评论
11
返回
顶部