一.介绍

k-shell算法中很多节点的kshell值相同,无法区分它们的重要性,因此对k-shell算法进行了改进,提出了IKS算法

二.算法思路

  1. 熵是用来表示信息的不确定性,熵越大表示信息的不确定性越大。
  2. 这篇文章将熵扩展到了复杂网络中,称为节点信息熵。节点信息熵越大,节点影响力越大。
  3. 是对每个shell中的节点用信息熵排序,再重复从每个shell中取熵最大的节点。

三.公式

令节点viv_{i}vi​的度为kik_{i}ki​,节点viv_{i}vi​的重要性 IiI_{i}Ii​:
Ii=ki∑j=1NkjI_{i} = \frac{k_{i}}{\sum_{j=1}^{N}k_{j}}Ii​=∑j=1N​kj​ki​​
这里N为图G的节点数。节点的信息熵为:
ei=−∑j∈Γ(i)Ij⋅ln⁡Ije_{i} = - \sum_{j\in\Gamma(i)}I_{j}\cdot \ln I_{j}ei​=−j∈Γ(i)∑​Ij​⋅lnIj​
其中j∈Γ (i)是节点vi的邻居集合。节点的信息熵考虑了邻居节点的传播效应,节点信息熵越大,影响力就越大。

四.算法步骤

  1. 根据k-shell分解算法将网络分解为k壳
  2. 根据上式计算节点的信息熵ei
  3. 根据节点的信息熵将每个壳内的节点由大到小进行排序
  4. 对于k-shell值最大的节点,选择节点信息熵最大的结点,然后选择节点信息熵最大的壳层下一层的节点。这个过程继续进行,直到在1-shell中选中节点为止,第一次迭代完成。
  5. 重复步骤4,选中剩余的节点,直到选中所有的节点。忽略选中所有节点的shell。在特定壳层中,当节点信息熵值相等时,随机选择节点。

五.代码:稳定(熵值相同时,每次只选第一个)

import networkx as nx
import matplotlib.pyplot as plt
import math
#抽取txt中的数据
def read_txt(data):g = nx.read_weighted_edgelist(data)print(g.edges())return g
def gDegree(G):"""将G.degree()的返回值变为字典"""node_degrees_dict = {}for i in G.degree():node_degrees_dict[i[0]]=i[1]return node_degrees_dict.copy()def kshell(G):"""kshell(G)计算k-shell值"""graph = G.copy()importance_dict = {}ks = 1while graph.nodes():temp = []node_degrees_dict = gDegree(graph)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 = gDegree(graph)if kks not in node_degrees_dict.values():breakimportance_dict[ks] = tempks += 1return importance_dict
def sumD(G):"""计算G中度的和"""G_degrees = gDegree(G)sum = 0for v in G_degrees.values():sum += vreturn sum
def getNodeImportIndex(G):"""计算节点的重要性指数"""sum = sumD(G)I = {}G_degrees = gDegree(G)for k,v in G_degrees.items():I[k] = v/sumreturn Idef Entropy(G):"""Entropy(G) 计算出G中所有节点的熵I 为重要性e 为节点的熵sum += I[i]*math.log(I[i])"""I = getNodeImportIndex(G)e = {}for k,v in I.items():sum = 0for i in G.neighbors(k):sum += I[i]*math.log(I[i])sum = -sume[k] = sumreturn edef kshellEntropy(G):"""kshellEntropy(G) 是计算所有壳层下,所有节点的熵值例:{28: {'1430': 0.3787255719932099,'646': 0.3754626894107377,'1431': 0.3787255719932099,'1432': 0.3787255719932099,'1433': 0.3754626894107377....ks is a dict 显示每个壳中的节点e 计算了算有节点的熵 """ks = kshell(G)e = Entropy(G)ksES = {}ksI = max(ks.keys())while ksI > 0:ksE = {}for i in ks[ksI]:ksE[i] = e[i]ksES[ksI] = ksEksI -= 1return ksESdef kshellEntropySort(G):ksE = kshellEntropy(G)ksES = []ksI = max(ksE.keys())while ksI > 0:t = sorted([(v, k) for k, v in ksE[ksI].items()],reverse=True)ksES.append(list(i[1] for i in t))ksI -= 1return ksESdef getRank(G):rank = []rankEntropy = kshellEntropySort(G)while (len(rankEntropy)!= 0):for i in range(len(rankEntropy)):rank.append(rankEntropy[i].pop(0))while True:if [] in rankEntropy:rankEntropy.remove([])else:breakreturn rank
G1 = nx.read_gml("karate.gml",label="id")getRank(G1)

