影响力传播的线性阈值模型:

网络中连接任意两个节点u,v之间的边都有权重,任意一个节点它的各个邻居节点的边的权重之和为1,即

N(v):neighbors of v.

网络中的节点分为已激活节点和未激活节点,每个节点都有一个自己的激活阈值Θ(每个节点的激活阈值可以不同,且现实情况下社交网络的各个用户的激活阈值一般不相同,有的用户活跃,阈值低,容易受人影响,而有的用户较沉默,阈值高)。未被激活的节点v受所有与之相邻且已被激活的节点u的影响。当未激活节点v与所有已被激活的邻居节点的边的权重之和达到或超过激活阈值Θ时,节点v就会被激活。

即当满足条件:

Na(v):active neighbors of v.

v被激活之后,它也会以同样的方式影响它自己的未被激活的邻居节点。这样会有越来越多的,满足激活条件的节点被激活,直到最后再也没有新的节点被激活了,激活过程才会停止。

上述过程被称为影响力传播的线性阈值模型(Linear Threshold Model),传播过程停止时最终被激活的节点的数量被称为影响力的传播范围(Influence Spread)。

无向无权图的线性阈值模型的Java实现:

public int beginDiffusionProcess(ArrayList<Node> graph,ArrayList<Integer> activeNodeIds,int lastInfSpread)
{
//Mark the active neighbors of each node.
for(Node nd:graph)
{
for(Node n:nd.neighbors)
{
if(activeNodeIds.contains(n.nodeId))
{
n.setActive(true);
}
}
} //Determine whether each node is activated or not.
for(Node nd:graph)
{
int activeNeighbor_Num=0;
for(Node n:nd.neighbors)
{
if(n.isActive())
{
activeNeighbor_Num++;
}
}
if (activeNeighbor_Num/(nd.neighbors.size()*1.0)>=nd.getThreshold())//如果是带权图,这里要修改
{
nd.setActive(true);
activeNodeIds.add(nd.nodeId);
}
}
//Get the influence spread of the current step.
int infSpread=0;
for(Node n:graph)
{
if(n.isActive())
{
infSpread++;
}
}
//If it converges,stop the diffusion process,else continue the next step.
if(lastInfSpread==infSpread)
return infSpread;
else
return beginDiffusionProcess(graph,activeNodeIds,infSpread);
}

下面的代码调用上述方法,获取最终的Influence Spread:

public int GetInfSpread(ArrayList<Node> graph)
{
ArrayList<Integer> activeNodeIds=new ArrayList<Integer>();
     //this.dimensions是已经被激活的种子节点,是某一个类的静态属性,类型为ArrayList<Node>,这些节点会尝试激活它们的邻居节点。
for(Node n:this.dimensions)
{
activeNodeIds.add(n.nodeId);
}
int lastInfSpread=0;
return beginDiffusionProcess(graph, activeNodeIds,lastInfSpread);
}

其他相关的代码:

Node.java

import java.util.ArrayList;

public class Node implements Comparable<Node>
{
public int nodeId;
public ArrayList<Node> neighbors = new ArrayList<Node>();
private boolean b_isActive = false;
private double threshold = 0.0; public Node(int nodeId, double threshold)
{
this.nodeId = nodeId;
this.threshold = threshold;
} public int neighbors_num()
{
return this.neighbors.size();
} public void setActive(boolean isActive)
{
this.b_isActive = isActive;
} public boolean isActive(){
return this.b_isActive;
}
public double getThreshold(){
return this.threshold;
}
// Sort nodes by (out)degree
public int compareTo(Node anotherNode)
{
if (this.neighbors != null && anotherNode.neighbors != null)
{
// reverse order
return anotherNode.neighbors_num() - this.neighbors_num();
// positive order
// return this.neighbors_num()-anotherNode.neighbors_num();
}
return 0;
}
}

