验证CD算法排名

注意

一旦从给定网络中提取出一组替代聚类,是否有方法根据一组目标适应度函数选择最佳的一个?

假设你在给定的图G上运行了一组社区发现算法X,并且你为每个获得的聚类计算了一组适应度分数Y

  • 有没有办法根据Y表示的质量对获得的聚类进行排名?

  • 是否有可能验证所获得排名的统计显著性?

  • 我们是否可以在比较不同的聚类时做同样的事情(例如,使用NMI、NF1、ARI、AMI…)?

不用担心,cdlib 已经为你准备好了!

(是的,我们知道社区检测是一个不适定问题,对于这个问题,没有免费的午餐可以期待……然而,我们在这里并不追求一个通用的排名!)

按适应度评分排名

class cdlib.evaluation.FitnessRanking(graph: Graph, partitions: list)
bonferroni_post_hoc() list

使用通过排名测试获得的枢轴量执行Bonferroni-Dunn事后检验。 检验控制方法(最佳排名聚类)的排名与其他每种方法不同的假设。

Returns:

一个命名元组列表,报告最佳排名聚类与其他聚类之间的成对统计显著比较(以z值、p值、调整后的p值为准)

Example:

>>> import networkx as nx
>>> from cdlib import evaluation
>>> from cdlib import algorithms
>>> g = nx.karate_club_graph()
>>> coms = algorithms.louvain(g)
>>> coms2 = algorithms.demon(g, 0.25)
>>> coms3 = algorithms.label_propagation(g)
>>> coms4 = algorithms.angel(g, 0.6)
>>> rk = evaluation.FitnessRanking(g, [coms2, coms, coms3, coms4])
>>> rk.rank(evaluation.fraction_over_median_degree)
>>> rk.rank(evaluation.edges_inside)
>>> rk.rank(evaluation.cut_ratio)
>>> rk.rank(evaluation.erdos_renyi_modularity)
>>> rk.rank(evaluation.newman_girvan_modularity)
>>> rk.rank(evaluation.modularity_density)
>>> rnk, p_value = rk.friedman_ranking()
>>> pc = rk.bonferroni_post_hoc()
References:

O.J. Dunn, 多重均值比较, 美国统计协会杂志 56 (1961) 52–64.

friedman_ranking() [<class 'list'>, <class 'float'>]

执行弗里德曼排名检验。 检验假设,在一组k个相关样本组中(其中k >= 2),至少有两组代表具有不同中位数值的总体。

Returns:

一个元组,其第一个元素是一个字典,为每个Clustering对象分配一个排名,而第二个是与排名相关的p值。

Example:

>>> import networkx as nx
>>> from cdlib import evaluation
>>> from cdlib import algorithms
>>> g = nx.karate_club_graph()
>>> coms = algorithms.louvain(g)
>>> coms2 = algorithms.demon(g, 0.25)
>>> coms3 = algorithms.label_propagation(g)
>>> coms4 = algorithms.angel(g, 0.6)
>>> rk = evaluation.FitnessRanking(g, [coms2, coms, coms3, coms4])
>>> rk.rank(evaluation.fraction_over_median_degree)
>>> rk.rank(evaluation.edges_inside)
>>> rk.rank(evaluation.cut_ratio)
>>> rk.rank(evaluation.erdos_renyi_modularity)
>>> rk.rank(evaluation.newman_girvan_modularity)
>>> rk.rank(evaluation.modularity_density)
>>> rnk, p_value = rk.friedman_ranking()
References:

    1. 弗里德曼,使用排名以避免在方差分析中隐含的正态性假设,《美国统计协会杂志》32(1937)674–701。

  1. D.J. Sheskin, 参数和非参数统计程序手册. crc 出版社, 2003, 测试 25: 弗里德曼双向秩方差分析

rank(scoring_function: Callable[[Graph, object], object]) [<class 'str'>, <class 'dict'>]

对所有需要排名的聚类对象计算指定的评分函数。

Parameters:

scoring_function – 来自 cdlib.evaluation 的适应度函数

Returns:

