层次分析法(Python)

层次分析法​(Python)

第一步

  分析系统中各因素之间的关系,建立系统的递阶层次结构(根据题意和一些文献确定
  画的层次分析图一定要在论文中画出

第二步

  对于同一层次的各元素关于上一层次中某一准则的重要性进行两两比较,构造两两比较矩阵(判断矩阵)
  准则层—方案层的判断矩阵的数值可以自己填,但要结合实际来填写,如果题目中有其他数据,可以考虑利用这些数据进行计算。

第三步

  由判断矩阵计算被比较元素对于该准则的相对权重,并进行一致性检验(检验通过权重才能用)

  • 一致性检验

def check(data:np.ndarray,size):
    CI = (np.linalg.eig(data)[0].max() - size) / (size - 1) #CI = (特征值最大值 - n) / (n - 1)
    RI = np.array([0,0,0,0.52,0.89,1.12,1.26,1.36,1.41,1.46,1.49,1.52,1.54,1.56,1.58,1.59]) #RI值
    return (CI / RI[5]).astype(float) # CR = CI / RI
  • 算术平均法

def ari(data:np.ndarray,size):
    sum = data.sum(0) #按列求和得到一行数据
    stand = data / sum
    return stand.sum(1) / size #归一化处理
  • 几何平均法

def geo(data:np.ndarray,size):
   pro = data.prod(1) #按行求和
   stand = pro ** (1 / size) #开1 / n次方
   return stand / stand.sum() #归一化处理
  • 特征值法

def cha(data:np.ndarray,size):
   [D,V] = np.linalg.eig(data) #D接受特征值,V接受特征向量
   r = np.where((D == D.max()))[0][0] #找到最大特征值的位置
   stand = V[:,r] #找到最大特征值对应的特征向量
   return stand / stand.sum() #归一化处理

使用以上三种方法并加上这句话

以往的论文利用层次分析法解决实际问题时,都是采用其中某一种方法
求权重,而不同的计算方法可能会导致结果有所偏差。为了保证结果的
稳健性,本文采用了三种方法分别求出了权重后计算平均值,再根据得
到的权重矩阵计算各方案的得分,并进行排序和综合分析,这样避免了
采用单一方法所产生的偏差,得出的结论将更全面、更有效

(摘自清风老师的PPT)

附录(从Excel读取数据)

from openpyxl import load_workbook
import numpy as np
def excelinput(path,sheet,size_col,size_row,start_col = 0,start_row = 0):
    data = []
    excel = load_workbook(path)[sheet]
    for row in excel.iter_rows(min_col = start_col,max_col = start_col + size_col,min_row = start_row,max_row = start_row + size_row):
        data.append([float(eval(i.value)) for i in row])
    return np.array(data)

你可能感兴趣的:(Python数学建模,python,numpy)