聚类系数可变无标度网络模型Holme-Kim HK模型

# -*- coding: cp936 -*-
import random
import networkx as nx
from networkx.generators.classic import empty_graph

def powerlaw_cluster_graph(n, m, p, seed=None):
    """Holme and Kim algorithm for growing graphs with powerlaw
    degree distribution and approximate average clustering.

    Parameters
    ----------
    n : int
        the number of nodes
    m : int
        the number of random edges to add for each new node
    p : float,
        Probability of adding a triangle after adding a random edge
    seed : int, optional
        Seed for random number generator (default=None).

    Notes
    -----
    The average clustering has a hard time getting above a certain
    cutoff that depends on ``m``.  This cutoff is often quite low.  The
    transitivity (fraction of triangles to possible triangles) seems to
    decrease with network size.

    It is essentially the Barabási–Albert (BA) growth model with an
    extra step that each random edge is followed by a chance of
    making an edge to one of its neighbors too (and thus a triangle).

    This algorithm improves on BA in the sense that it enables a
    higher average clustering to be attained if desired.

    It seems possible to have a disconnected graph with this algorithm
    since the initial ``m`` nodes may not be all linked to a new node
    on the first iteration like the BA model.

    Raises
    ------
    NetworkXError
        If ``m`` does not satisfy ``1 <= m <= n`` or ``p`` does not
        satisfy ``0 <= p <= 1``.

    References
    ----------
    .. [1] P. Holme and B. J. Kim,
       "Growing scale-free networks with tunable clustering",
       Phys. Rev. E, 65, 026107, 2002.
    """

    if m < 1 or n < m:
        raise nx.NetworkXError(              "NetworkXError must have m>1 and m<n, m=%d,n=%d"%(m,n))

    if p > 1 or p < 0:
        raise nx.NetworkXError(              "NetworkXError p must be in [0,1], p=%f"%(p))
    if seed is not None:
        random.seed(seed)

    G=empty_graph(m) # add m initial nodes (m0 in barabasi-speak)
    G.name="Powerlaw-Cluster Graph"
    repeated_nodes=G.nodes()  # list of existing nodes to sample from
                           # with nodes repeated once for each adjacent edge
    source=m               # next node is m
    while source<n:        # Now add the other n-1 nodes
        possible_targets = _random_subset(repeated_nodes,m)
        # do one preferential attachment for new node
        target=possible_targets.pop()
        G.add_edge(source,target)
        repeated_nodes.append(target) # add one node to list for each new link
        count=1
        while count<m:  # add m-1 more new links
            if random.random()<p: # clustering step: add triangle
                neighborhood=[nbr for nbr in G.neighbors(target)                                if not G.has_edge(source,nbr)                                and not nbr==source]
                if neighborhood: # if there is a neighbor without a link
                    nbr=random.choice(neighborhood)
                    G.add_edge(source,nbr) # add triangle
                    repeated_nodes.append(nbr)
                    count=count+1
                    continue # go to top of while loop
            # else do preferential attachment step if above fails
            target=possible_targets.pop()
            G.add_edge(source,target)
            repeated_nodes.append(target)
            count=count+1

        repeated_nodes.extend([source]*m)  # add source node to list m times
        source += 1
    return G
def _random_subset(seq,m):
    """ Return m unique elements from seq.

    This differs from random.sample which can return repeated
    elements if seq holds repeated elements.
    :param seq:
    :param m:
    :return:
    """
    targets=set()
    while len(targets)<m:
        x=random.choice(seq)
        targets.add(x)
    return targets
if __name__=="__main__":
    n=input(" the number of nodes:")
    m=input("the number of random edges to add for each new node:")
    p=input("Probability of adding a triangle after adding a random edge:")
    g=powerlaw_cluster_graph(n, m, p, seed=None)
    node = list(g.nodes())
    edge = list(g.edges())
    # with open(‘node.pickle‘, ‘wb‘) as f:
    #    pickle.dump(node, f)
    #with open(‘edge.pickle‘, ‘wb‘) as f:
    #   pickle.dump(edge, f)
    #print(node)
    #print(edge)
    #edge = list(edge)
    fil = open(‘edge.txt‘, ‘w‘)
    for i in edge:
        fil.write(‘{} {}\n‘.format(*i))
    fil.close()

  生成无标度网络,通过P控制聚类系数

时间: 2024-11-06 13:14:09

聚类系数可变无标度网络模型Holme-Kim HK模型的相关文章

第八章 无标度网络模型

8.1 引言BA无标度网络模型这类模型网路的节点的度没有明显的特征长度,所以称为无标度网络. 8.2.1BA无标度网络模型 ba两人指出ws小世界模型忽略了实际网咯的两个重要的特性:(1)即网络的规模是不断的扩大的,但是er随机图ws小世界网络节点数是固定的(2)优先连接:即新的节点更倾向与那些具有较高连接度的hub节点相连接.这种现象也称为"富者更富" 8.2.2幂律度分布 1.仿真分析 幂律度的分布与参数m无关,BA模型具有幂律度分布与网络规模N无关 2.平均场理论分析 ... 原