一个元组,其第一个元素是scoring_function名称,而第二个元素是一个字典,字典的键是聚类名称,值是计算得到的分数。

Example:

>>> import networkx as nx
>>> from cdlib import evaluation
>>> from cdlib import algorithms
>>> g = nx.karate_club_graph()
>>> coms = algorithms.louvain(g)
>>> coms2 = algorithms.demon(g, 0.25)
>>> coms3 = algorithms.label_propagation(g)
>>> coms4 = algorithms.angel(g, 0.6)
>>> rk = evaluation.FitnessRanking(g, [coms2, coms, coms3, coms4])
>>> rk.rank(evaluation.fraction_over_median_degree)
topsis() [<class 'list'>, None]

TOPSIS(Technique for Order of Preference by Similarity to Ideal Solution)是一种多标准决策分析方法。 TOPSIS基于的概念是,选择的替代方案应具有与正理想解(PIS)最短的几何距离,以及与负理想解(NIS)最长的几何距离。

Returns:

一个元组,其第一个元素是排名字典,为每个聚类对象分配一个TOPSIS分数,而第二个元素是None(以保持与friedman_ranking的一致性)。

Example:

>>> import networkx as nx
>>> from cdlib import evaluation
>>> from cdlib import algorithms
>>> g = nx.karate_club_graph()
>>> coms = algorithms.louvain(g)
>>> coms2 = algorithms.demon(g, 0.25)
>>> coms3 = algorithms.label_propagation(g)
>>> coms4 = algorithms.angel(g, 0.6)
>>> rk = evaluation.FitnessRanking(g, [coms2, coms, coms3, coms4])
>>> rk.rank(evaluation.fraction_over_median_degree)
>>> rk.rank(evaluation.edges_inside)
>>> rk.rank(evaluation.cut_ratio)
>>> rk.rank(evaluation.erdos_renyi_modularity)
>>> rk.rank(evaluation.newman_girvan_modularity)
>>> rk.rank(evaluation.modularity_density)
>>> rnk, _ = rk.topsis()
References:

  1. Hwang, C.L.; Yoon, K. (1981). 多属性决策方法与应用. 纽约: Springer-Verlag.

  2. Yoon, K. (1987). “离散妥协情况的和解”. 运筹学会杂志. 38 (3): 277–286. doi:10.1057/jors.1987.44.

方法

FitnessRanking.rank(scoring_function)

对所有需要排名的聚类对象计算指定的评分函数。

FitnessRanking.topsis()

通过相似度到理想解的偏好排序技术(TOPSIS)是一种多标准决策分析方法。

FitnessRanking.friedman_ranking()

执行弗里德曼排名测试。

FitnessRanking.bonferroni_post_hoc()

使用通过排名测试获得的枢轴量执行Bonferroni-Dunn事后检验。

通过聚类相似性进行排名

class cdlib.evaluation.ComparisonRanking(partitions: list)
bonferroni_post_hoc() list

使用通过排名测试获得的枢轴量执行Bonferroni-Dunn事后检验。 检验控制方法(最佳排名聚类)的排名与其他每种方法不同的假设。

Returns:

一个命名元组列表,报告最佳排名聚类与其他聚类之间的成对统计显著比较(以z值、p值、调整后的p值为准)

Example:

>>> import networkx as nx
>>> from cdlib import evaluation
>>> from cdlib import algorithms
>>> g = nx.karate_club_graph()
>>> coms = algorithms.louvain(g)
>>> coms2 = algorithms.kclique(g, 2)
>>> coms3 = algorithms.label_propagation(g)
>>> rk = evaluation.ComparisonRanking([coms, coms2, coms3])
>>> rk.rank(evaluation.overlapping_normalized_mutual_information_LFK)
>>> rk.rank(evaluation.overlapping_normalized_mutual_information_MGH)
>>> rk.rank(evaluation.omega)
>>> rnk, p_value = rk.friedman_ranking()
>>> pc = rk.bonferroni_post_hoc()
References:

O.J. Dunn, 多重均值比较, 美国统计协会杂志 56 (1961) 52–64.

