统计检验问题:Friedman Test,Nemenyi test检验和Bonferroni-Dunn test检验

当我们提出一个算法后,我们需要将它与其他的算法进行对比,表现出它们的性能差异。因此,在做算法对比时,往往需要对实验结果进行统计检验。一般会先利用弗里德曼检验判断提出算法是否与其他算法有明显的差异,如果有的话还需要继续进行后续的统计检验,比如用Nemenyi test检验和Bonferroni-Dunn test检验。

Friedman test是一种常用的检验,用来比较k个算法在N个数据集上的整体表现性能。但Friedman test只能给出k个算法的性能之间是否存在差异的结论,如果存在差异,还需要进行“后续检验”(post-hoc test),以得出哪些算法的性能之间存在统计上的差异,常用的后续检验方法包括Nemenyi test和Bonferroni-Dunn test。

Nemenyi test适用于对比k个算法相互之间的性能(when all classifiers are compared to each other),【这个方法提出了 Critical Difference 的概念,并且可以通过作图来呈现结果。CD具体的计算在 06 JMLR那篇有详细介绍。】
链接:https://www.jmlr.org/papers/volume7/demsar06a/demsar06a.pdf

CD的计算公式如下:
在这里插入图片描述

域值(critical difference, CD)CD图:用来表示不同算法之间的性能差异,图形如下:
在这里插入图片描述
在这里插入图片描述

周志华书本上对两种检验的描述如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果算法之间有横线相连说明提出的算法性能不显著;如果没有横线相连,说明所提出的算法性能显著。

而Bonferroni-Dunn test适用于将某个算法与其余k-1个算法对比(when all classifiers are compared with a control classifier),二者都是将各个算法平均排名之差与某域值(critical difference, CD)对比,若大于该域值则说明平均排名高的算法统计上优于平均排名低的算法,反之则二者统计上没有差异。

实例:
在这里插入图片描述
这里的F0.05和F0.1可以根据给定的算法个数和数据集个数,根据对应的F表格查值,如果无法查到的话,只能借助软件R语言,python或者matlab进行计算,然后再进行比较
在这里插入图片描述
在这里插入图片描述

实践部分:因为一直想复现出论文中关于Friedman检验图时如何画出来的,所以参考了CSDN中很多优秀博主的帖子,经过自己的实践后,发现比较有效的方法是以下两种方法:
Matlab中实现Friedman检验:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Python中实现Friedman检验:

在这里插入图片描述
请添加图片描述
3.利用python中的Orange模块来进行绘图,但是这个容易出现以下的错误,比如会出现导Orange包 无法导入,即Orange包一直无法安装等问题,这时可以试试离线下载。不过下载完成后,在进行Friedman检验时,可能会报错,结果报错显示AttributeError: module ‘Orange.evaluation’ has no attribute ‘compute_CD’,这个错误截至现在发文,我还没有找到好的解决方法。
4.手算出各个算法在各个数据集上的平均序值,通过公式计算得到CD值,然后利用PPT或者Word手绘出检验图
5.平均序值的计算,实例部分:
在这里插入图片描述

参考文章:
1.统计检验–多个算法在多个数据集上的结果比较及R语言实现 - 知乎 (zhihu.com)
2.https://blog.csdn.net/jbb0523/article/details/109990924
3.https://blog.csdn.net/QKK612501/article/details/123903124?4.spm=1001.2101.3001.6650.7&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-7-123903124-blog-129110091.pc_relevant_multi_platform_whitelistv3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-7-123903124-blog-129110091.pc_relevant_multi_platform_whitelistv3&utm_relevant_index=8
5.https://zhuanlan.zhihu.com/p/266217635
6.https://zhuanlan.zhihu.com/p/145831286

