常用的一种算法之一,虽说有主观性, 但比主观上直接对指标定权重科学一点。具体原理可以百度查。
文章包括:1.方根法求权重 2.判断矩阵的一致性检验 3.案例
AHP求权重有两种方法,和积法和方根法,方根法比较好实现所以用方根法求解。
##输入:judgeMatrix 判断矩阵;round 结果约分位数
##输出:权重
weight <- function (judgeMatrix, round=3) {
n = ncol(judgeMatrix)
cumProd <- vector(length=n)
cumProd <- apply(judgeMatrix, 1, prod) ##求每行连乘积
weight <- cumProd^(1/n) ##开n次方(特征向量)
weight <- weight/sum(weight) ##求权重
round(weight, round)
}
判断矩阵的一致性检验用于检验,你的判断矩阵是否科学合理,RI值只查到了位数达到11的值。所以这段代码最多可以检验11个变量的判断矩阵。多于11个变量,可以自己查一下RI和改改代码。
###注:CRtest调用了weight函数
###输入:judgeMatrix
###输出:CI, CR
CRtest <- function (judgeMatrix, round=3){
RI <- c(0, 0, 0.58, 0.9, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49, 1.51) #随机一致性指标
Wi <- weight(judgeMatrix) ##计算权重
n <- length(Wi)
if(n > 11){
cat("判断矩阵过大,请少于11个指标 \n")
}
if (n > 2) {
W <- matrix(Wi, ncol = 1)
judgeW <- judgeMatrix %*% W
JudgeW <- as.vector(judgeW)
la_max <- sum(JudgeW/Wi)/n
CI = (la_max - n)/(n - 1)
CR = CI/RI[n]
cat("\n CI=", round(CI, round), "\n")
cat("\n CR=", round(CR, round), "\n")
if (CR <= 0.1) {
cat(" 通过一致性检验 \n")
cat("\n Wi: ", round(Wi, round), "\n")
}
else {
cat(" 请调整判断矩阵,使CR<0.1 \n")
Wi = NULL
}
}
else if (n <= 2) {
return(Wi)
}
consequence <- c(round(CI, round), round(CR, round))
names(consequence) <- c("CI", "CR")
consequence
}
随便生成了个判断矩阵,检验了一下。
b <- c(1,3,1/2,1/2,3,1/3,1,1/2,1/3,1/2,
3,2,1,3,2,2,3,1/3,1,2,1/3,2,1/2,1/2,1)
(judgeMatix <- matrix(b, ncol=5))
[,1] [,2] [,3] [,4] [,5]
[1,] 1.0 0.3 3 2.0 0.3
[2,] 3.0 1.0 2 3.0 2.0
[3,] 0.5 0.5 1 0.3 0.5
[4,] 0.5 0.3 3 1.0 0.5
[5,] 3.0 0.5 2 2.0 1.0
##计算权重
weight(judgeMatix)
weight(judgeMatix)
[1] 0.157 0.364 0.092 0.132 0.254
##判断矩阵一致性检验
CRtest(judgeMatix)
CI= 0.118
CR= 0.105
请调整判断矩阵,使CR<0.1
CI CR
0.118 0.105