草庐IT

图数据挖掘:网络中的级联行为

Orion's Blog 2023-03-28 原文

1 网络中的传播

1.1 一些传播的例子

我们现在来研究网络中的传播。事实上,在网络中存在许多从节点到节点级联的行为,就像传染病一样。这在不同领域中都有所体现,比如:

  • 生物学 传染性疾病

  • 信息技术 级联故障,信息的传播

  • 社会学 谣言、新闻、新技术的传播,虚拟市场

下图就展示了一个信息经由媒体扩散(diffusion)的过程:

1.2 基于网络构建传播模型

接下来我们看如何基于网络构建传播模型。以传染病为例,传染病会沿着网络的边进行传播。这种传播形成了一个传播树,也即级联,如下图所示:

我们定义一些术语:将其中传播的对象为contagion;被传染这一事件称为adoption、infection或activation;已被传染的节点称为infected/active nodes或adoptors。

接下来我们来看如何为扩散进行建模。目前已经提出了决策模型概率模型两种模型。

  • 决策模型 在这种模型中每个节点会先观察其邻居的决策,然后再以此为依据做出自己的决策。比如若我的\(k\)个朋友去参加了游行,那么我就去。
  • 概率模型 在这种模型中一个已被传染的节点会以一定概率传染其它没有被传染的节点。比如我有几个邻居已经被传染,那么我也有一定概率被传染。这种模型通常用于影响或疾病传播建模。

本篇文章我们介绍决策模型中的集体行动模型和协调博弈模型,下篇文章我们再介绍概率模型。

2 集体行动模型

2.1 模型介绍

Granvetter于1978年提出了集体行动(collective action)模型[1]。在这种模型中,每个人都可以看见任何人的行为并以此为依据进行行动(这也就意味着我们假设网络是完全图)。该模型在日常生活中的一些常见例子包括:在剧院鼓掌或起身离开、在股市中是否存钱以及日常生活中的抗议、罢工等等。接下来我们来探究参与某个给定活动的人数是如何随着时间的推移而增减的。

设有\(n\)个人且每个人可以观测到彼此的行动。对每个人\(i\)都有一个阈值\(t_i(0\leq t_i \leq 1)\)。当且仅当至少有占比\(t_i\)的人采取了某个行为时,节点\(i\)也会采取该行为。事实上\(i\)节点采取行动的概率是如下的阶跃函数(横轴是采取行动的人数比例):

小的\(t_i\)也就意味着\(i\)是一个早采纳者(early adopter),而大的\(t_1\)则意味着\(i\)是一个迟采纳者(late adopter)。我们假设这里的时间步是离散的。

我们设\(\{t_1,\cdots, t_n\}\)为所有人的行动阈值集合。设\(F(x)\)为阈值\(t_i\leq x\)的人数比例(\(F(\cdot)\)事先已给定,它是传染一个的属性),它是非递减的,即满足:

\[F(x+\varepsilon) \geq F(x) \]

该模型是一个动态的模型,采取行动的人数会一步步地变化,如下图所示:

图中\(F(x)\)表示阈值\(t_i\leq x\)的人数比例,\(s(t)\)表示在\(t\)时刻已加入行动的人数比例。我们发现行动人数的变化速率并不均匀:中间最陡,说明大多数人的阈值比较集中,而左右两端则可分别视为早采纳者和晚采纳者的阈值。

我们模拟\(s(t)\)随着\(t\)的迭代过程:

\[\begin{aligned} &s(0)=0 \\ &s(1)=F(0) \\ &s(2)=F(s(1))=F(F(0)) \end{aligned} \]

我们进一步地进行模拟,有:

\[s(t+1)=F(s(t))=F^{t+1}(0) \]

直观地理解该迭代,就是\(t\)时刻已加入的行动人数\(s(t)\)会在\(t+1\)时刻带动更多的人(\(F(s(t))\))加入行动。最终模型会收敛到不动点(fixed point)\(F(x)=x\),如下图所示:

当然,可能也存在其它不动点。不过从\(0\)开始我们只能到达其中的第一个。

如果我们想要从某个其它的地方开始这个过程,则可以往上/往下移动到下一个不动点:

如下图所示,不动点有稳定不动点和不稳定不动点之分。稳定不动点周围坡度较为平缓,不稳定不动点周围坡度较为陡峭。

2.2 不连续的过渡

我们假设每个节点的阈值\(t_1\)是独立地从分布\(F(x)=\operatorname{Pr}[\text { thresh } \leq x]\)中采样得到的。假定该分布为\(\mu=45\)的截断(truncated)正态分布,则\(F(x)\)的图像会根据该分布的方差进行变化,如下图所示:

可以看见,大的方差会使早采纳者和主流人群之间的过渡更为平稳。

我们尝试再增大方差则不动点会升高,然而如果我们再进一步增大方差则不动点又会降低:

2.3 模型的弱点

首先,该网络缺少一些社交网络中的概念。比如在社交网络中有一些人是易受影响的。而这直接关系到谁是早采纳者,而不仅仅是早采纳者有多少。

此外,该模型仅仅是建模了人们对参与人数的认识,而不是实际参与人数的多少。也即和“你认为谁会采取该行为”和“谁实际采取了该行为”的区别。这会导致人们在一段时间被“锁定”在某些选择上。

最后,在对阈值的建模上,我们还可以探索更多的分布,或者从一些基础理论(如博弈论模型)来对阈值进行推导。