六.同一个熵下的节点应该随机选取还没有实现

======================================

七.2021.10.24更新:实现了随机选择熵相同的节点(排序结果不稳定)

import networkx as nx
import matplotlib.pyplot as plt
import math
from numpy import *
#抽取txt中的数据
def read_txt(data):g = nx.read_weighted_edgelist(data)print(g.edges())return g
def gDegree(G):"""将G.degree()的返回值变为字典"""node_degrees_dict = {}for i in G.degree():node_degrees_dict[i[0]]=i[1]return node_degrees_dict.copy()def kshell(G):"""kshell(G)计算k-shell值"""graph = G.copy()importance_dict = {}ks = 1while graph.nodes():temp = []node_degrees_dict = gDegree(graph)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 = gDegree(graph)if kks not in node_degrees_dict.values():breakimportance_dict[ks] = tempks += 1return importance_dict
def sumD(G):"""计算G中度的和"""G_degrees = gDegree(G)sum = 0for v in G_degrees.values():sum += vreturn sum
def getNodeImportIndex(G):"""计算节点的重要性指数"""sum = sumD(G)I = {}G_degrees = gDegree(G)for k,v in G_degrees.items():I[k] = v/sumreturn Idef Entropy(G):"""Entropy(G) 计算出G中所有节点的熵I 为重要性e 为节点的熵sum += I[i]*math.log(I[i])"""I = getNodeImportIndex(G)e = {}for k,v in I.items():sum = 0for i in G.neighbors(k):sum += I[i]*math.log(I[i])sum = -sume[k] = sumreturn edef kshellEntropy(G):"""kshellEntropy(G) 是计算所有壳层下,所有节点的熵值例:{28: {'1430': 0.3787255719932099,'646': 0.3754626894107377,'1431': 0.3787255719932099,'1432': 0.3787255719932099,'1433': 0.3754626894107377....ks is a dict 显示每个壳中的节点e 计算了算有节点的熵 """ks = kshell(G)e = Entropy(G)ksES = {}ksI = max(ks.keys())while ksI > 0:ksE = {}for i in ks[ksI]:ksE[i] = e[i]ksES[ksI] = ksEksI -= 1return ksESdef kshellEntropySort(G):ksE = kshellEntropy(G)ksES = []ksI = max(ksE.keys())while ksI > 0:t = sorted([(v, k) for k, v in ksE[ksI].items()],reverse=True)#把熵值一样的节点放在一个集合中t_new = {}for i in t:t_new.setdefault(i[0],list()).append(i[1])#按熵值排序变成列表t = sorted([(k, v) for k, v in t_new.items()],reverse=True)#把相同熵值的节点列表打乱顺序,相当于随机选择sub_ksES = []for i in t:if len(i[1]) == 1:sub_ksES += i[1]else:random.shuffle(i[1])sub_ksES += i[1]ksES.append(sub_ksES)
#         ksES.append(list(i[1] for i in t))ksI -= 1return ksESdef getRank(G):rank = []rankEntropy = kshellEntropySort(G)while (len(rankEntropy)!= 0):for i in range(len(rankEntropy)):rank.append(rankEntropy[i].pop(0))while True:if [] in rankEntropy:rankEntropy.remove([])else:breakreturn rank
G1 = nx.read_gml("karate.gml",label="id")getRank(G1)

======================================

八.2021.12.15更新:之前的kshell算法好像是错的,换了一套kshell代码