friedman_ranking() [<class 'list'>, <class 'float'>]

执行弗里德曼排名检验。 检验假设,在一组k个相关样本组中(其中k >= 2),至少有两组代表具有不同中位数值的总体。

Returns:

一个元组,其第一个元素是一个字典,为每个Clustering对象分配一个排名,而第二个是与排名相关的p值。

Example:

>>> import networkx as nx
>>> from cdlib import evaluation
>>> from cdlib import algorithms
>>> g = nx.karate_club_graph()
>>> coms = algorithms.louvain(g)
>>> coms2 = algorithms.kclique(g, 2)
>>> coms3 = algorithms.label_propagation(g)
>>> rk = evaluation.ComparisonRanking([coms, coms2, coms3])
>>> rk.rank(evaluation.overlapping_normalized_mutual_information_LFK)
>>> rk.rank(evaluation.overlapping_normalized_mutual_information_MGH)
>>> rk.rank(evaluation.omega)
>>> rnk, p_value = rk.friedman_ranking()
References:

    1. 弗里德曼,使用排名以避免在方差分析中隐含的正态性假设,《美国统计协会杂志》32(1937)674–701。

  1. D.J. Sheskin, 参数和非参数统计程序手册. crc 出版社, 2003, 测试 25: 弗里德曼双向秩方差分析

rank(comparison_function: Callable[[object, object], object])

对所有需要排名的聚类对象计算指定的比较函数。

Parameters:

scoring_function – 来自 cdlib.evaluation 的适应度函数

Returns:

一个元组,其第一个元素是scoring_function名称,而第二个元素是一个字典,字典的键是聚类名称,值是计算得到的分数。

Example:

>>> import networkx as nx
>>> from cdlib import evaluation
>>> from cdlib import algorithms
>>> g = nx.karate_club_graph()
>>> coms = algorithms.louvain(g)
>>> coms2 = algorithms.kclique(g, 2)
>>> coms3 = algorithms.label_propagation(g)
>>> rk = evaluation.ComparisonRanking([coms, coms2, coms3])
>>> rk.rank(evaluation.overlapping_normalized_mutual_information_LFK)
topsis() [<class 'list'>, None]

TOPSIS(Technique for Order of Preference by Similarity to Ideal Solution)是一种多标准决策分析方法。 TOPSIS基于的概念是,选择的替代方案应具有与正理想解(PIS)最短的几何距离,以及与负理想解(NIS)最长的几何距离。

Returns:

一个元组,其第一个元素是排名字典,为每个聚类对象分配一个TOPSIS分数,而第二个元素是None(以保持与friedman_ranking的一致性)。

Example:

>>> import networkx as nx
>>> from cdlib import evaluation
>>> from cdlib import algorithms
>>> g = nx.karate_club_graph()
>>> coms = algorithms.louvain(g)
>>> coms2 = algorithms.kclique(g, 2)
>>> coms3 = algorithms.label_propagation(g)
>>> rk = evaluation.ComparisonRanking([coms, coms2, coms3])
>>> rk.rank(evaluation.overlapping_normalized_mutual_information_LFK)
>>> rk.rank(evaluation.overlapping_normalized_mutual_information_MGH)
>>> rk.rank(evaluation.omega)
>>> rnk, _ = rk.topsis()
References:

  1. Hwang, C.L.; Yoon, K. (1981). 多属性决策方法与应用. 纽约: Springer-Verlag.

  2. Yoon, K. (1987). “离散妥协情况的和解”. 运筹学会杂志. 38 (3): 277–286. doi:10.1057/jors.1987.44.

方法

ComparisonRanking.rank(comparison_function)

计算指定的比较函数,以对所有需要排名的聚类对象进行排名。

ComparisonRanking.topsis()

通过相似度到理想解的偏好排序技术(TOPSIS)是一种多标准决策分析方法。

ComparisonRanking.friedman_ranking()

执行弗里德曼排名测试。

ComparisonRanking.bonferroni_post_hoc()

使用通过排名测试获得的枢轴量执行Bonferroni-Dunn事后检验。