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值如何处理?
如果根据算法思想那么算法中存在一定的问题,本人依照依照自己的理解的写的实现代码,若有错误请指正,感谢您的不吝赐教!