使用Python和SAS Viya分析社交网络

 ​

本示例使用Python和SAS分析了预防高危药物研究的结果。这个社交网络有194个节点和273个边,分别代表药物使用者和这些使用者之间的联系。

由Kaizong Ye,Qing Li撰写

SAS Viya的最新版本提供了用于探索实验问题的全套创新算法和经过验证的分析方法,但它也是基于开放式体系结构构建的。这意味着您可以将SAS Viya无缝集成到您的应用程序基础架构中,并使用任何编程语言来驱动分析模型。 

尽管您可以继续进行并简单地发出一系列REST API调用来访问数据  但通常使用编程语言来组织您的工作并使之可重复是更有效的。我决定使用Python,因为它在年轻的数据科学家中很流行 。

×

1 社区检测
先来说说什么是社区发现吧,学术上的说法是:一个社区由一组连接紧密的结点组成,
同时这些结点与社区外部的结点连接稀疏,如下图所示。那么,社区发现就是在复杂网络中
发现这些连接紧密的社区结构。其实,我个人觉得,社区发现就是网络中的节点聚类
在这里插入图片描述
2 社区检测与聚类的区别
社团检测通常是指将网络中联系紧密的部分找出来,这些部分就称之为社团,那么也可
以认为社团内部联系稠密,而社团之间联系稀疏 。显而易见,其中有一个非常重要的点,
稠密是如何定义的。不管现在想到的定义是什么,但都包含顶点,边,度,或许还有路径这
些字眼,它们有一个共同的特征–网络的结构。所以,社团检测侧重于找到网络中联系紧密
的部分,而经常忽略节点的属性(attributes)。
聚类,顾名思义是将属于同一类的目标聚在一起,通常在聚类之前我们是不知道目标
有哪些类型,这也是一种典型的无监督学习方法。那么现在来想想我们熟知的聚类方法:kmeans,层次聚类等。其中,最核心的一个部分是计算两个目标之间的距离(或者称为相似
度),距离近则它俩是一类,距离远,那就自成一派,或者去找其它距离近的。当然,距离
近只是其中一种方法,还有距离远或者怎么样,就看自己的判断。判断标准不是讨论的重点,
重点是如何计算距离。欧式距离,曼哈顿距离,余弦相似度等,都是直接用目标特征构成的
向量来计算的,没有考虑目标的边,度。所以,聚类侧重于找到一堆属性相似的目标,从而
忽略了目标与目标之间的联系。
两者之间的关系已经很清楚啦,社团检测和聚类存在区别,但是呢,两者又是可以结合
起来的。比如,我们现在有一个网络,只知道顶点和边的情况,顶点的属性是未知的。那么在
做社团检测的时候,可以将顶点与顶点之间的关系构成一个邻接矩阵,通过一系列变化或者
就这个邻接矩阵而言,将每个行看作一个属性,每个列看作目标,就可以很轻松的转为聚类,
用聚类的方法求解。当邻接矩阵高维时,还可以先做降维处理。所以,两者并没有完全独立,
只是考虑的角度不同,可以结合使用。现在社交网络方向有一个很热门的就是用 attributes
来辅助进行社团检测,是对传统的社团检测和聚类方法的一种改进,两者优势互补。
3 图划分
图划分主要是一分为二的划分方法,代表算法是:K-L 算法和谱二分法
3.1 K-L 算法
3.2 谱二分法
3.3 GN 算法(2002 年)
由定义可知,如果一条边连接两个社区,那么这两个社团节点之间的最短路径通过该边
的次数就会最多,相应的边介数最大。如果删除该边,那么两个社团就会分割开。GN 算就
就是基于此思想反复计算当前网络的最短路径,计算每条边的边介数,删除边介数最大的边。
最后在一定条件下,算法停止,即可得到网络的社区结构。
在这里插入图片描述
GN 算法的执行流程。1. 使用最短路径算法求在图 1.a 上求出顶点 1 到顶点 8 的最短路
径(图中红色部分)。2. 反复调用步骤 1,探测网络所有顶点之间的最短路径,统计出所有边
的边介数,如图 1.b 所示。3. 统计出最大边介数,然后删除,得到如图 1.c 所示的社区结构。
4. 重新计算网络中剩下的边的边阶数;5. 重复 1.2.3.4 步骤,直到网络中的任一顶点作为一
个社区为止。GN 算法的缺陷:(1)不知道最后会有多少个社区;(2)在计算边介数的时
候可能会有很对重复计算最短路径的情况,时间复杂度太高;(3)GN 算法不能判断算法终
止位置。为了解决这些问题,Newman 引入了模块度 Q 的概念,它用来一个评价社区结构
划分的质量。网络中的社区结构之间的边数并不是绝对数量上的少,而是应该比期望的边数
要少。

出于演示目的,我使用一个名为Jupyter的接口,该接口是一个开放的,基于Web的交互式平台,能够运行Python代码以及嵌入标记文本。 

访问SAS云分析服务(CAS)

