评价模型

层次分析法

简称AHP,是一种定性和定量结合的、系统化的、层次化的分析方法,用来处理复杂的决策问题,比如从多种方案中选择一种最优的
层次分析法四步骤:

①分析系统中各因素之间的关系,建立系统层次(从上到下画出目标曾准则层,方案层)
对于准则层的构建,通常需要查阅大量的文献,以及为什么选择这些变量,这些是说理和谁论文的大户。
②对同一层次中的各个元素进行两两比较,构建成对比较矩阵(准则层的比较矩阵和方案层的比较矩阵)
③计算各层次比较矩阵中各元素的相对权重,对比较矩阵的一致性检验:
RI-CI检验(一致性检验)
对比较矩阵进行特征值分解,最大的特征值为lambda,那么定义CI:
\(CI=\frac{\lambda-n}{n-1}\)
另外定义RI表格(随机实验统计规律)
另外定义RI表格,并计算CR:
\(CR=\frac{CI}{IR}\)
一般当一致性比率\(CR<0.1\)的时候,认为A的不一致程度在容许范围内,有满意的一致性,通过一致性检验
④计算整个系统下的合成权重,并计算被评价对象的总分

import numpy as np

A = np.array([[1,1/3,1/4,1/5],
              [3,1,3/4,3/5],
              [4,4/3,1,4/5],
              [5,5/3,5/4,1]])
m=len(A)                                    #获取指标个数
n=len(A[0])
RI=[0, 0, 0.58, 0.90, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49, 1.51]
R= np.linalg.matrix_rank(A)                #求判断矩阵的秩
V,D=np.linalg.eig(A)                       #求判断矩阵的特征值和特征向量,V特征值,D特征向量;
list1 = list(V)
B= np.max(list1)                           #最大特征值
index = list1.index(B)
C = D[:, index]                            #对应特征向量
CI=(B-n)/(n-1)                             #计算一致性检验指标CI
CR=CI/RI[n]
if CR<0.10:
    print("CI=", CI)
    print("CR=", CR)
    print('对比矩阵A通过一致性检验,各向量权重向量Q为:')
    sum=np.sum(C)

    Q=C/sum                               #特征向量标准化
    print(Q)                              #  输出权重向量
else:
    print("对比矩阵A未通过一致性检验,需对对比矩阵A重新构造")

熵权法

是一种客观赋权方法,在具体使用过程中,根据各个指标的分散程度,利用信息熵计算出各个指标的熵权,再根据各指标对熵权进行一定的修正,从而得到较为客观的指标权重
数据标准化:
将各个指标进行标准化处理
越大越好的:
\(x=\frac{x-min(x)}{max(x)-min(x)}\)
越小越好的:
\(x=\frac{max(x)-x}{max(x)-min(x)}\)

标准化之后归一化:
归一化方法不唯一,以下提供最简单的比值归一化,实际上也可以使用上文中的向量归一化方法
\(p_{ij}=\frac{Y_{ij}}{\sum_{i=1}^nY_{ij}}\)
如果\(p_{ij}=0\),则定义\(\lim_{n \to 0} p_{ij}lnp_{ij}\)
求解信息熵:(变量信息熵)
\(E_j=\frac{-\sum_{i=1}^n p_{ij}ln(p_{ij})}{ln n}\)
得到权值:
\(w_{ij}=\frac{1-E_j}{k-\sum E_j}\)

import numpy as np
def entropyweight(data):
    data = np.array(data)
    #归一化
    p=data/data.sum(axis=0)
    #计算熵值
    E=np.nansum(-p*np.log(P)/np.log(len(data)),axis=0)
    #计算权系数
    return (1-E)/(1-E).sum()
newdata=newdata.replace("A",1)
newdata=newdata.replace("B",2)
newdata=newdata.replace("C",3)
newdata=newdata.loc[:,'供货均值':'消耗量']
entropyweight(newdata)

个人绝对如果可以得到表格数据的话,用excel解决也是很快速的
三、熵权法的优缺点
1.优点
首先,熵权法是客观确定权重的方法,相较于层次分析法等主观法而言具有一定的精确性;
其次,该方法确定出的权重可以进行修正,从而决定了其适应性较高的特点。
2.缺点
该方法的应用范围有限,仅适于计算权重。

TOPSIS分析法

TOPSIS法使用距离来量度样本差距,使用距离尺度就需要对指标进行同向化处理(如果一个维度的数据越大越好,另一个维度的数据越小越好,会造成尺度混乱)。通常采用成本型指标向效益型指标转化(即数值评价越高,事实上几乎所有的评价方法都需要进行转化),此外,如果需要使用雷达图进行展示,建议此处将所有的数据都变成正数。

指标属性同向化,一般选择指标正向化