import networkx as nx
import matplotlib.pyplot as plt
import math
from numpy import *
#抽取txt中的数据
def read_txt(data):g = nx.read_weighted_edgelist(data)print(g.edges())return g
def gDegree(G):"""将G.degree()的返回值变为字典"""node_degrees_dict = {}for i in G.degree():node_degrees_dict[i[0]]=i[1]return node_degrees_dict.copy()def kshell(G):graph = G.copy()importance_dict={}level=1while len(graph.degree):importance_dict[level]=[]while True:level_node_list=[]for item in graph.degree:if item[1]<=level:level_node_list.append(item[0])graph.remove_nodes_from(level_node_list)importance_dict[level].extend(level_node_list)if not len(graph.degree):return importance_dictif min(graph.degree,key=lambda x:x[1])[1]>level:breaklevel=min(graph.degree,key=lambda x:x[1])[1]return importance_dict
def sumD(G):"""计算G中度的和"""G_degrees = gDegree(G)sum = 0for v in G_degrees.values():sum += vreturn sum
def getNodeImportIndex(G):"""计算节点的重要性指数"""sum = sumD(G)I = {}G_degrees = gDegree(G)for k,v in G_degrees.items():I[k] = v/sumreturn Idef Entropy(G):"""Entropy(G) 计算出G中所有节点的熵I 为重要性e 为节点的熵sum += I[i]*math.log(I[i])"""I = getNodeImportIndex(G)e = {}for k,v in I.items():sum = 0for i in G.neighbors(k):sum += I[i]*math.log(I[i])sum = -sume[k] = sumreturn edef kshellEntropy(G):"""kshellEntropy(G) 是计算所有壳层下,所有节点的熵值例:{28: {'1430': 0.3787255719932099,'646': 0.3754626894107377,'1431': 0.3787255719932099,'1432': 0.3787255719932099,'1433': 0.3754626894107377....ks is a dict 显示每个壳中的节点e 计算了算有节点的熵 """ks = kshell(G)e = Entropy(G)ksES = {}ksIs = sorted(ks.keys(),reverse = True)for ksI in ksIs:ksE = {}for i in ks[ksI]:ksE[i] = e[i]ksES[ksI] = ksEreturn ksESdef kshellEntropySort(G):ksE = kshellEntropy(G)ksES = []ksIs = sorted(ksE.keys(),reverse = True)for ksI in ksIs:t = sorted([(v, k) for k, v in ksE[ksI].items()],reverse=True)#把熵值一样的节点放在一个集合中t_new = {}for i in t:t_new.setdefault(i[0],list()).append(i[1])#按熵值排序变成列表t = sorted([(k, v) for k, v in t_new.items()],reverse=True)#把相同熵值的节点列表打乱顺序,相当于随机选择sub_ksES = []for i in t:if len(i[1]) == 1:sub_ksES += i[1]else:random.shuffle(i[1])sub_ksES += i[1]ksES.append(sub_ksES)
#         ksES.append(list(i[1] for i in t))return ksESdef getRank(G):rank = []rankEntropy = kshellEntropySort(G)while (len(rankEntropy)!= 0):for i in range(len(rankEntropy)):rank.append(rankEntropy[i].pop(0))while True:if [] in rankEntropy:rankEntropy.remove([])else:breakreturn rank
G1 = nx.read_edgelist("../dataset/jazz.txt")getRank(G1)