SAS Viya的核心是称为SAS Cloud Analytic Services(CAS)的分析运行时环境。为了执行操作或访问数据,需要连接会话。您可以使用二进制连接(建议使用该连接来传输大量数据),也可以通过HTTP或HTTPS通信使用REST API。 


课程

R语言数据分析挖掘必知必会

从数据获取和清理开始,有目的的进行探索性分析与可视化。让数据从生涩的资料,摇身成为有温度的故事。

立即参加

 
 import matplotlib.colors as colors #程序包包括用于颜色范围的程序
 import matplotlib.cm as cmx
 import networkx as nx #呈现网络图

现在已经加载了库,我们可以发连接到CAS并为给定的用户创建会话。 

 s = CAS('http://sasviya.mycompany.com:8777', 8777, 'myuser', 'mypass')

对于此网络分析,我将使用一个名为hyperGroup 的集。

​ s.loadactionset('hyperGroup') ​

加载数据 

为了执行任何分析建模,我们需要数据。 将本地CSV文件上载到服务器,并将数据存储到名为DRUG_NETWORK的表中。该表只有两列数值类型的FROMTO

​
 inputDataset = s.upload("data/drug_network.csv", casout=dict(name='DRUG_NETWORK', promote = True))
 
​

在分析建模期间,您通常必须更改数据结构,过滤或合并数据源。 这里的put函数将两个数字列都转换为新的字符列SOURCETARGET

​
 sasCode = 'SOURCE = put(FROM,best.); TARGET = put(TO,best.);\n'
 dataset = inputDataset.datastep(sasCode,casout=dict(name='DRUG_NETWORK2', replace = True))
 
​

数据探索

建立分析模型时的常见任务是首先了解您的数据。下面的示例返回数据集的前5行。

 dataset.fetch(to=5, sastypes=False, format=True) #列出开头5行


一个简单的汇总统计数据会显示更多详细信息,包括我们数据集中273条边的总数。

 dataset.summary()

图形布局

首先,我们将网络可视化,以基本了解其结构和大小。我们将通过力导向算法来计算顶点的位置。Hypergroup还可以用于查找群集,计算图布局以及确定网络度量标准,例如社区和中心性。

 s.hyperGroup.hyperGroup(
    createOut = "NEVER", # 这样可以禁止创建通常生成的表
    allGraphs = True, # 处理所有图形
    inputs    = ["SOURCE", "TARGET"], #指示边和目标列
    table     = dataset, # 输入数据集
    edges     = table(name='edges',replace=True), # 结果表包含edge属性
    vertices  = table(name='nodes',replace=True)  # 包含点属性的结果表
 )
 renderNetworkGraph() # 使用networkx包创建图形

 呈现了以下网络,并提供了图形的第一视图。我们可以看到两个主要分支,并了解高密度和低密度区域。 

社区检测

为了了解社交网络中用户的关系,我们将分析个人所属的社区。社区检测或聚类是将网络划分为社区,使社区子图中的链接比社区之间的链接更紧密地连接的过程。同一社区中的人们通常具有共同的属性,并表示他们之间有着密切的联系。 

现在,更新后的节点表包含一个附加列_Community_  ,其中包含我们网络中每个节点的值。给定此数据集,我们可以执行基本统计信息,例如跨列的不同计数:

结果表显示,确定了我们网络中的24个社区。

让我们看一下最大的5个最大社区,并分析节点分布。 

我们将获取的行重定向到Python变量中。我们将使用它来生成条形图,显示前5个最大的社区:

这表明最大的社区13具有35个顶点。 以下示例显示社区4中的节点:

最后,让我们再次渲染网络–这次在为节点着色时考虑了社区:

通常,需要根据您的网络规模和期望的结果来调整社区的数量。将小型社区合并为大型社区。社区可以合并:

  • 随机进入邻近社区
  • 进入顶点数量最少的相邻社区
  • 以最大数量的顶点
  • 进入已经具有nCommunities顶点的社区

下面将通过指定nCommunities参数将社区总数减少到5 。

集中性分析

分析中心性有助于确定谁在网络中很重要。重要人物将被很好地联系起来,因此对网络中的其他个人具有很高的影响力。就我们针对吸毒者的社交网络而言,这将表明潜在的病毒传播和个人的相关风险行为。

每个度量标准都表示为节点数据集中的输出列。

让我们使用集中度度量之一作为节点大小再次渲染网络。 

子集网络分支

从我们的网络来看,社区2中的用户似乎扮演着重要角色。这由社区的整体中心地位,也由该社区中大多数个人的高beetweenness值表明。以下代码过滤并渲染了社区2的网络,仅使我们对该子网络有了更好的可视化。

上面的示例使用了标准的二维导向图布局。在更复杂的情况下,可能还需要在分析网络结构时考虑使用其他维度。 

 

 ​


可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498

关注有关新文章的微信公众号


永远不要错过任何见解。当新文章发表时,我们会通过微信公众号向您推送。

技术干货

最新洞察

This will close in 0 seconds