精华内容
下载资源
问答
  • 复杂网络聚类方法

    2021-02-23 07:56:35
    复杂网络聚类方法
  • 复杂网络聚类系数的matlab编程代码,将复杂网络存储为矩阵,再对其matLab编程,求得复杂网络的集类系数 复杂网络聚类系数的matlab编程代码,将复杂网络存储为矩阵,再对其matLab编程,求得复杂网络的集类系数
  • 复杂网络聚类算法在生物网络中的应用
  • 复杂网络聚类算法的研究.pptx
  • 复杂网络聚类系数

    2013-12-19 20:56:15
    m文件,求复杂网络聚类系数,方便好用,网络图用矩阵表示。
  • 给出各类复杂网络聚类算法研究,用于聚类问题的分析
  • 基于局部探测的快速复杂网络聚类算法
  • 复杂网络聚类中,为了克服聚类结果局部收敛和对多维数据聚类效果差的缺点,通过对复杂网络聚类方法 的应用分析,将NJW 算法和粒子群聚类算法应用到加权复杂网络簇结构的探测中,设计和实现了一种改进的加权复 ...
  • 在目前复杂网络聚类算法中,基于Laplace特征值的谱聚类方法具有严密的数学理论和较高的精度,但受限于该方法对簇结构数量、规模等先验知识的依赖,难以实际应用。针对这一问题,基于Laplace矩阵的Jordan型变换,提出...
  • 揭示网络簇结构的复杂网络聚类方法研究具有重要的理论意义和应用价值。应用两种谱方法将复杂网络簇结构发现问题转换为空间数据聚类问题,并将粒子群聚类算法应用到对复杂网络簇结构的探测,提出了两种新的结合粒子...
  • c++开发的复杂网络聚类系数最短路径平均长度介数等计算
  • 因此,网络聚类方法对于研究复杂网络具有重要意义。 当前,许多典型的聚类算法都有一些缺点,例如不准确和收敛缓慢。 在本文中,我们通过计算节点的核心影响力提出了一种聚类算法。 聚类过程是对社会学中聚类形成...
  • 提出了一种相对简单、有效的划分复杂网络社团结构的方法. 该算法利用复杂网络的转移矩阵P和K均值聚类算法来划分社团结构,并且用F统计量判定最优的聚类结果,在探测社团结构明显的人工网时具有较高的准确度.
  • super_edge=xlsread('C:\Users\HP\Desktop\刘德宇论文\连接4.xlsx'); %第一阶段 N=211; D1=zeros(N,N); for i=1:N for j=1:N D1(i,j)=super_edge(i,j); end end %超边度的矩阵 node_degree=zeros(1,N...%求聚类系数 ...

    super_matrix=xlsread('C:\Users\HP\Desktop\邻接矩阵.xlsx');
    %超王中节点的数量
    N=211;
    D1=zeros(N,N);
    for i=1:N
    for j=1:N
    D1(i,j)=super_matrix(i,j);
    end
    end
    %超边度的矩阵
    node_degree=zeros(1,N);
    for h=1:N
     node_degree(1,h)=sum(D1(h,:));
    end
     node_degree;
     cc=zeros(1,N);
     %求聚类系数
     for i=1:N
     l1=0;
     s=zeros(1,N);
     if node_degree(1,i)>=2
         for j=1:N
              if D1(i,j)==1
                 s(1,j)=1;
              end
         end
         
         for k=1:N
           if s(1,k)==1
               s1=k;
               for x=s1:N
                   if s(1,x)==1
                        s2=x;
                        if D1(s1,s2)==1
                          l1=l1+1;
                        end
                   end
               end
           end
         end
         cc(1,i)=(2*l1)/((node_degree(1,i)*(node_degree(1,i)+1)));
     end
     end
     
     sum1=0;
     for i=1:N
      sum1=sum1+cc(1,i)*1;
     end

    %平均聚类系数
     ave=sum1/N;

    展开全文
  • 复杂网络的相关内容和程序,对学习爱好者很有用的啊
  • 复杂网络聚类系数和平均路径长度计算的 MA TLAB 源代码申明:文章来自百度用户 carrot_hy复杂网络的代码总共是三个m文件,复制如下:第一个文件, CCM_ClusteringCoef.mfunction [Cp_Global, Cp_Nodal] = CCM_...

    复杂网络聚类系数和平均路径长度计算的 MA TLAB 源代码

    申明:文章来自百度用户 carrot_hy

    复杂网络的代码总共是三个m文件,复制如下:

    第一个文件, CCM_ClusteringCoef.m

    function [Cp_Global, Cp_Nodal] = CCM_ClusteringCoef(gMatrix, Types)

    % CCM_ClusteringCoef calculates clustering coefficients.

    % Input:

    % gMatrix adjacency matrix

    % Types type of graph:

    'binary','weighted','directed','all'(default).

    % Usage:

    % [Cp_Global, Cp_Nodal] = CCM_ClusteringCoef(gMatrix, Types) returns

    % clustering coefficients for all nodes "Cp_Nodal" and average clustering % coefficient of network "Cp_Global".

    % Example:

    % G = CCM_TestGraph1('nograph');

    % [Cp_Global, Cp_Nodal] = CCM_ClusteringCoef(G);

    % Note:

    % 1) one node have vaule 0, while which only has a neighbour or none.

    % 2) The dircted network termed triplets that fulfill the follow condition % as non-vacuous: j->i->k and k->i-j,if don't satisfy with that as

    % vacuous, just like: j->i,k->i and i->j,i->k. and the closed triplets

    % only j->i->k == j->k and k->i->j == k->j.

    % 3) 'ALL' type network code from Mika Rubinov's BCT toolkit.

    % Refer:

    % [1] Barrat et al. (2004) The architecture of the complex weighted networks. % [2] Wasserman,S.,Faust,K.(1994) Social Network Analysis: Methods and % Applications.

    % [3] Tore Opsahl and Pietro Panzarasa (2009). "Clustering in Weighted

    % Networks". Social Networks31(2).

    % See also CCM_Transitivity

    % Written by Yong Liu, Oct,2007

    % Center for Computational Medicine (CCM),

    % National Laboratory of Pattern Recognition (NLPR),

    % Institute of Automation,Chinese Academy of Sciences (IACAS), China.

    % Revise by Hu Yong, Nov, 2010

    % E-mail:

    展开全文
  • 利用Python的igraph包绘制复杂网络的社区检测图。

            前言:研究生期间主要做复杂网络聚类,也称为社区检测。临毕业前,老师让之前发表的论文里的算法代码C化,并写出界面进行可视化。由于之前虽然做过可视化,但基本上都是将聚类结果导入到pajek或者gephi这类专门的软件里进行绘制的。想要将社区检测结果实时的进行绘制并且要通过C\C++直接绘制,确实没有什么头绪。后来,通过浏览博客知道igaph这个包可以使用,由于想要熟悉下python,于是选择了Python的igraph包,而放弃使用C语言的igraph包。这样,我就可以将算法产生的聚类结果直接导入Python代码,并利用Python的igraph包进行网络划分结果的绘制。然后,再用C++调用Python代码,并将Python产生的聚类结果图直接加载到MFC中,这样就能实现实时地对社区检测结果进行绘制。

            一. 利用Python进行网络聚类图的绘制

            当然我们需要实现安装Python和igraph包。本人使用的系统是win7系统,安装的软件是anaconda,内含Python2.7版本,基本上需要的东西anaconda都集成好了,一键安装很是方便。

            其次,我们需要安装python-igraph包。这是官方网址。直接使用pip安装会出现问题(Windows系统本身的问题),因此本人选用的非官方网址的安装包,见这里。这个网址在官网也提供了,一定要选对对应的版本。Python3.6以上的版本好像并没有对应的igraph包,因此安装的时候会出现平台不支持的提示。然后在dos系统环境下pip install 安装包,即可实现igraph的安装。

            接下来,我们还需要安装支持igraph绘制图形的Cairo库。这个库同样在上面提供的非官方网址上可以找到,下载对应系统的版本,并进行pip安装即可。这里不再详细介绍。

            前提工作做好,接下里进行网络社区图的绘制。如果不熟悉igraph包的使用,可以参见官网的使用手册。里面也有关于网络图绘制的介绍。下面给出相关代码:

    # Python 2.7
    from igraph import *
    from PIL import Image
    
    colors_type = ["yellow", "red", "green", "coral", "alice blue", "cyan", "pink", 
    "gray", "blue", "green yellow", "orange", "light blue", "hot pink", "light green", "gold"]
    
    def PlotNetworks(net_file, detected_label, real_label = "Unknown Type"):
    	## read files
    	network = Graph.Read_Adjacency(net_file)
    	Graph.to_undirected(network)
    	f1 = open(detected_label)
    	line = f1.readline()
    	line = line.strip()
    	str_line = line.split('\t')
    	dlabel = [int(ele) for ele in str_line]
    	network.vs["dlabel"] = dlabel
    	if(real_label != "Unknown Type"):
    		f2 = open(real_label)
    		line = f2.readline()
    		line = line.strip()
    		str_line = line.split('\t')
    		rlabel = [int(ele) for ele in str_line]
    		network.vs["rlabel"] = rlabel
    	
    	# plot networks
    	nnodes = len(network.vs)
    	network.vs["name"] = [str(i+1) for i in range(nnodes)]
    
    	layout = network.layout("drl")
    	visual_style = {}
    	if(nnodes < 100):
    		visual_style["vertex_size"] = 22
    	else:
    		visual_style["vertex_size"] = 18
    	visual_style["vertex_label"] = network.vs["name"]
    	visual_style["layout"] = layout
    	visual_style["bbox"] = (500,500)
    	visual_style["margin"] = 20
    	visual_style["edge_curved"] = 0.3
    	visual_style["vertex_color"] = [colors_type[i-1] for i in network.vs["dlabel"]]
    	plot(network, "social_network1.png", **visual_style)
    	figure1 = Image.open("social_network1.png")
    	figure1.save("social_network1.bmp")
    	if(real_label != "Unknown Type"):
    		visual_style["vertex_color"] = [colors_type[i-1] for i in network.vs["rlabel"]]
    		plot(network, "social_network2.png", **visual_style)
    		figure2 = Image.open("social_network2.png")
    		figure2.save("social_network2.bmp")
            代码写的稍微有些繁琐,主要是为了之后C++代码的调用方便。函数需要三个参数,均为文件路径名。第一个文件是复杂网络的邻接矩阵,我们可以使用Graph.Read_Adjacency()来直接读取,不过这个方法默认读取的是有向网络,而我使用的均是无向网络,所以需要使用Graph.to_undirected()将其转换为无向网络。第二个文件为算法的聚类结果文件,文件是由1-k个整数标签表示社区检测结果,k表示一共检测到k个社区。第三个文件表示真实的网络划分结果,对于有些网络,我们往往并不知道真实的网络划分结果,这里是一个可选文件。

            接着,绘制网络的可视化效果参数。使用字典可以直接将可视化参数设置好,这里我们用visual_style来表示。相关参数均可以在上述提供的官方手册找到。其中着重介绍下visual_style["layout"]这个参数,它是一种网络的布局算法,熟悉pajek软件的同学对这个参数应该也有所了解。其中“drl”是大图的分布式递归布局算法,常用的还有“kk”,“fr”等,这些都能使自己的网络节点布局合理,比较美观。由于这些参数都是非确定型的绘图方式,也就是说,每次节点的布局都会有所差异。更多参数见官网手册。

            这里的color_style给了很多颜色,因为后期要绘制美国大学生足球队网络,需要至少12种颜色,这里Wikipedia提供了多达上百种的颜色,只需要将颜色的首字母小写即可。最后需要说明一下,由于我的MFC代码里需要调用bmp图像,而plot不能存储为bmp格式,这里多了一步将png转换为bmp格式的过程。

            下面给出MFC界面绘制社区检测效果图,图像绘制如下:

            1、Zachary's karate network(即跆拳道网络):


    2、dolphin social network


    3、American football network

    这里为了突出检测图和真实图的区别,故意选择了效果一般时的参数。勿介意(手动滑稽)。。。


    二、MFC调用Python代码

            前面已经给出了绘制社区检测效果图的代码。这里简单介绍下怎样使用C++代码调用Python代码。这篇【博客】基本实现了vs配置使用C++调用python代码,这里需要强调几点:第五步应该在第三步之前进行实施,因为我配置完第五步之后,发现原先配置好的第三步又变回了原始配置,所以我们可以先配置第五步再接着配置第三步;此外,由于我们安装的是anaconda,所以我们需要在anaconda的相关文件下找到include目录和libs目录,并进行配置而非Python27目录,其他不需要改变。这样我们就可以配置好vs环境。

    下面代码实现了C++调用Python代码:

    void callPython(char *str1, char *str2, char *str3)
    {
    	Py_Initialize();
    
    	PyObject *pModule = NULL;
    	PyObject *pFunc = NULL;
    	pModule = PyImport_ImportModule("PlotNetworks");
    	pFunc = PyObject_GetAttrString(pModule, "PlotNetworks");
    	PyObject *pArgs = PyTuple_New(3);
    	PyTuple_SetItem(pArgs, 0, Py_BuildValue("s", str1));
    	PyTuple_SetItem(pArgs, 1, Py_BuildValue("s", str2));
    	PyTuple_SetItem(pArgs, 2, Py_BuildValue("s", str3));
    	PyEval_CallObject(pFunc, pArgs);
    	Py_Finalize();
    }
    

    str1, str2, str3就是我们Python代码里所需要的三个文件,PyImport_ImportModule()调用的是我们的python文件名,下面的函数调用“PlotNetworks”

    是python代码内的函数名。这里的pArgs对应Python里的一个元组,下面的参数“s”表示该参数是字符串类型。通过pArgs可以实现将参数传递给pFunc。

    这篇博客】可以进行参考。最后,在使用MFC绘制网络图的时候,发现了一个问题。即当我第二次选择文件时,在点击聚类就会出现问题,提示显示

    python调用那一块出现问题。找了一些资料,发现Py_Initialize()和Py_Finalize()在一个程序中不能多次使用,原因是Py_Initialize初始化的占用的内存并

    不能被Py_Finalize()完全释放(大概是这个意思)。于是我将这两个函数分开来,一个放在MFC窗口的初始化中,一个放在关闭窗口的消息函数中,最

    终解决了这个问题。

    结束语:写这个博客的原因一方面为了记录下这几天的工作,另一方面发现网上写R使用igraph包绘制复杂网络图的博客较多,对于Python绘制复

    杂网络图的很少。于是写下这一篇博客,希望能为研究复杂网络的小伙伴提供一些思路。


    展开全文
  • 复杂网络聚类系数 maltab代码 子程序代码 非常简洁 调用方便
  • 复杂聚类网络的光谱粗粒度
  • 摘要:面向农作物精准施肥量确定问题,提出一种基于复杂网络聚类选择的神经网络集成方法。在该方法中,首先采用回放取样方法来生成多个神经网络个体,其次利用网络聚类算法FEC从这些神经网络个体集中选出部分个体,再次...
  • MATLAB源码集锦-复杂网络聚类系数算法代码
  • 可以计算网络中各节点的聚类系数和网络的平均聚类系数
  • 面向农作物精准施肥量确定问题,提出一种基于复杂网络聚类选择的神经网络集成方法。在该方法中,首先采用回放取样方法来生成多个神经网络个体,其次利用网络聚类算法 FEC从这些神经网络个体集中选出部分个体,再次对...
  • 复杂网络聚类算法总结

    千次阅读 2019-03-15 18:18:50
    20世纪60年代,两位匈牙利数学家Erdos和Renyi建立了随机图理论,被公认为是在数学上开创了复杂网络理论的系统性研究。之后的40年里,人们一直讲随机图理论作为复杂网络研究的基本理论。然而,绝大多数的实际网络并...

     

    网络,数学上称为图,最早研究始于1736年欧拉的哥尼斯堡七桥问题,但是之后关于图的研究发展缓慢,直到1936年,才有了第一本关于图论研究的著作。20世纪60年代,两位匈牙利数学家Erdos和Renyi建立了随机图理论,被公认为是在数学上开创了复杂网络理论的系统性研究。之后的40年里,人们一直讲随机图理论作为复杂网络研究的基本理论。然而,绝大多数的实际网络并不是完全随机的。1998年,Watts及其导师Strogatz在Nature上的文章《Collective Dynamics of Small-world Networks》揭示了复杂网络的小世界性质。随后,1999年,Barabasi及其博士生Albert在Science上的文章《Emergence of Scaling in Random Networks》又揭示了复杂网络的无标度性质(度分布为幂律分布),从此开启了复杂网络研究的新纪元。
            随着研究的深入,越来越多关于复杂网络的性质被发掘出来,其中很重要的一项研究是2002年Girvan和Newman在PNAS上的一篇文章《Community structure in social and biological networks》,指出复杂网络中普遍存在着聚类特性,每一个类称之为一个社团(community),并提出了一个发现这些社团的算法。从此,热门对复杂网络中的社团发现问题进行了大量研究,产生了大量的算法,本文试图简单整理一下复杂网络中聚类算法,希望对希望快速了解这一部分的人有所帮助。本文中所谓的社团跟通常我们将的聚类算法中类(cluster)的概念是一致的。

    0. 预备知识

            为了本文的完整性,我们首先给出一些基本概念。
            一个图通常表示为G=(V,E),其中V表示点集合,E表示边集合,通常我们用n表示图的节点数,m表示边数。一个图中,与一个点的相关联的边的数量称为该点的度。对于一个图,图中所有点的度的和恰好等于边数的两倍。图通常用邻接矩阵A表示,邻接矩阵的(i,j)位置元素是1表示点i到点j右边,0表示无边。
            本文中我们会用到随机图的概念,所谓随机图,就是指一个图中任何两个点之间连边的概率相等。首先确定n个点,然后以固定概率p去给图中的一对顶点连边,就形成了一个随机图。在研究中,随机图通常用来作为一个null model来与实际网络进行比较,从而得出一些性质结论。
            研究社团的划分,一个需要解决的问题是,如何来衡量一个社团的划分的好坏?一个比较简单直观的原则是使得社区内部的边尽可能地多,社区之间的边间可能地少。另外一个稍微复杂点但是更为常用的度量是Newman等人提出的模块度(modularity)的概念,基本的想法是这样的:我们假设在随机图中是不存在这种社团结构的,将实际网络跟其相应的随机网络进行比较,如果一个网络跟随机网络之间的差异越大,表示社团结构越明显。这样,我们对划分后的每一个子网络计算一个“密度”,然后计算该子网络随机情况下的“密度”,这两个“密度”存在一个差值,表示了该子网络偏离随机情况的一种程度,并且这个值越大表示这个子网络相对随机网络越稠密。一个网络中包含的所有子网络的这个差值加到一起的和就是这个复杂网络的模块度,数学公式表示如下:
            1
    其中Aij表示图的邻接矩阵,ki 表示点i 的度,m是图的边数,ki*kj/2m表示点 i 和点 j之间边的期望。进一步将模块度可以化为等式右边的形式,nc是社团的总个数,lc是社团c内的边数,dc是社团内的点的度数之和 (note: 社团内的每一个点可能跟本社团内部的点有边,也可能有跟其他社团点连边,故通常 dc> lc)

    有了这些知识,我们来看一下复杂网络社团划分的各种算法吧。

    1. 图的剖分

            把一个网络划分成多个社团就是把一个图剖分成多个图,图的剖分问题是图论中一个比较难的问题,也是研究比较多的问题,理论上是NP-hard的。因此,人们通常研究比较简单的情况:图的二剖分,即把一个图分成两个(一般要求大小相等)的图,比较有名的算法是Kernighan-Lin 算法和谱平分法。

    1.1 Kernighan-Lin 算法[1]

    思想:不断交换两个子图中的点,使得两个子图之间的边尽可能地少
    定义增益函数: Q=两个社团内的边数-社团之间的边数
    算法步骤:
    Step1 随机划分为已知大小的两个社团
    Step2 从两个社团各取一个点,尝试交换并计算ΔQ = Q交换后-Q交换前,选择使ΔQ最大的一对节点对交换
    Step3 规定每个节点只能交换一次,对剩余节点重复step2, 直到 ΔQ <0,或者某个子图的所有节点都被交换了一次为止。
    Step4 允许每个节点的第二次交换,开始新一轮迭代,直到没有节点对可以交换

    1.2 谱平分法

            所谓“谱”,就是矩阵的特征值;所谓“平分”,就是将一个图分成大小相等的两个子图。谱平分法就是利用图的拉普拉斯矩阵的第二小特征向量来进行聚类的一种方法。 这里暂且先放一下,下面介绍完谱算法之后再回头具体介绍谱平分法。

    1.3 总结

            图的剖分常常需要制定子图的个数(否则,整体作为一个),甚至每个子图的大小(否则,常常会将一个点分为一个子图)。但是如果已知一个图就是两个社团组成,谱评分法往往可以得到很好的效果。

    2. 凝聚法

            这是一大类算法,总体思想是寻找社团“最中心”的边,不断地把最相似的两个点聚到一起,从点聚到小社团,再聚成大社团。根据定义两个点的相似性的不同,产生了很多不同的算法。有的算法并不直接计算相似性,而是看两个点合并到一起后模块度的变化情况,根据变化的大小来选择需要合并的两个点。比较有代表性的算法是Newman在2004年的一个算法[2]

    2.1 Newman算法

    思想:不断地选择是模块度增长最大的两个社团进行合并
    算法步骤:
    Step1. 每个点当作一个社团
    Step2. 计算两个社团合并后模块度的变化(增长) ΔQ,选取使得ΔQ最大的两个社团进行合并 
    Step3. 重复step2直到最后合并为一个社团

    2.2 Newman算法的优化

    Newman算法复杂性是O((m+n)n),Clause,Newman和Moore利用最大堆将该算法复杂度降低为O(n(logn)^2)[3]
    对于该算法, 人们想出了很多改进措施,例如以下两个策略: 
    1. multistep贪婪算法:每次迭代合并多个社团
    2. 归一化ΔQ,消除社团大小的影响

    2.3 总结

            凝聚法优点是简单,限制少,不需要预先指定社团个数,可以发现社团的层次关系。缺点是缺乏全局目标函数; 两个点一旦合并,就永远在一个社团中了,无法撤消;另外,这种算法往往对单个的点比较敏感

    3. 分裂法

            分裂法的基本思想是找出最有可能位于社团之间的边,把这些边去掉,就自然产生了不同的社团。代表性的算法是Girvan 和Newman在2002年的一个算法 [4].

    3.1 GN 算法[4]

    首先给出介数(etweenness)的定义,一个边的介数(edge betweenness)是指通过该边的最短路的条数。
    直观上,社团之间的边有较高的betweenness,而社团内部的边betweenness相对较小,这样,通过逐个去掉这些高betweenness的边,社团结构就会逐步显现出来。
    算法步骤:
    Step1. 计算每条边的介数 (O(nm) with BFS)
    Step2. 去掉具有最高介数的边
    Step3. 如果满足了社团划分的要求, stop; 否则, 转step1.

    利用各种其他度量(如边聚类系数等)来代替边介数,该算法也产生了各种各样的变种。

    3.2 其他分裂方法

            分裂法还有很多,如MST,JP算法等等,在此就不一一描述了。

    3.3 总结

            凝聚法跟分裂法是对应的,一个自下而上,一个自上而下,一个不断把点连在一起,一个不断去边把点分开。分裂法的优缺点跟凝聚法类似。

    4. 谱算法

            首先给出一个概念——图的Laplacian 矩阵(L-矩阵)。设A为图的邻接矩阵; D为一个对角阵(对角元素为点 i 的度),则图的Laplacian矩阵L=D-A。关于L-矩阵,有很多性质,如:(1) 矩阵的每一行的元素之和为0 ,由此可以知道该矩阵至少一个0特征值,并且0特征值对应的特征向量为全1向量(1,1,...,1)。(2)0 特征向量的个数与连通分支的个数相同;如果一个图是连通的,那么其Laplacian矩阵只有一个0特征值,其余特征值都是正的。(3)不同特征值的特征向量正交的。
    所谓谱,就是指矩阵的特征值。谱算法就是利用邻接矩阵或者拉普拉斯矩阵的特征向量,将点投影到一个新的空间,在新的空间用传统的聚类方法(如k-means)来聚类。

    谱算法的一般步骤是:
    Step1. 计算相似矩阵(如邻接矩阵A)的前 s 个特征向量 
    Step2. 令 U 是一个 n× s 矩阵,每一列是一个特征向量 
    Step3. U 的第 i 行作为点 i 的坐标,用层次聚类法或者k-means等得到最终的社团
    需要说明一点是: 如果是计算邻接矩阵的特征值,一般取最大的s个特征值;如果是计算Laplacian矩阵的特征值,则是计算最小的(除0外)s个特征值。

            前面我们提到过谱平分法,就是利用Laplacian矩阵倒数第二个小的特征值对应的特征向量(称为Fiedler 向量)来聚类的。因为需要把一个图平分成两个子图,因此就把Fiedler向量中正的分量对应的点分成一类,负的分量对应的点分成另一类。

            谱算法的计算瓶颈是计算矩阵的特征值,因为少数的几个特征向量就可以得到很好的聚类,所以只需要计算最大的几个特征值既可以,可以考虑用Lanczos method。

    5. 矩阵分解

            谱算法的实质是矩阵分解,其他的矩阵分解方法还有SVD 和 NMF 等,矩阵分解的整体思想就是把点从一个空间映射到另一个空间,在新的空间利用传统的聚类方法来聚类。

    6. 标签传播算法

            标签传播(Label propagation)算法是由Zhu X J于2002年提出[5],它是一种基于图的半监督学习方法,其基本思路是用已标记节点的标签信息去预测未标记节点的标签信息。2007年,Raghavan U N等最早提出将LPA最早应用于社区发现,该算法被简称为RAK算法[6]

    思想: 每个节点赋予一个标签标志着其所在社区,每次迭代,每个节点标签根据其大多数邻近节点的标签而修改,收敛后具有相同标签的节点属于同一个社区。
    算法步骤:
    Step1 给每一个节点随机生成一个标签
    Step2 随机生成一个所有节点的顺序,按照该顺序将每一个节点的标签修改为其大多数邻居节点的标签。
    Step3 重复step2,直到每个节点的标签都不再变化,具有相同标签的节点组成了一个社区。

    7. 随机游走

    随机游走: 从一个顶点向下一个顶点移动时,以相等的概率来选择当前顶点的一个邻居作为下一个顶点。
    基本思想: 社团时相对比较稠密的子图,因此在图中进行随机游走时很容易“陷入”一个社团中。

    随机游走的过程构成了一个Markov链。图中每一个顶点对应一种状态;不同状态之间的转移概率为 2
    t 步随机游走从 i 到 j 的概率是 Pij 的t次幂

    下面我们介绍一个代表性的随机游走算法,叫做Walktrap 算法[7]

    Walktrap 算法

    定义如下距离:
    顶点 i 和 j 的距离:3
    社团C到点j的距离:4
    社团C1到C2的距离: 5

    算法步骤:
    Step1 每一个点当做一个社区,计算相邻的点(社团)之间的距离
    Step2 选取使得下式最小的两个社团C1和C2 合并为一个社团,
    6
    重复这一步骤直到所有点合并为一个社团。

    标签传播算法尽管速度快,但是效果并不太理想。

    8. Louvain (BGLL) 算法

            Louvain (BGLL) 算法[8]是一个基于模块度最优化的启发式算法,算法两层迭代,外层的迭代是自下而上的凝聚法,内层的迭代是凝聚法加上交换策略,避免了单纯凝聚方法的一个很大的缺点(两个节点一旦合并,就没法再分开)。

    算法步骤:
    Step1 每一个点初始时被看作一个社团, 按一定次序依次遍历每一个顶点. 对每一个顶点i ,考虑将 i 移至其邻居顶点 j 的社团中模块度的变化ΔQ 。如果 ΔQ>0,将 顶点i 移至使得ΔQ变化最大的顶点的社团中; 否则,顶点 i 保持不动。重复这个过程,直到任何顶点的移动都不能使模块度增大。
    Step2 将step1得到的每一个社团看作一个新的顶点,开始新的一轮迭代,直到模块度不再变化。

    该算法简单、直观,容易实现;速度快,并且效果也很好。综合效率和效果两方面考虑,该算法应该是目前最好的方法之一。

    9.Canopy算法 + K-Means

    9.1 Canopy算法

    思想:选择计算代价较低的方法计算相似性,将相似的对象放在一个子集中,这个子集被叫做Canopy,不同Canopy之间可以是重叠的
    算法步骤:
    Step1 设点集为 S,预设两个距离阈值 T1和 T2(T1>T2);
    Step2 从S中任选一个点P,用低成本方法快速计算点P与所有Canopy之间的距离,将点P加入到距离在T1以内的Canopy中;如果不存在这样的Canopy,则把点P作为一个新的Canopy的中心,并与点P距离在 T2 以内的点去掉;
    Step3 重复step2, 直到 S 为空为止。

    该算法精度低,但是速度快,常常作为“粗”聚类,得到一个k值,再用k-means进一步聚类,不属于同一Canopy 的对象之间不进行相似性计算。

    9.2 K-Means

    K-Means大家都比较熟悉,基本思想是首先找各个社团的“中心点”, 然后就近分配每个顶点
    算法步骤:选取k个点作为 k个社团的初始中心点
    Step1. 把每个点分配到最近的中心点所在的社团;
    Step2. 重新计算中心点,如果中心点不变, stop; 否则, 转 step1.
    K-Means算法计算量相对比较大,效果往往还不错,但是使用前要考虑一点:通过各个分量求平均得到的中心点是否有意义, 也就是说在你的问题中欧式距离是否有意义。

    10. 基于密度的快速聚类

    今年science上有一篇关于聚类的文章[9],提出一种快速的聚类方法,基本思想是: 找出每个类的中心点,将剩余的点按一定策略分配到每个类中。思想很简单,但是文中找每个类中心点的做法还是很有新意的。
    算法步骤
    Step1 对每一个点i,计算两个量:点i的密度 7 和点 i 到比其密度更高的其他所有点的最小距离 8
    Step2 选取10 都较大的点作为每一社团的中心点(背后的思想是:类的中心应该密度比较大,不同类的中心相互之间应该离的比较远)
    Step3 对于剩余的非中心点,分配给离它最近且密度比它高的邻点所坐在的社团

    参考文献

    [1].Kernighan & Lin ,An efficient heuristic procedure for partitioning graphs. Bell System Technical Journal 49: 291–307,1970.
    [2] Newman. Fast Algorithm for Detecting Community Structure in Networks. Phy.Rev.E, 2004.
    [3] Clauset et al. Finding community structure in very large networks, Phy.Rev.E, 2004.
    [4] Girvan& Newman,Community structure in social and biological networks, PNAS, 2002
    [5] Zhu et al . Learning From Labeled and Unlabeled Data With Label Propagation, Technical Report, CMU-CALD-02-107,2002
    [6] Raghavan et al. Near linear time algorithm to detect community structures in large-scale networks, Phy.Rev.E., 2007.
    [7] P. Pons et al. Computing communities in large networks using random walks. Journal of Graph Algorithms and Applications,2006.
    [8] Vincent D. Blondel et al, Fast Unfolding of Communities in Large Networks, Phy.Rev.E, 2008
    [9] Rodriguez & Laio, Clustering by fast search and find of density peaks. Science.2014

    展开全文
  • 研究具有不确定转移概率的马尔科夫复杂网络系统的聚类同步问题,系统模型包含耦合的离散时变时滞和耦合的分布时变时滞.通过充分考虑转移概率的性质和不确定区域的特性,用一个含有较少变量的有效技术代替传统的Young...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 500
精华内容 200
关键字:

复杂网络聚类