数学建模-评价模型
评价模型
层次分析法
简称AHP,是一种定性和定量结合的、系统化的、层次化的分析方法,用来处理复杂的决策问题,比如从多种方案中选择一种最优的
层次分析法四步骤:
①分析系统中各因素之间的关系,建立系统层次(从上到下画出目标曾准则层,方案层)
对于准则层的构建,通常需要查阅大量的文献,以及为什么选择这些变量,这些是说理和谁论文的大户。
②对同一层次中的各个元素进行两两比较,构建成对比较矩阵(准则层的比较矩阵和方案层的比较矩阵)
③计算各层次比较矩阵中各元素的相对权重,对比较矩阵的一致性检验:
RI-CI检验(一致性检验)
对比较矩阵进行特征值分解,最大的特征值为lambda,那么定义CI:
另外定义RI表格(随机实验统计规律)
另外定义RI表格,并计算CR:
一般当一致性比率
④计算整个系统下的合成权重,并计算被评价对象的总分
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重新构造")
熵权法
是一种客观赋权方法,在具体使用过程中,根据各个指标的分散程度,利用信息熵计算出各个指标的熵权,再根据各指标对熵权进行一定的修正,从而得到较为客观的指标权重
数据标准化:
将各个指标进行标准化处理
越大越好的:
越小越好的:
标准化之后归一化:
归一化方法不唯一,以下提供最简单的比值归一化,实际上也可以使用上文中的向量归一化方法
如果
求解信息熵:(变量信息熵)
得到权值:
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法使用距离来量度样本差距,使用距离尺度就需要对指标进行同向化处理(如果一个维度的数据越大越好,另一个维度的数据越小越好,会造成尺度混乱)。通常采用成本型指标向效益型指标转化(即数值评价越高,事实上几乎所有的评价方法都需要进行转化),此外,如果需要使用雷达图进行展示,建议此处将所有的数据都变成正数。
指标属性同向化,一般选择指标正向化
极小型指标:期望指标越小越好(如患病率,死亡率等)
或
中间型指标:期望指标值既不要太大也不要太小,适当取中间值最好(如水质量评估 PH 值)
换言之,即:
其中
区间型指标:期望指标的取值最好落在某一个确定的区间最好(如体温)
其中[a,b]为指标x的最佳稳定区间,[
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))
思考:不同的同向化方向的计算公式的设计思路本质上是源于对数据集群趋势的把握
构造归一化矩阵
设共有
构造加权规范矩阵,属性进行向量规范化,即每一行元素都除以当前向量的范数(使用余弦定理量度)
由此得到归一化处理后的标准化矩阵Z:
确定最优方案和最劣方案
最优方案
最劣方案
计算各评价对象与最优方案、最劣方案的接近程度
其中
计算各评价对象与最优方案的贴近程度
根据 大小进行排序,给出评价结果
# -*- 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.数据的去中心化
2.求协方差矩阵
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!