社团检测之K-Shell算法

本文简单介绍节点重要性度量算法原理及其Python实现

基本思想

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值如何处理?
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值