2.4 多元无知现象

上述的模型需要假设网络是完全图的。然而在现实世界,每个人接受的信息其实大都是片面的,而这会导致他们根据周围的信息来对集体行动做出的决定并不靠谱。比如若某个专制政府限定公民之间的沟通,那么就算已经有足够大的人口比例想反对当前政府并采取极端措施,他们也会觉得自己是一个小群体,并认为这种反抗有很大风险。

多元无知(pluralistic ignorance) 是指人们普遍地错误估计整个民众对一些意见的反应。这是一个使用广泛的原则,不仅仅是在一个中央集权制度限制信息的流通环境。例如,1970年在美国进行的一项调查表明(同一时期实施的几个调查也得到了类似的结果),虽然那个时期只有少数美国白人主张种族隔离,大大超过\(50\%\)的人认为他们所在地区大多数美国白人支持这个主张[2]

3 协调博弈模型

3.1 模型介绍

该模型基于两个玩家的协调博弈(coordination game)理论,假设每人只能从行为\(A\)\(B\)中选一个来采纳,且如果你和你的朋友采取了相同的行为,则你会获得回报(payoff)。

我们定义一个如下图所示的关于节点\(v\)\(w\)的回报矩阵,使得当\(v\)\(w\)都采取行为\(A\)的时候,它们获得回报\(a>0\);当\(v\)\(w\)都采取行为\(B\)的时候,它们获得回报\(b>0\);当\(v\)\(w\)采取相反行为的时候,它们获得\(0\)回报。

w-A w-B
v-A \(a,a\) \(0,0\)
v-B \(0,0\) \(b,b\)

每个节点\(v\)和会和所有其邻居进行一次这个游戏,最终算将每次进行游戏的回报进行求和。

接下来我们来看节点\(v\)如何做出决策。

我们设节点\(v\)拥有\(d\)个邻居,\(p\)为其邻居中采取行动\(A\)所占的数量,\((1-p)d\)为其邻居中采取行动\(B\)所占的数量。则\(v\)采取行动\(A\)\(B\)分别获得的总回报分别为:

\[\begin{aligned} \text { Payoff }_v &=a \cdot p \cdot d & & \text { if } v \text { chooses } A \\ &=b \cdot(1-p) \cdot d & & \text { if } v \text { chooses B } \end{aligned} \]

\(a \cdot p \cdot d>b \cdot(1-p) \cdot d\)\(v\)会采取行为\(A\)。进一步化简得到

\[p>\frac{b}{a+b} \]

我们设\(q=\frac{b}{a+b}\)为回报阈值,即当\(p>q\)\(v\)会选择行为\(A\)

3.2 传播实例

接下来我们来看一个协调博弈模型的传播实例。给定一个图,我们设每个人最开始都采取的行为\(B\)。设存在一个由行为\(A\)的早采纳者所组成的小子集\(S\),且我们假定他们是顽固派(Hard-wire),也即他们始终会采取行为\(A\)而不管使用多少回报来企图改变他们。

我们假定有以下的回报设置:对于一个节点而言,如果他的朋友中有大于\(q=50\%\)的人采取行为\(A\),则他也采取行为\(A\)。这也就意味着\(a=b-\epsilon\)(\(\epsilon>0\)是一个小的正常数)且\(q=\frac{1}{2}\)

我们接下来看传播的模拟情况。初始时,\(S=\{u,v\}\),它们采取行为\(A\),被标记为红色。

如果我的朋友超过\(q=50\%\)是红色,则我也为红色。于是下一步该网络变化为:

又过了一个时间步变为:

最后,网络变化为:

4 级联的启动者与k-core分解

一个成功级联的启动者会具有怎样的特征呢?我们猜想它会在网络中的核心位置。而寻找网络中的核心节点就需要用到\(k\text{-core}\)分解。

\(G\)\(k\text{-core}\)是指\(G\)中的一个极大连通子图,其中所有节点的度都至少为\(k\)。寻找图的\(k\text{-core}\)的方法就是重复移除度小于\(k\)的所有节点,直到不能再移除为止(注意这是一个动态的过程,移除节点后其相邻节点的度也会跟着变化,还需要根据变化后的度来考虑是否移除其邻居)。节点的\(k\text{-core}\)值越高意味着它越核心。

一个图\(k\text{-core}\)分解的示例如下:

下图展示了对一个真实网络的\(k\text{-core}\)分解:

其中红色节点启动了成功的级联,而且拥有更高的\(k\text{-core}\)值。所以,成功级联的启动者在网络中是核心的,并且链接到同样紧密联系的用户。

参考

  • [1] Granovetter M. Threshold models of collective behavior[J]. American journal of sociology, 1978, 83(6): 1420-1443.

  • [2] O'Gorman H J, Garry S L. Pluralistic ignorance—A replication and extension[J]. Public Opinion Quarterly, 1976, 40(4): 449-458.

  • [3] http://web.stanford.edu/class/cs224w/

  • [4] Easley D, Kleinberg J. Networks, crowds, and markets: Reasoning about a highly connected world[M]. Cambridge university press, 2010.

  • [5] Barabási A L. Network science[J]. Philosophical Transactions of the Royal Society A: Mathematical, Physical and Engineering Sciences, 2013, 371(1987): 20120375.

有关图数据挖掘:网络中的级联行为的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用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

  6. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  7. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>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

  8. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  9. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  10. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

随机推荐