Java实现线性阈值模型(Linear Threshold Model)的更多相关文章

  1. [zz] 混合高斯模型 Gaussian Mixture Model

    聚类(1)——混合高斯模型 Gaussian Mixture Model http://blog.csdn.net/jwh_bupt/article/details/7663885 聚类系列: 聚类( ...

  2. 生成模型(Generative Model)和 判别模型(Discriminative Model)

    引入 监督学习的任务就是学习一个模型(或者得到一个目标函数),应用这一模型,对给定的输入预测相应的输出.这一模型的一般形式为一个决策函数Y=f(X),或者条件概率分布P(Y|X). 监督学习方法又可以 ...

  3. 从损失函数优化角度:讨论“线性回归(linear regression)”与”线性分类(linear classification)“的联系与区别

    1. 主要观点 线性模型是线性回归和线性分类的基础 线性回归和线性分类模型的差异主要在于损失函数形式上,我们可以将其看做是线性模型在多维空间中“不同方向”和“不同位置”的两种表现形式 损失函数是一种优 ...

  4. 开始 Keras 序列模型(Sequential model)

    开始 Keras 序列模型(Sequential model) 序列模型是一个线性的层次堆栈. 你可以通过传递一系列 layer 实例给构造器来创建一个序列模型. The Sequential mod ...

  5. 计算广告学-多点归因模型(Multi-Touch Attribution Model)

    计算广告学中的一个重要的问题是, 如果用户产生了一次转化(conversion, 比如购买, 注册等), 且该用户在转化之前看过大量不同频道(比如搜索, 展示, 社交等等)的广告, 那么我们如何确定是 ...

  6. 生成模型(Generative Model)Vs 判别模型(Discriminative Model)

      概率图分为有向图(bayesian network)与无向图(markov random filed).在概率图上可以建立生成模型或判别模型.有向图多为生成模型,无向图多为判别模型. 判别模型(D ...

  7. CSS学习笔记——视觉格式化模型 visual formatting model

    CSS 视觉格式化模型(visual formatting model)是用来处理文档并将它显示在视觉媒体上的机制.他有一套既定的规则(也就是W3C规范),规定了浏览器该怎么处理每一个盒子.以下内容翻 ...

  8. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  9. 关于JAVA中的static方法、并发问题以及JAVA运行时内存模型

    一.前言 最近在工作上用到了一个静态方法,跟同事交流的时候,被一个问题给问倒了,只怪基础不扎实... 问题大致是这样的,“在多线程环境下,静态方法中的局部变量会不会被其它线程给污染掉?”: 我当时的想 ...

随机推荐

  1. leecode系列--Two Sum

    学习这件事在任何时间都不能停下.准备坚持刷leecode来提高自己,也会把自己的解答过程记录下来,希望能进步. Two Sum Given an array of integers, return i ...

  2. ASP.NET 正则替换URL参数值

    public class HomeController : Controller { public ActionResult Index() { var url = "http://www. ...

  3. c# ros

    class MK { Stream connection; TcpClient con; public MK(string ip) { con = new TcpClient(); con.Conne ...

  4. java中静态方法和静态类的学习

    静态内部类可以有静态成员,而非静态类 则不能有静态成员 静态内部类的非静态成员可以访问外部类的静态成员,而不可以访问外部类的非静态成员 非静态方法与对象相关,而静态方法属于类的方法, 总上所述:静态方 ...

  5. 个人作业-Week1

    问题1:程序员的优劣是否在软件开发中已经不重要了??用户实际关心的 外形,使用的乐趣和效率,自我形象,个人满足感,回忆,这么多条中,仅有效率与代码有关,而实际上用户比起效率却更在意其他这些“幺蛾子”. ...

  6. c# Using Settings under visual studio 2012

    1.在项目属性中的Settings的设置可以通过以下方式调用 Properties.Settings.Default.(SpecifyPropertyName) 2.添加新的Settings设置文件 ...

  7. 建模前的数据清洗/ETL(python)

    1. 读取数据 data= open('e:/java_ws/scalademo/data/sample_naive_bayes_data.txt' , 'r') 2. 把数据随机分割为trainin ...

  8. 事件DOMContentLoaded和load的区别

    1.当 onload 事件触发时,页面上所有的DOM,样式表,脚本,图片,flash都已经加载完成了. 2.当 DOMContentLoaded 事件触发时,仅当DOM加载完成,不包括样式表,图片,f ...

  9. ADO.net

    五大对象: 1.Connection(连接数据库) 2.Command(执行T-SQL语句) 3.DataAdapter(用户填充DataSet,断开模式) 4.DataReader(读取数据库,一种 ...

  10. CSS-用伪类制作小箭头(轮播图的左右切换btn)

    先上学习地址:http://www.htmleaf.com/Demo/201610234136.html 作者对轮播图左右按钮的处理方法一改往常,不是简单地用btn.prev+btn.next的图片代 ...