最近《复杂网络建模》这门课要考试了,正好也在跟Stanford的《CS224W:Machine Learning With Graphs》这门课,这里就一边整理笔记一边复习了。
网络(network)是一些通过链接(links)连接起来的对象集合,它包含以下成分:
对象和交互组成的系统我们就称为网络(或图,graph),用\(G(N,E)\)表示。
一般而言,我们用术语网络来称呼一个真实的系统,如Web、社交网络、代谢网络等,此时伴随着术语节点和链接进行使用;而相对应地,我们用术语图来称呼一个网络的数学表示,如web图、社交图等,此时伴随着术语顶点和边来使用。当然,大多数情况下我们会互换使用这两个术语。
无向图
无向图的链接是无方向(undirected)的,也对称(symmetrical)、互反的(reciprocal), 常见的例子包括合作网络、Facebook上的朋友关系等。

有向图
有向图的链接是有方向(directed)的,此时的有向边也称为弧(arcs),常见的例子包括打电话网络、Twitter上的关注网络等。

对于无向图而言,节点\(i\)的度(degree)\(k_i\)是指和节点\(i\)相邻的边数。如下图所示\(k_A=4\)。
无向图的平均度定义为:
(这里用到握手定理:无向图中节点的度之和等于边数的两倍)
而对于有向图而言,我们定义节点的出度为“离开”该节点的边数,入度为“进入”该顶点的边数。有向图中节点的度定义为其初度和入度的和。如对下面这个图我们有:\(k_C^{\text {in }}=2,k_C^{\text {out }}=1, k_C=3\),有向图的平均度定义为:
在有向图中,我们有总入度等于总出度之和,即\(\overline{k^{\text {in }}}=\overline{k^{\text {out }}}\)。此外,我们将入度\(k^{in}=0\)的节点称为源节点(source),将出度\(k^{out}=0\)的节点称为汇点(slink)。
一个有\(N\)个节点的无向图所拥有的最大边数为:
边数\(E=E_{max}\)的无向图称为完全图(complete graph),其平均度为\(N-1\)。下图展示了一个完全图:

二分图的节点可以被分为两个不相交的子集\(U\)和\(V\),使得每条边都连接着\(U\)中的一个顶点和\(V\)中的一个顶点。也就是说,\(U\)和\(V\)是独立集(independent sets)。
常见的二分图包括:作者和其撰写的论文构成的网络、演员和其出演的电影构成的网络、用户和其打分的电影构成的网络。
对于上面这个二分图,我们还可以画出其对应的“折叠”(folded)网络如下:
“折叠”网络可以用来表示作者之间的合作关系和电影合作网络。
邻接矩阵(adjacency matrix)
我们可以用邻接矩阵\(A\)来表示图,其中当节点\(i\)和\(j\)之间存在链接时\(A_{ij}=1\),否则\(A_{ij}=0\)。注意有向图的邻接矩阵不是对称的。如对于下列的两个图
其邻接矩阵分别为
边表(edge list)
我们也可以用边组成的集合来表示图,如图
就可以表示为
邻接表(adjacency list)
邻接表一般用于网络大而稀疏的情况,它可以让我们快速地检索到给定节点的邻居。上面这张图的邻接表表示为:
现实世界中的网络常常是稀疏的,即\(E\ll E_{max}\)(或\(\bar{k}\ll N - 1\)),比如下面就列出了几种现实世界网络的属性:
| 网络名称 | 节点数\(N\) | 平均度\(\bar{k}\) |
|---|---|---|
| WWW(Stanford-Berkeley) | 319,717 | 9.65 |
| Social networks(LinkedIn): | 6,946,668 | 8.87 |
| Communication(MSN IM): | 242,720,596 | 11.1 |
| Coauthorships (DBLP): | 317,080 | 6.62 |
| Internet (AS-Skitter): | 1,719,037 | 14.91 |
| Roads (California): | 1,957,027 | 2.82 |
| Proteins(S. Cerevisiae): | 1,870 | 2.39 |
这样用邻接矩阵进行存储的话就会有大量的0导致存储空间浪费(邻居矩阵密度(\(E/N^2\)):\(\text{WWW}=1.51\times 10^{-5}\), \(\text{MSN IM}=2.27\times 10^{-8}\))。此时邻接表就有了用武之地。
关于边属性(edge attributes)
图的边可能还自带有属性,包括:
无权图(unweighted graph)
上面这个无权图的邻接矩阵为:
这里\(A_{ii} = 0\),\(A_{ij}=A_{ji}\)。
其边数\(E=\frac{1}{2} \sum_{i, j=1}^N A_{i j}\),平均度\(\bar{k}=\frac{2 E}{N}\)。
常见的无权图例子包括朋友网络,超链接网络。
带权图(weighted graph)
带权图就是指图中的每一条边都有对应的一个数值权重。
上面这个带权图的邻接矩阵为:
这里\(A_{ii}=0\),\(A_{ij}=A_{ji}\)。
其边数\(E=\frac{1}{2} \sum_{i, j=1}^N \operatorname{nonzero}\left(A_{i j}\right)\),平均度\(\bar{k}=\frac{2 E}{N}\)。
常见的带权图例子包括合作网络、英特网、公路网络。
带自环(self-loops/self-edges)的图
对\(E\)中的边\(e=(u, v)\),若\(u=v\),则\(e\)被称为一个自环。
上面这个带自环图的邻接矩阵为:
这里\(A_{ii}\neq 0\),\(A_{ij}=A_{ji}\)。
其边数\(E=\frac{1}{2} \sum_{i, j=1, i \neq j}^N A_{i j}+\sum_{i=1}^N A_{i i}\)。
常见的带自环的图包括蛋白质网络,超链接网络等。
多重图(multigraph)
多重图是一个允许有重边(也称多重边,平行边)的图,重边即两个顶点之间可能存在多条边。在无向图中,关联一对顶点的无向边如果多于1条,则称这些边为重边;在有向图中,关联一对顶点的有向边如果多于1条,并且这些边的始点与终点相同(也就是他们的方向相同),称这些边为重边。这也就是说在无向图中\((u, v)\)和\((v, u)\)算一组重边,而在有向图中,\(u\rightarrow v\)和\(v\rightarrow u\)不为重边。
上面这个多重图的邻接矩阵为:
这里\(A_{ii}=0\),\(A_{ij}=A_{ji}\)。
其边数\(E=\frac{1}{2} \sum_{i, j=1}^N \text { nonzero }\left(A_{i j}\right)\),平均度\(\bar{k}=\frac{2 E}{N}\)。
常见的多重图例子包括通信网络,合作网络等。
无向图的连通性
对于无向图,若任意两个顶点都能够通过一条路径连接,则我们称其为连通的。
一个不连通的图由两个或多个连通的分量(connected components)组成(也称为连通块)。其中巨大的连通分量我们将其称为gaint component,如下图所示就有3个连通分量:

图中的节点\(H\)的度\(d(H)=0\),我们将其称为孤立点(isolated node)。
我们有以下定义
有向图的连通性
对于有向图,若图中每个节点都有一条到其它节点的路径(反之亦然),如A-B路径和B-A路径,我们就称它是强连通的;如果只有在我们忽视了边的方向的条件下才是连通的,则称它为弱连通的。
上面这个有向图是连通的,但不是强连通的(比如不存在按照边的方向从\(F\)到\(G\)的路径)。
[1] http://web.stanford.edu/class/cs224w/
[2] Easley D, Kleinberg J. Networks, crowds, and markets: Reasoning about a highly connected world[M]. Cambridge university press, 2010.
[3] Barabási A L. Network science[J]. Philosophical Transactions of the Royal Society A: Mathematical, Physical and Engineering Sciences, 2013, 371(1987): 20120375.
[4] 《图论概念梳理》
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2