|
|
|
|
移动端

网上百家乐赌博犯法吗:PageRank、最小生成树:ML开发者应该了解的五种图算法

本文来源:http://www.133845.com/mil_sohu_com/

申博官网下载直营网,他还说,“台湾是我们的盟友,那是一个我们支持的国家,因为他们相信自由。  6.4任何由于黑客政击、计算机病毒侵入或发作、因政府管制而造成的暂时性关闭等影响网络正常经营等不可抗力而造成的您个人资料泄露、丢失、被盗用或被篡改等,本网站均不承担任何责任。宋仲基之所以能成为顶级演员,他细腻优美的脸部曲线绝对立了大功,那是现在最受女性欢迎的标准型帅哥脸。  其实,想要培养孩子良好的做作业习惯,家庭氛围很重要。

这样就替代掉了小朋友的练习机会,使他的练习机会不足。    陈邦绮:首先,观察孩子在同年龄段里面该会的语言能力跟理解能力,是不是都会了。主持人:腾讯网友大家好,欢迎收看腾讯健康名医堂,每年11月是国际肺癌关注月,从这样一个关注的力度可以看出,肺癌可能在生活当中已经显得越来越严重了。通过在对外开放平台的局部地区先行先试,创新开放模式、契合国际规则体系、全面优化国际营商环境,推进贸易自由化便利化,实现更大程度的开放。

您登录本网站或在本网站进行用户注册的,本网站将视为您已了解并同意接受本隐私声明。该品牌是世界知名的高档护肤,化妆,护发以及香水产品的生产商和销售商,于1968年创立,推出护肤和彩妆产品,所有产品全部通过过敏性测试,百分之百不含香料。  肝气郁结、情志不舒,疏泄无权,气血失运可致性欲低下或宗筋不举。胃轻瘫,通俗地讲就是由于人体的胃部动力不足,胃肠蠕动能力下降,导致胃排空障碍而使得食物在胃部停留的时间延长,从而出现厌食、早饱、恶心、呕吐、腹胀、吞咽困难等消化道症状,尤其是在餐后,这种症状会更加明显。

在互联世界中,用户不能被视为独立的实体。他们之间存在一定的关系,我们有时希望在构建机器学习模型时考虑到这些关系。

作者:佚名来源:机器之心|2019-09-09 14:33

在互联世界中,用户不能被视为独立的实体。他们之间存在一定的关系,我们有时希望在构建机器学习模型时考虑到这些关系。

在关系数据库中,我们无法在不同的行(用户)之间利用这种关系,但在图数据库中,这样做非常简单。

在这篇文章中,我们将讨论一些数据科学家应该了解的非常重要的图算法,以及如何使用 Python 实现它们。

连接组件

我们都知道聚类的工作机制,你可以将连接组件视为一种在关联/连接数据中查找集群/个体的硬聚类算法。

举个例子:假设你有连接世界上任何两个城市道路的数据。现在你需要找出世界上所有大洲以及它们所包含的城市。

你将如何实现这一目标呢?

我们采用的连接组件算法是基于广度优先搜索算法(Breadth First Search,BFS)/深度优先搜索算法(Depth First Search,DFS)的特殊情况。这里不再展开介绍工作原理,我们只看一下如何使用 Networkx 启动和运行此代码。

应用

从零售角度看:假设我们有很多客户使用大量账户。使用连接组件算法的一种方法是在这个数据集中找出不同的族。

我们可以根据相同的信用卡使用情况、相同地址、相同手机号码来建立某些客户 ID 之间的连接。一旦有这些连接,我们就可以运行连接组件算法为有连接的客户创建单个集群,然后为其分配一个家庭 ID。

然后,我们可以利用这些家庭 ID,根据家庭需求提供个性化推荐。我们还可以利用家庭 ID,通过创建基于家庭的分组功能来推进分类算法。

从金融角度:另一个用例是利用这些家庭 ID 抓捕诈骗犯。如果某个帐户有过被欺诈经历,那么关联帐户很容易再次受到欺诈。

实施的可能性仅仅受到自身想象力的限制。(想象力越丰富,算法的应用越广泛。)

代码

我们将使用 Python 中的 Networkx 模块来创建和分析图。下面以包含城市和城市间距离信息的图为例,实现我们的目的。

带有随机距离的图