<think>嗯,用户想了解DAG图的概念和实现方式。首先,我需要回忆一下DAG的定义。DAG是有向无环图,也就是有方向但没有循环的图。这在数据结构中应该属于图的一种特殊类型。 用户提到了几个引用,比如引用[1]提到DAG用于提升吞吐量,但可能有确认时间的问题。引用[2]讲到了邻接表的存储方式,顶点用数组,边用链表。引用[3]则涉及AOV网和拓扑排序的应用。所以需要结合这些信息来回答。 首先,DAG的基本概念需要解释清楚:有向边,没有环路。然后,实现方式应该包括邻接矩阵和邻接表两种常见方法。根据引用[2],邻接表的具体实现是顶点数组加边链表,这样可以节省空间,尤其适合稀疏图。需要比较邻接矩阵和邻接表的优缺点,比如空间复杂度和查询效率的区别。 应用方面,引用[3]提到的拓扑排序和任务调度是DAG的重要应用,比如编译器的依赖管理或者项目管理中的任务排序。可能还需要提到其他应用,比如数据流分析、版本控制系统中的依赖关系等。 然后,用户可能需要相关的扩展问题,比如如何检测环,或者DAG的存储优化方法。根据引用中的内容,可能需要生成相关问题,比如DAG的应用场景,如何检测环,或者与普通有向图的区别。 要注意回答的结构,先讲概念,再讲实现方式,最后应用场景。确保每个部分都清晰,并且引用对应的引用资料。例如,在邻接表部分提到引用[2]的顶点数组和边链表结构,应用部分提到引用[3]的拓扑排序。 另外,用户可能想知道如何在实际中实现DAG,比如代码结构。可能需要给出邻接表的代码示例,比如顶点和边的结构体定义,或者Python中的类实现。例如,引用[2]中提到顶点表包含index、vertex和edge列表,边表包含到达顶点、下一条边和权值,这些可以作为代码结构的参考。 还需要注意用户提到的系统级指令,比如数学公式用$...$,独立公式用$$...$$,中文回答,生成相关问题。所以回答中如果有公式,比如邻接矩阵的表示,需要用正确的LaTeX格式。例如,邻接矩阵中的元素$a_{ij}$表示边是否存在,可以用$a_{ij} = 1$来表示有边。 总结一下,回答的结构应该是: 1. DAG的概念:定义,有向无环的特性。 2. 实现方式:邻接矩阵和邻接表,各自的优缺点,可能结合引用中的存储结构。 3. 应用场景:拓扑排序、任务调度、数据流等,引用[3]中的AOV网。 4. 代码示例:比如用Python类实现邻接表。 5. 相关问题:如应用场景,环检测,与普通图的区别等。 需要确保每个部分都自然引用对应的引用资料,比如在讲应用时提到引用[3],在存储结构时提到引用[2]。 可能还需要检查是否有遗漏的重要点,比如DAG的拓扑排序算法步骤,或者如何检测环的方法(比如DFS)。虽然用户的问题主要是概念和实现,但相关的问题可能会涉及这些,所以在生成的问题中可以包括这些内容。 总之,需要组织信息,确保准确引用,结构清晰,并且符合用户的格式要求。</think>### DAG图(有向无环图)的概念与实现 #### 一、DAG图概念 **DAG(Directed Acyclic Graph)** 是一种特殊的有向图,其核心特性为: 1. **有向性**:边具有方向,用 $<V_i, V_j>$ 表示从顶点 $V_i$ 指向 $V_j$; 2. **无环性**:图中不存在任何路径使得从某一顶点出发最终回到该顶点[^1]。 DAG常用于描述具有依赖关系的场景,例如任务调度、数据流分析等。其无环特性保证了操作的可终止性,例如在编译优化中依赖关系不会形成死循环[^3]。 --- #### 二、DAG的实现方式 DAG的实现主要基于图的两种经典存储结构:**邻接矩阵**和**邻接表**。 ##### 1. 邻接矩阵 - **原理**:用二维数组 $A[n][n]$ 表示顶点间的连接关系,若存在边 $<V_i, V_j>$,则 $A[i][j] = 1$,否则为 $0$。 - **特点**: - 优点:快速判断两顶点是否相邻,时间复杂度为 $O(1)$; - 缺点:空间复杂度为 $O(n^2)$,不适合稀疏图[^2]。 ##### 2. 邻接表(更常用) - **原理**:由**顶点表**和**边表**组成: - **顶点表**:数组存储顶点信息,每个顶点包含数据域 `vertex` 和指向第一条邻接边的指针; - **边表**:单链表存储顶点的邻接关系,每条边记录目标顶点下标、权值(可选)及下一条边的指针[^2]。 - **代码示例(Python类实现)**: ```python class Vertex: def __init__(self, index, data): self.index = index # 顶点下标 self.data = data # 顶点数据 self.edges = [] # 邻接边列表 class Edge: def __init__(self, target, weight=None): self.target = target # 目标顶点下标 self.weight = weight # 权值(可选) class DAG: def __init__(self): self.vertices = [] # 顶点表 def add_vertex(self, data): new_vertex = Vertex(len(self.vertices), data) self.vertices.append(new_vertex) return new_vertex def add_edge(self, source_idx, target_idx, weight=None): edge = Edge(target_idx, weight) self.vertices[source_idx].edges.append(edge) ``` --- #### 三、DAG的应用场景 1. **拓扑排序(AOV网)** 将工程活动抽象为DAG顶点,边表示活动的依赖顺序,通过拓扑排序生成合理的执行序列[^3]。 $$ \text{拓扑序列需满足:若存在边}<V_i, V_j>\text{,则}V_i\text{在序列中位于}V_j\text{之前} $$ 2. **数据流分析** 编译器利用DAG表示表达式的计算顺序,优化中间代码生成。 3. **版本控制系统** Git通过DAG管理提交历史,确保分支合并的无环性。 --- #### 四、DAG的局限 - **交易确认时间不可预测**:在异步系统中,DAG可能因节点间状态不一致导致交易确认时间不确定[^1]; - **操作顺序不一致**:分布式场景下无法保证所有节点对操作顺序达成一致[^1]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值