复杂网络K-Shell算法及其Python实现

The rest of the world may follow the rules,but i must follow my heart!

随心所欲即使其他人随波逐流。

K-Shell算法

基本思想

K-shell 方法递归地剥离网络中度数小于或等于 k 的节点,具体划分过程如下: 假设网络中不存在度数为 0 的孤立节点。从度指标的角度分析,度数为 1的节点是网络中最不重要的节点,因此首先将度数为 1 的节点及其连边从网络中删除。删除操作进行之后的网络中会出现新的度数为 1 的节点,接着将这些新出现的度数为 1 的节点及其连边删除。重复上述操作,直到网络中不再新出现度数为 1的节点为止。此时所有被删除的节点构成第一层,即 1-shell,节点的 Ks 值等于 1。剩下的网络中,每个节点的度数至少为2。继续重复上述删除操作,得到 Ks 值等于 2 的第二层,即 2-shell。依此类推,直到网络中所有的节点都被赋予 Ks 值。

Python实现

# -*- coding: UTF-8 -*-

"""
Created on 17-12-17

@summary: KShell算法节点重要性度量

@author: dreamhome
"""
from get_graph import read_graph_from_file


def kshell(graph):
    """
    根据Kshell算法计算节点的重要性
    :param graph: 图
    :return: importance_dict{ks:[nodes]}
    """
    importance_dict = {}
    ks = 1
    while graph.nodes():
        # 暂存度为ks的顶点
        temp = []
        node_degrees_dict = graph.degree()
        # 每次删除度值最小的节点而不能删除度为ks的节点否则产生死循环。这也是这个算法存在的问题。
        kks = min(node_degrees_dict.values())
        while True:
            for k, v in node_degrees_dict.items():
                if v == kks:
                    temp.append(k)
                    graph.remove_node(k)
            node_degrees_dict = graph.degree()
            if kks not in node_degrees_dict.values():
                break
        importance_dict[ks] = temp
        ks += 1
    return importance_dict


if __name__ == "__main__":
    # graph = nx.Graph()
    # graph.add_edges_from(
    #     [(1, 4), (2, 4), (3, 4), (4, 5), (5, 6), (5, 7), (3, 5), (6, 7)])
    # print kshell(graph)
    path = "/home/dreamhome/network-datasets/karate/karate.paj"
    graph = read_graph_from_file(path)
    print kshell(graph)

算法中存在的问题

  • 删除最后剩下孤立点如何解决?
  • 删边之后节点的度小于Ks值如何处理?

如果根据算法思想那么算法中存在一定的问题,本人依照依照自己的理解的写的实现代码,若有错误请指正,感谢您的不吝赐教!

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值