(python)改进的k-shell算法来识别关键节点 The improved k-shell algorithm(IKS)相关推荐

  1. 基于改进的k最近邻算法的单体型重建问题An Improved KNN Algorithm for Haplotype Reconstruction Problem

    基于改进的k最近邻算法的单体型重建问题 An Improved KNN Algorithm for Haplotype Reconstruction Problem DOI: 10.12677/csa ...

  2. 算法-图论_关键节点的判断

    无向图的关节点 概述: 在网络中关节点的判断将成为影响网络连通性的主要因素.节点之间通过关键点传递信息,如在我们以太网中的网关.当网关节点失效,那么两个网络之间的节点就不能够进行通信.在无线传感器网络 ...

  3. 机器学习《西瓜书》9.4解答——k-means算法:编程实现k均值算法,设置三组不同的k值、三组不同初始中心点,在西瓜数据集4.0上进行实验比较,并讨论什么样的初始中心有助于得到好结果。

    1.运行结果:(注:图中方块标注的点为随机选取的初始样本点) k=2时: 本次选取的2个初始向量为[[0.243, 0.267], [0.719, 0.103]] 共进行61轮 共耗时0.10s k= ...

  4. networkx图中识别关键节点的中心性函数

    特征向量中心性 求中心性

  5. k均值算法python实现(吴恩达机器学习作业)

    k均值算法python实现(吴恩达机器学习作业) 题目要求 数据集 读取mat文件 K-means 实现 结果 问题 题目要求 采用K均值算法对样本进行聚类. 编写K均值算法源代码,对ex7data2 ...

  6. 《机器学习实战》——kNN(k近邻算法)

    原作者写的太好了,包括排版都特别整齐(其中有一个错误之处就是在约会网站配对效果判定的时候,列表顺序不对,导致结果有误,这里我已做出修改) 原作者和出处:http://blog.csdn.net/c40 ...

  7. win10+Python3.7.3+OpenCV3.4.1入门学习(二十章 K近邻算法)————20.1理论基础

    Python版本是Python3.7.3,OpenCV版本OpenCV3.4.1,开发环境为PyCharm 文章目录 第20章 K近邻算法 20.1 理论基础 第20章 K近邻算法 机器学习算法是从数 ...

  8. 机器学习第七章之K近邻算法

    K近邻算法(了解) 7.1 K近邻算法 7.1.1 K近邻算法的原理介绍 7.1.2 K近邻算法的计算步骤及代码实现 7.2 数据预处理之数据归一化 7.2.1 min-max标准化 7.2.2 Z- ...

  9. C++实现的简单k近邻算法(K-Nearest-Neighbour,K-NN)

    C++实现的简单的K近邻算法(K-Nearest Neighbor,K-NN) 前一段时间学习了K近邻算法,对K近邻算法有了一个初步的了解,也存在一定的问题,下面我来简单介绍一下K近邻算法.本博客将从 ...

最新文章

  1. python编程入门教学电子书-Python编程入门电子书教程,看这几个就够了
  2. 寻找重复的子树 Find Duplicate Subtrees
  3. 硬件:笔记本常见故障处理技巧与思路,值得收藏!
  4. (转载)C语言右移运算符的问题(特别当与取反运算符一起时)
  5. 我公司有个统计学的985应届(硕士)从事数据分析岗位
  6. 少撸两局教你搭个博客玩
  7. 帧布局--FrameLayout
  8. sql server删除主键约束所想到的
  9. java实现水仙花数int_java实现水仙花数的计算|chu
  10. Html5开发的在线画板涂鸦,使用html5 canvas制作涂鸦画板
  11. 2.cycloneIII系列FPGA下载模式的配置
  12. java+rabbitMQ实现一对一聊天
  13. 三步必杀【洛谷P4231】
  14. MobileNetV2网络结构分析
  15. 排列组合 C(n,m)
  16. 昨日关注:40个博客网站排名
  17. NLP | Word2Vec之基于Negative Sampling的 CBOW 和 skip-gram 模型
  18. GPIO之推挽输出和开漏输出
  19. 强化学习及Python代码示例
  20. 查看word的版本型号

热门文章

  1. java:Cassandra入门与实战——上
  2. 论文精读报告-How to Read a Paper
  3. 使用tesseract训练自己的字库提高识别率
  4. Web大学生网页作业成品——仿腾讯游戏官网网站设计与实现(HTML+CSS+JavaScript)
  5. (MACN小米AI 轻量化SISR)A Matrix-in-matrix Neural Network for Image Super Resolution
  6. 【hadoop】hbase配置
  7. 使用欧镭2D雷达ROS驱动
  8. 【推荐+转摘】如何又快又好的做出一份优质PPT
  9. 计算机中丢失swr.dll,initpki.dll加载失败找不到指定的模块0x80004005错误代码怎么办win10...
  10. 初学MSP430F5529定时器