首先创建一个带有城市名(边)和距离信息的列表,距离代表边的权重。

  1. edgelist = [['Mannheim''Frankfurt'85], ['Mannheim''Karlsruhe'80], ['Erfurt''Wurzburg'186], ['Munchen''Numberg'167], ['Munchen''Augsburg'84], ['Munchen''Kassel'502], ['Numberg''Stuttgart'183], ['Numberg''Wurzburg'103], ['Numberg''Munchen'167], ['Stuttgart''Numberg'183], ['Augsburg''Munchen'84], ['Augsburg''Karlsruhe'250], ['Kassel''Munchen'502], ['Kassel''Frankfurt'173], ['Frankfurt''Mannheim'85], ['Frankfurt''Wurzburg'217], ['Frankfurt''Kassel'173], ['Wurzburg''Numberg'103], ['Wurzburg''Erfurt'186], ['Wurzburg''Frankfurt'217], ['Karlsruhe''Mannheim'80], ['Karlsruhe''Augsburg'250],["Mumbai""Delhi",400],["Delhi""Kolkata",500],["Kolkata""Bangalore",600],["TX""NY",1200],["ALB""NY",800]] 

让我们使用 Networkx 创建一个图:

  1. g = nx.Graph() 
  2. for edge in edgelist: 
  3.     g.add_edge(edge[0],edge[1], weight = edge[2]) 