极小型指标:期望指标越小越好(如患病率,死亡率等)
\(x'=\frac{1}{x}(x>0)\)
或\(x'=M-x\) M为指标x可能取值的最大值
中间型指标:期望指标值既不要太大也不要太小,适当取中间值最好(如水质量评估 PH 值)
\(x'=\begin{cases}2\frac{x-m}{M-m},m\leq x \leq\frac{1}{2}(M+m)\\2\frac{M-x}{M-m},\frac{1}{2}(M+m) \leq x \leq M\end{cases}\)
换言之,即:
\(M=max{|x_i-x_{best}|}\)
其中\(M\)为指标\(x\)的可能取值的最大值,\(m\)为指标\(x\)的可能取值的最小值
区间型指标:期望指标的取值最好落在某一个确定的区间最好(如体温)
\(x'=\begin{cases}1-\frac{a-x}{a-a^*}\space x<a\\1 \space a\leq x \leq b\\1-\frac{x-b}{b^*-b} \space x>b\end{cases}\)
其中[a,b]为指标x的最佳稳定区间,[\(a^*\),\(b^*\)]为最大容忍区间

def dataDirection_1(datas, offset=0):
	def normalization(data):
		return 1 / (data + offset)

	return list(map(normalization, datas))


def dataDirection_2(datas, x_min, x_max):
	def normalization(data):
		if data <= x_min or data >= x_max:
			return 0
		elif data > x_min and data < (x_min + x_max) / 2:
			return 2 * (data - x_min) / (x_max - x_min)
		elif data < x_max and data >= (x_min + x_max) / 2:
			return 2 * (x_max - data) / (x_max - x_min)

	return list(map(normalization, datas))


def dataDirection_3(datas, x_min, x_max, x_minimum, x_maximum):
	def normalization(data):
		if data >= x_min and data <= x_max:
			return 1
		elif data <= x_minimum or data >= x_maximum:
			return 0
		elif data > x_max and data < x_maximum:
			return 1 - (data - x_max) / (x_maximum - x_max)
		elif data < x_min and data > x_minimum:
			return 1 - (x_min - data) / (x_min - x_minimum)

	return list(map(normalization, datas))

思考:不同的同向化方向的计算公式的设计思路本质上是源于对数据集群趋势的把握

构造归一化矩阵

设共有\(X\)个待评价对象,每个对象都有 个指标(属性),则原始数据矩阵构造为:
\(\left[\begin{matrix}x_{11} &x_{12} &\dots& x_{1m}\\ x_{21} & x_{22} &\dots& x_{2m}\\ \vdots & \vdots & \ddots & \vdots \\x_{n1} & x_{n2} & \dots &x_{nm}\end{matrix}\right]\)
构造加权规范矩阵,属性进行向量规范化,即每一行元素都除以当前向量的范数(使用余弦定理量度)
\(z_{ij}=\frac{x_{ij}}{\sum_{i=1}^n x_{ij}^2}\)
由此得到归一化处理后的标准化矩阵Z:
\(\left[\begin{matrix}z_{11} &z_{12} &\dots& z_{1m}\\ z_{21} & z_{22} &\dots& z_{2m}\\ \vdots & \vdots & \ddots & \vdots \\z_{n1} & z_{n2} & \dots &z_{nm}\end{matrix}\right]\)

确定最优方案和最劣方案

最优方案\(Z^+\)由\(Z\)中每列元素的最大值构成
最劣方案\(Z^-\)由\(Z\)中每列元素的最小值构成

计算各评价对象与最优方案、最劣方案的接近程度

\(D_i^+=\sqrt{\sum_{j=1}^mw_j(Z_j^+-z_{ij})^2}\),\(D_{ij}^-=\sqrt{\sum_{j=1}^mw_j(Z_j^--z_{ij})^2}\)
其中\(w_j\)为第j个属性的权重(重要程度),指标权重建议根据实际确定或使用专家评估方法。也可以用层次分析法(经验估计)和熵值法(数据估计)

计算各评价对象与最优方案的贴近程度 \(C_i\)

\(c_i=\frac{D_i^-}{D_i^++D_i^-}\)
\(0 \leq C_i \leq 1,C_i \to 1\)表明评价对象越优

根据\(C_i\)大小进行排序,给出评价结果

# -*- coding: utf-8 -*-
"""
Created on Mon Jun 20 20:54:04 2022

@author: Mashituo
"""
import numpy as np
import pandas as pd

#TOPSIS方法函数
def Topsis(A1):
    W0=[0.2,0.3,0.4,0.1] #权重矩阵
    W=np.ones([A1.shape[1],A1.shape[1]],float)
    for i in range(len(W)):
        for j in range(len(W)):
            if i==j:
                W[i,j]=W0[j]
            else:
                W[i,j]=0
    Z=np.ones([A1.shape[0],A1.shape[1]],float)
    Z=np.dot(A1,W) #加权矩阵
    
    #计算正、负理想解
    Zmax=np.ones([1,A1.shape[1]],float)
    Zmin=np.ones([1,A1.shape[1]],float)
    for j in range(A1.shape[1]):
        if j==3:
            Zmax[0,j]=min(Z[:,j])
            Zmin[0,j]=max(Z[:,j])
        else:
            Zmax[0,j]=max(Z[:,j])
            Zmin[0,j]=min(Z[:,j])

    #计算各个方案的相对贴近度C
    C=[]  
    for i in range(A1.shape[0]):
            Smax=np.sqrt(np.sum(np.square(Z[i,:]-Zmax[0,:])))
            Smin=np.sqrt(np.sum(np.square(Z[i,:]-Zmin[0,:])))
            C.append(Smin/(Smax+Smin))
    C=pd.DataFrame(C,index=['院校' + i for i in list('12345')])   
    return C

#标准化处理
def standard(A):
    #效益型指标
    A1=np.ones([A.shape[0],A.shape[1]],float)
    for i in range(A.shape[1]):
        if i==0 or i==2:
            if max(A[:,i])==min(A[:,i]):
                A1[:,i]=1
            else:
                for j in range(A.shape[0]):
                    A1[j,i]=(A[j,i]-min(A[:,i]))/(max(A[:,i])-min(A[:,i]))
    
    #成本型指标
        elif i==3:
            if max(A[:,i])==min(A[:,i]):
                A1[:,i]=1
            else:
                for j in range(A.shape[0]):
                    A1[j,i]=(max(A[:,i])-A[j,i])/(max(A[:,i])-min(A[:,i])) 

    #区间型指标
        else:
            a,b,lb,ub=5,6,2,12
            for j in range(A.shape[0]):
                if lb <= A[j,i] < a:
                    A1[j,i]=(A[j,i]-lb)/(a-lb)
                elif a <= A[j,i] < b:
                    A1[j,i]=1		
                elif b <= A[j,i] <= ub:
                    A1[j,i]=(ub-A[j,i])/(ub-b)
                else:  #A[i,:]< lb or A[i,:]>ub
                    A1[j,i]=0	
    return A1

#读取初始矩阵并计算
def data(file_path):
    data=pd.read_excel(file_path).values
    A=data[:,1:]
    A=np.array(A)
    #m,n=A.shape[0],A.shape[1] #m表示行数,n表示列数
    return A

#权重
A=np.array([[0.1,5,5000,4.7],[0.2,6,6000,5.6],[0.4,7,7000,6.7],[0.9,10,1000,2.3],[1.2,2,400,1.8]])
A1=standard(A)
C=Topsis(A1)
print(C)
import pandas as pd
import numpy as np


def topsis(data, weight=None):
	# 归一化
	data = data / np.sqrt((data ** 2).sum())

	# 最优最劣方案
	Z = pd.DataFrame([data.min(), data.max()], index=['负理想解', '正理想解'])

	# 距离
	weight = entropyWeight(data) if weight is None else np.array(weight)
	Result = data.copy()
	Result['正理想解'] = np.sqrt(((data - Z.loc['正理想解']) ** 2 * weight).sum(axis=1))
	Result['负理想解'] = np.sqrt(((data - Z.loc['负理想解']) ** 2 * weight).sum(axis=1))

	# 综合得分指数
	Result['综合得分指数'] = Result['负理想解'] / (Result['负理想解'] + Result['正理想解'])
	Result['排序'] = Result.rank(ascending=False)['综合得分指数']

	return Result, Z, weight

模糊评价法

指使用比较系统的,规范的方法对于多个指标,多个因素,多个维度,多个个体同时进行评价的方法,是一种总称,即:对多指标进行一系列有效方法的总称
评价的最重要的两个方面:一个是权重,一个是排名
模糊综合评价是基于模糊数学的一种分析方法,使用前一定要仔细考虑,具体说清楚

CRITICS方法

前面几种方法主要是基于数据本身产生的评价,而数据之间的波动大小也是一种信息,或者数据之间的大小关系也是一种信息,可利用数据波动性大小或数据相关关系大小计算权重

主成分分析法

主成分分析法基于矩阵的特征值分解,对于高维的数据A,假设维度为m,n,我们的目的是将其降为到(m',n')的维度上来
对原始数据的初始化需要有一定的预处理
1.数据的去中心化
\(A'=A-\overline{A}\)
2.求协方差矩阵
\(C=\frac{1}{m}A'^TA'\)

因子分析

数据包络分析

做一个六边形战士