文章目录
前言
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值的计算。
论文中的数据如图所示:
-
利用OCR工具获得原始论文中的数据,如下图所示:
-
利用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
与原论文一致:
- 在原始数据上计算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的结果:
与原论文一致:
- 绘制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()
结果如图: