Friedman检验和Nemenyi后续检验-python实现论文中p值计算与临界差异图的绘制

前言

Friedman检验Nemenyi后续检验是论文中最常用的显著性检验方法,两种方法的详细介绍见《机器学习》-西瓜书P42-P44。在本文中,将使用真实论文中的数据进行计算,并绘制出论文中常见的临界差异图(CD),如下图所示。
在这里插入图片描述

Wilcoxon符号秩检验

说明:在Self-Supervised Time Series Clustering With Model-Based Dynamics这篇论文中使用的便是Wilcoxon符号秩检验方法,具体细节他是参考论文Statistical Comparisons of Classifiers over Multiple Data Sets的,下面我就根据论文中的原始数据,实现AVG RANK 和P值的计算。

论文中的数据如图所示:

  1. 利用OCR工具获得原始论文中的数据,如下图所示:在这里插入图片描述

  2. 利用rank()方法计算各方法在数据集上的排名,python程序如下:

# -*- coding: utf-8 -*-
# @Time : 
# @Author : 
# @Email : 
# @File : 

import pandas as pd

def count_avg(source_csv_file,target_csv_file):
    df=pd.read_csv(source_csv_file,index_col=None)
    df_head=df.columns
    result_df=[]
    #读取每一行数据
    for i in range(len(df)):
        one_row_df=df.iloc[i]
        #获得每一行的排名
        rank_one_row=one_row_df.rank(ascending=False, method='average')
        best_result = rank_one_row.values
        result_df.append(best_result)
    result=pd.DataFrame(result_df,columns=df_head,index=None)  result.to_csv(target_csv_file,mode='w',index=False)
source_csv_file = './file/STCN原始数据.csv'
target_csv_file='./file/STCN原始数据_RANK_NMI.csv'
count_avg(source_csv_file,target_csv_file)

在这里插入图片描述
运行程序,结果如图所示:
在这里插入图片描述

求平均值,即可获得各算法的AVG RANK
在这里插入图片描述

与原论文一致:
在这里插入图片描述

  1. 原始数据上计算p值,调用stats.wilcoxon()方法即可进行Wilcoxon符号秩检验,注意使用python3.7版本,python3.10版本会有警告,且结果和python==3.7及其他版本的可能结果不一样。python程序如下:
# -*- coding: utf-8 -*-
# @Time : 
# @Author : 
# @Email : 
# @File : 
import pandas as pd
import numpy as np
from scipy import stats

source_csv_file = './file/STCN原始数据.xlsx'
def get_p_value(source_csv_file):
    df = pd.read_excel(io=source_csv_file,index_col=None,header=None)
    p_list=[]
    # B_index默认最后一列
    last_index=df.shape[1]-1
    B_index=last_index
    for i in range(last_index):
        A=df.iloc[:,i].values
        B=df.iloc[:,B_index].values

        A=np.array(A)
        B=np.array(B)
        # Wilcoxon符号秩检验
        t,p_value=stats.wilcoxon(A, B, correction=False, alternative='two-sided')
        # t,p=stats.ttest_ind(A,B)
        # print("t:", t, "\t p_value:", p_value)
        p_list.append(p_value)
    print(p_list)
get_p_value(source_csv_file)

计算结果如图所示:
python3.10的结果:
在这里插入图片描述
python3.7的结果:
在这里插入图片描述

与原论文一致:
在这里插入图片描述

  1. 绘制CD(临界差异)图,python程序如下:
# -*- coding: utf-8 -*-
# @Time : 
# @Author : 
# @Email : 
# @File : 
import Orange
import matplotlib.pyplot as plt

#算法名字
names = ['k-means', 'SC', 'UDFS', 'NDFS', 'RUFS', 'RSFS', 'KSC', 'KDBA', 'K-shape', 'u-shapelet', 'USSL', 'STCN']
#各算法的平均排名
avranks = [9.6528,7.9583,8.7778,6.8889,6.2083,6.2222,
           6.4306,6.6389,7.0417,7.3333,2.5139,2.3333]
#数据集大小
datasets_num = 35
#利用Nemenyi检验计算Critical difference
CD = Orange.evaluation.scoring.compute_CD(avranks, datasets_num, alpha='0.05', test='nemenyi')
Orange.evaluation.scoring.graph_ranks(avranks, names, cd=CD, width=8, textspace=1.5, reverse=True)
plt.show()

结果如图:在这里插入图片描述

参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值