python 实现 Friedman统计检验
基于此,Friedman检验F_F被定义为:
其中,N表示数据集的数量,k表示算法个数,r^j_i表示第j个算法在第i个数据集的排名。
python代码实现如下:
import numpy as np #导入numpy
以数组形式传入需要比较的值,本例比较的是6个算法,13个数据的排名,
A= np.array([[3,2,5,6,4,1],[5,2.5,6,2.5,4,1],[5,4,6,2.5,2.5,1],[5,6,4,2,3,1],[6,3,5,2,4,1],
[4.5,6,2.5,2.5,4.5,1],[4,3,6,5,2,1],[2,5,3,6,4,1],[6,4.5,2,4.5,3,1],
[4,5,6,3,2,1],[5,4,6,2,3,1],[2,5,6,3,4,1],[3,5,2,6,4,1]])
定义Friedman函数,
def Friedman(n,k,data_matrix):
'''
Friedman检验
参数:数据集个数n, 算法种数k, 排序矩阵data_matrix
返回值是Tf
'''
#计算每个算法的平均序值,即求每一列的排序均值
N = data_matrix.shape[1]#查看数据形状
rank_mean = list()
for i in range(N):#计算平均序值
rank_mean.append(data_matrix[:,i].mean())
print("rank_mean:",np.round(rank_mean,2))
sum_mean = np.array(rank_mean)#转换数据结构方便下面运算
## 计算总的排名和
sum_ri2_mean = (sum_mean ** 2).sum()
#计算Tf
result_Tx2 = (12 * n) * (sum_ri2_mean - ((k * (k + 1) ** 2) / 4)) / (k * (k + 1))
result_Tf = (n - 1) * result_Tx2 / (n * (k - 1) - result_Tx2)
return result_Tf
调用Friedman函数,
value = Friedman(13,6,A)
print(round(value,2))
输出结果:
rank_mean: [4.19 4.23 4.58 3.62 3.38 1. ]
11.2
查看临界值
Friedman检验,服从(k-1)和(k-1)(N-1)的分布,本例中算法数为6,案例数为13时服从分布是F(5,60),其中5=6-1,60=(6-1)(13-1)。查临界值表,当alpha取值0.05时,可得Friedman检验的临界值为2.368
这里可以查看临界值的计算和表,点击跳转:添加链接描述