现在我们想从这张图中找出不同的大洲及其城市,这可以使用连接组件算法来实现:

  1. for i, x in enumerate(nx.connected_components(g)): 
  2.     print("cc"+str(i)+":",x) 
  3. ------------------------------------------------------------ 
  4. cc0: {'Frankfurt''Kassel''Munchen''Numberg''Erfurt''Stuttgart''Karlsruhe''Wurzburg''Mannheim''Augsburg'
  5. cc1: {'Kolkata''Bangalore''Mumbai''Delhi'
  6. cc2: {'ALB''NY''TX'

如你所见,只需要利用顶点和边,我们就能够在数据中找到不同的组件。该算法可以在不同的数据上运行,从而满足上面提到的各种用例。

最短路径

继续使用上述示例,现在我们有德国城市及城市之间距离的图。如何找到从法兰克福(起始节点)到慕尼黑的最短距离?我们用来解决此问题的算法被称为 Dijkstra。用 Dijkstra 自己的话说:

从鹿特丹到格罗宁根旅行的最短路线是什么?这就是最短路径算法,我花了大约 20 分钟设计了它。一天早上,我和我的未婚妻在阿姆斯特丹购物,累了,我们便坐在咖啡馆的露台上喝咖啡,我只想着能否实现最短路径算法,然后我成功了。

正如我所说,这是一个二十分钟的发明。事实上,它发表于 1959 年,现在来看它的可读性也非常高。它之所以如此美妙,其中一个原因就是我没用笔纸就设计了它。后来我才知道,没有笔纸设计的有点之一是你不得不避免所有可避免的复杂问题。最终,令我惊讶的是,这个算法成为我的著名成果之一。

应用

Dijkstra 算法的变体在 Google 地图中有着广泛使用,用于寻找最短路线。

假设你有沃尔玛商店中各个过道位置和过道之间距离的数据。您希望为从 A 到 D 的顾客提供最短路径。

你已经看到 LinkedIn 显示一级连接和二级连接的方式。而这背后的机制是什么呢?

代码

  1. print(nx.shortest_path(g, 'Stuttgart','Frankfurt',weight='weight')) 
  2. print(nx.shortest_path_length(g, 'Stuttgart','Frankfurt',weight='weight')) 
  3. -------------------------------------------------------- 
  4. ['Stuttgart''Numberg''Wurzburg''Frankfurt'
  5. 503 

你也可以找到所有对之间的最短路径:

  1. for x in nx.all_pairs_dijkstra_path(g,weight='weight'): 
  2.     print(x) 
  3. -------------------------------------------------------- 
  4. ('Mannheim', {'Mannheim': ['Mannheim'], 'Frankfurt': ['Mannheim''Frankfurt'], 'Karlsruhe': ['Mannheim''Karlsruhe'], 'Augsburg': ['Mannheim''Karlsruhe''Augsburg'], 'Kassel': ['Mannheim''Frankfurt''Kassel'], 'Wurzburg': ['Mannheim''Frankfurt''Wurzburg'], 'Munchen': ['Mannheim''Karlsruhe''Augsburg''Munchen'], 'Erfurt': ['Mannheim''Frankfurt''Wurzburg''Erfurt'], 'Numberg': ['Mannheim''Frankfurt''Wurzburg''Numberg'], 'Stuttgart': ['Mannheim''Frankfurt''Wurzburg''Numberg''Stuttgart']}) 
  5. ('Frankfurt', {'Frankfurt': ['Frankfurt'], 'Mannheim': ['Frankfurt''Mannheim'], 'Kassel': ['Frankfurt''Kassel'], 'Wurzburg': ['Frankfurt''Wurzburg'], 'Karlsruhe': ['Frankfurt''Mannheim''Karlsruhe'], 'Augsburg': ['Frankfurt''Mannheim''Karlsruhe''Augsburg'], 'Munchen': ['Frankfurt''Wurzburg''Numberg''Munchen'], 'Erfurt': ['Frankfurt''Wurzburg''Erfurt'], 'Numberg': ['Frankfurt''Wurzburg''Numberg'], 'Stuttgart': ['Frankfurt''Wurzburg''Numberg''Stuttgart']}) 
  6. .... 

最小生成树(Minimum Spanning Tree,MST)

现在我们面临另一个问题。假设我们在水管铺设公司或电线公司工作。我们需要使用最少的电线/管道来连接图中所有城市。我们如何做到这一点?

左: 无向图; 右: 对应 MST

应用

  • 最小生成树在网络设计中有直接应用,包括计算机网络、电信网络、交通网络、供水网络和电网(最初是为它们发明的)。

  • MST 用于近似旅行商问题。

  • 聚类:首先构建 MST,然后使用类间距离和类内距离确定阈值,用于打破 MST 中某些边。

  • 图像分割:首先在图上构建 MST,其中像素是节点,像素之间的距离基于某种相似性度量(颜色、强度等)

代码

  1. # nx.minimum_spanning_tree(g) returns a instance of type graph 
  2. nx.draw_networkx(*nx.minimum_spanning_tree*(g)) 

左: 无向图; 右: 对应 MST.

Pagerank

上图为谷歌提供长期支持的页面排序算法(page sorting algorithm)。它根据输入和输出链接的数量和质量为页面打分。

应用

Pagerank 可用于任何我们想要估算网络节点重要性的地方。

  • 它已被用于查找影响力最高的论文;

  • 它已被 Google 用于网页排名;

  • 它可用于将推文-用户和推文排序为节点。如果用户 A 跟帖用户 B,则在用户之间创建链接;如果用户发推/转推,则在用户和推文之间建立链接;

  • 推荐引擎。

代码

在本次练习中,我们将使用 Facebook 数据。我们在 facebook 用户之间有一个边/链接文件。首先通过以下方法创建 Facebook 图:

  1. # reading the dataset 
  2. fb = nx.read_edgelist('../input/facebook-combined.txt', create_using = nx.Graph(), nodetype = int

它是这样的:

  1. pos = nx.spring_layout(fb) 
  2.  
  3. import warnings 
  4.  
  5. warnings.filterwarnings('ignore'
  6. plt.style.use('fivethirtyeight'
  7. plt.rcParams['figure.figsize'] = (2015
  8. plt.axis('off'
  9. nx.draw_networkx(fb, pos, with_labels = False, node_size = 35
  10. plt.show() 

Facebook 用户图

现在我们想要找出具有高影响力的用户。直观地说,Pagerank 算法会给拥有很多朋友的用户打高分,而这些朋友又拥有很多 Facebook 朋友。

  1. pageranks = nx.pagerank(fb) 
  2. print(pageranks) 
  3. ------------------------------------------------------ 
  4. {00.006289602618466542
  5.  10.00023590202311540972
  6.  20.00020310565091694562
  7.  30.00022552359869430617
  8.  40.00023849264701222462
  9. ........} 

利用以下代码可以得到排序的 PageRank 或最具影响力的用户:

  1. import operator 
  2.  
  3. sorted_pagerank = sorted(pagerank.items(), key=operator.itemgetter(1),reverse = True) 
  4. print(sorted_pagerank) 
  5. ------------------------------------------------------ 
  6. [(34370.007614586844749603), (1070.006936420955866114), (16840.0063671621383068295), (00.006289602618466542), (19120.0038769716008844974), (3480.0023480969727805783), (6860.0022193592598000193), (39800.002170323579009993), (4140.0018002990470702262), (6980.0013171153138368807), (4830.0012974283300616082), (38300.0011844348977671688), (3760.0009014073664792464), (20470.000841029154597401), (560.0008039024292749443), (250.000800412660519768), (8280.0007886905420662135), (3220.0007867992190291396),......] 

以上 ID 即为最有影响力的用户。最具影响力用户的子图如下所示:

  1. first_degree_connected_nodes = list(fb.neighbors(3437)) 
  2. second_degree_connected_nodes = [] 
  3.  
  4. for x in first_degree_connected_nodes: 
  5.     second_degree_connected_nodes+=list(fb.neighbors(x)) 
  6.  
  7. second_degree_connected_nodes.remove(3437
  8. second_degree_connected_nodes = list(set(second_degree_connected_nodes)) 
  9. subgraph_3437 = nx.subgraph(fb,first_degree_connected_nodes+second_degree_connected_nodes) 
  10.  
  11. pos = nx.spring_layout(subgraph_3437) 
  12. node_color = ['yellow' if v == 3437 else 'red' for v in subgraph_3437] 
  13. node_size =  [1000 if v == 3437 else 35 for v in subgraph_3437] 
  14.  
  15. plt.style.use('fivethirtyeight'
  16. plt.rcParams['figure.figsize'] = (2015
  17. plt.axis('off'
  18. nx.draw_networkx(subgraph_3437, pos, with_labels = False, node_color=node_color,node_size=node_size ) 
  19. plt.show() 

黄色为最具影响力用户

中心性度量

你可以将许多中心性度量用作机器学习模型的特征,这里只谈其中的两个。

其他度量链接:/networkx_github_io/documentation/networkx-1.10/reference/algorithms.centrality.html#current-flow-closeness。

介数中心性:不仅拥有众多朋友的用户很重要,将一个地理位置连接到另一个位置的用户也很重要,因为这样可以让用户看到不同地点的内容。

介数中心性量化了一个特定节点在其他两个节点之间最短路径中出现的次数。

点度中心性:它只是节点的连接数。

代码

以下是查找子图介数中心性的代码:

  1. pos = nx.spring_layout(subgraph_3437) 
  2.  
  3. betweennessCentrality = nx.betweenness_centrality(subgraph_3437,normalized=True, endpoints=True) 
  4. node_size =  [v * 10000 for v in betweennessCentrality.values()] 
  5.  
  6. plt.figure(figsize=(20,20)) 
  7. nx.draw_networkx(subgraph_3437, pos=pos, with_labels=False, 
  8.                  node_size=node_size ) 
  9. plt.axis('off'

你可以在此处查看按介数中心性值确定大小的节点。他们可以被认为是信息传递者。打破任何具有高介数中心性的节点将会将图形分成许多部分。

【编辑推荐】

  1. 申博官网下载直营网谷歌开源基于ML的手部跟踪算法:手机端实时检测,多个手势同时捕捉
  2. 申博官网下载直营网苹果跳级 直接推出iOS 13.1开发者测试版
  3. 中欧 PHP 开发者大会因多元化争议而取消
  4. 一道字节跳动的算法面试题,你能做出来吗?
  5. 苹果可能以人民币美元 1:1 的兑换率给中国开发者汇款
【责任编辑:张燕妮 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

这就是5G

这就是5G

5G那些事儿
共15章 | armmay

119人订阅学习

16招轻松掌握PPT技巧

16招轻松掌握PPT技巧

GET职场加薪技能
共16章 | 晒书包

371人订阅学习

20个局域网建设改造案例

20个局域网建设改造案例

网络搭建技巧
共20章 | 捷哥CCIE

764人订阅学习

读 书 +更多

网管员必读—网络基础

本书共分两篇,15章。其中前6章为网络理论基础篇,介绍的是基本的网络技术,包括计算机网络分类、网络通信协议、IP地址和网线制作等。在第...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微

www.87msc.com 申博直营现金网 申博桌面安装版手机网页版 www.508sun.com 申博开户登入 申博代理官网登入
申博真人娱乐官网直营 申博开户平台登入 申博138娱乐登入 申博真人游戏直营网 777老虎机微信支付充值 太阳城申博登入
申博娱乐网址大全直营网 申博138直营网 四川申博官网登入 申博app手机直营网 申博游戏下载网址 菲律宾申博娱乐直营官网