一百行写小世界网络和无标度网络

曾经觉得能写很长的代码就是厉害的表现,随着学习的深入,对于好的代码有了更加深刻的认识,一个好的代码应该: 1.可读性.好的代码不仅能让机器读懂,更要让看代码的人读懂----合理布局,逻辑清晰. 2.充分发挥语言的优势,比如接下来的matlab矩阵化编程. 3.占用尽可能小的内存,运行尽量快,输出结果尽量容易处理.并在此之间找到平衡. ..... 需要说明的是,如果没有对复杂网络有基本的了解,下面的东西没有看下去的必要.关于小世界网络和无标度网络,可以参考Watts DJ和Strogatz SH的

网络模型 —— OSI七层模型,TCP五层模型,以及区分

1. OSI七层模型 OSI层  介绍 功能 TCP/IP协议 应用层 操作系统或网络应用程序提供访问网络服务的接口. 文件传输.浏览器.电子邮件 HTTP, FTP, TFTP, SNMP, DNS, Telnet 表示层 解决用户信息的语法表示问题. 数据格式化,压缩与解压缩,加密,代码转换 / 会话层 访问验证和会话管理在内的建立和维护应之间通信的机制. 数据单位 报文 解除/建立与其他接点的联系 / 传输层 负责换取全部信息,提供可靠的数据传输服务. 数据单位 数据包 端对端接口 TCP

barabasilab-networkScience学习笔记4-无标度特征

第一次接触复杂性科学是在一本叫think complexity的书上,Allen博士很好的讲述了数据结构与复杂性科学,barabasi是一个知名的复杂性网络科学家,barabasilab则是他所主导的一个实验室,这里的笔记则是关于里面介绍的课程的笔记,当然别人的课程不是公开课,所以从ppt里只能看到骨干的东西了,对了补充下,slider相关的书籍在这里可以找到 回顾我们的研究一个网络模型的三个特征: Degree distribution: P(k) Path length: <d> Clus

复杂网络中聚类算法总结

网络,数学上称为图,最早研究始于1736年欧拉的哥尼斯堡七桥问题,但是之后关于图的研究发展缓慢,直到1936年,才有了第一本关于图论研究的著作.20世纪60年代,两位匈牙利数学家Erdos和Renyi建立了随机图理论,被公认为是在数学上开创了复杂网络理论的系统性研究.之后的40年里,人们一直讲随机图理论作为复杂网络研究的基本理论.然而,绝大多数的实际网络并不是完全随机的.1998年,Watts及其导师Strogatz在Nature上的文章<Collective Dynamics of Small

测试数据科学家聚类技术的40个问题(附答案和分析)(转)

本文作者 Saurav Kaushik 是数据科学爱好者,还有一年他就从新德里 MAIT 毕业了,喜欢使用机器学习和分析来解决复杂的数据问题.看看以下40道题目,测试下你能答对多少.   作者 | Saurav Kaushik 翻译 | AI科技大本营(rgznai100)     介绍   创造出具有自我学习能力的机器--人们的研究已经被这个想法推动了十几年.如果要实现这个梦想的话,无监督学习和聚类将会起到关键性作用.但是,无监督学习在带来许多灵活性的同时,也带来了更多的挑战. 在从尚未被标记

简单易学的机器学习算法——谱聚类(Spectal Clustering)

一.复杂网络中的一些基本概念 1.复杂网络的表示 在复杂网络的表示中,复杂网络可以建模成一个图,其中,表示网络中的节点的集合,表示的是连接的集合.在复杂网络中,复杂网络可以是无向图.有向图.加权图或者超图. 2.网络簇结构 网络簇结构(network cluster structure)也称为网络社团结构(network community structure),是复杂网络中最普遍和最重要的拓扑属性之一.网络簇是整个网络中的稠密连接分支,具有同簇内部节点之间相互连接密集,不同簇的节点之间相互连接

深度学习之无监督训练

最近看了一下深度学习的表征学习,总结并记录与一下学习笔记. 1.在标签数据集中做的监督学习容易导致过拟合,半监督学习由于可以从无标签数据集中学习,可以有一定概率化解这种情况. 2.深度学习所使用的算法不能太复杂,否则会加大计算复杂度和工作量. 3.逐层贪婪的无监督预训练有这几个特点: (1)贪婪:基于贪婪算法,独立优化问题解的各方面,但是每次只优化一个方面,而不是同时同步全局优化. (2)逐层:各个独立方面可以看做网络的每一层,每次训练的第i层,都会固定前面的所有层. (3)无监督:每次训练都是

Sklearn K均值聚类

## 版权所有,转帖注明出处 章节 SciKit-Learn 加载数据集 SciKit-Learn 数据集基本信息 SciKit-Learn 使用matplotlib可视化数据 SciKit-Learn 可视化数据:主成分分析(PCA) SciKit-Learn 预处理数据 SciKit-Learn K均值聚类 SciKit-Learn 支持向量机 SciKit-Learn 速查 到目前为止,我们已经非常深入地了解了数据集,并且把它分成了训练子集与测试子集. 接下来,我们将使用聚类方法训练一个模