R语言-AHP层次分析法

来源:互联网 发布:如何导出股票数据 编辑:程序博客网 时间:2024/05/16 17:20

常用的一种算法之一,虽说有主观性, 但比主观上直接对指标定权重科学一点。具体原理可以百度查。
文章包括: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, CRCRtest <- 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 
0 0
原创粉丝点击