综合评价类方法是数学建模中常用的方法,主要作用是对多组数据赋权,算是非常万金油的办法。网上有很多封装好的软件可以实现综合评价,但是欠缺一定的灵活性,在这里我们尝试用python实现综合评价。
  综合评价方法分为主观型综合评价方法和客观型综合评价方法,我们在此尝试两类综合评价方法中的几个典型方法:

  各种综合评价方法在此不多介绍原理,我们直接放代码实现(水平有限,代码有些冗长):

AHP

  在实现AHP代码前需要先对各个指标做专家评分,层次分析图示如下:

  代码如下实现如下:

def ahp(data, rows, columns):f_score = read_file(feature_score, 0)  # 专家对各项指标的重要度评分存储在feature_score中# print(评分:f_score)f_score = f_score.prod(axis=1)f_score = np.power(f_score, 1/2)W = f_score/sum(f_score)            # 计算权重# print("权重:\n", W)score = datafor i in range(rows):for j in range(columns):score[i][j] = score[i][j]*W[i]     # 计算分数score = score.sum(axis=0)weight.append(W.tolist())return score

熵权法TOPSIS

  代码如下:

def E_j_fun(data, rows, columns):  #计算熵值E = np.array([[None] * columns for i in range(rows)])   # 新建空矩阵for i in range(rows):for j in range(columns):if data[i][j] == 0:e_ij = 0.0else:P_ij = data[i][j] / data.sum(axis=0)[j]  # 计算比重(列求和)e_ij = (-1 / np.log(rows)) * P_ij * np.log(P_ij)E[i][j] = e_ij# print(E)E_j=E.sum(axis=0)       # 求出每列信息熵(指标)列求和return E_jdef topsis(data, rows, columns):        # topsis综合评价Z_ij = np.array([[None] * columns for i in range(rows)])   # 新建空矩阵(加权标准化矩阵)E_j = E_j_fun(data, rows, columns)       # 第j个指标的信息熵# print(E_j)G_j = 1-E_j               # 信息差异度矩阵# print(G_j)W_j = G_j/sum(G_j)        # 计算权重for i in range(rows):for j in range(columns):Z_ij[i][j] = data[i][j] * W_j[j]Imax_j = Z_ij.max(axis=0)  # 最优解Imin_j = Z_ij.min(axis=0)  # 最劣解Dmax_ij = np.array([[None] * columns for i in range(rows)])Dmin_ij = np.array([[None] * columns for i in range(rows)])for i in range(rows):for j in range(columns):Dmax_ij[i][j] = (Imax_j[j] - Z_ij[i][j]) ** 2Dmin_ij[i][j] = (Imin_j[j] - Z_ij[i][j]) ** 2Dmax_i = Dmax_ij.sum(axis=1) ** 0.5  # 最优解欧氏距离Dmin_i = Dmin_ij.sum(axis=1) ** 0.5  # 最劣解欧氏距离C_i = Dmin_i / (Dmax_i + Dmin_i)  # 综合评价值weight.append(W_j.tolist())# print(C_i)return C_i

熵权法综合评价

  代码如下:

def E_evalution(data, rows, columns):        # 熵权法综合评价Z_ij = np.array([[None] * columns for i in range(rows)])  # 新建空矩阵(加权标准化矩阵)E_j = E_j_fun(data, rows, columns)  # 第j个指标的信息熵G_j = 1 - E_j  # 信息差异度矩阵W_j = G_j / (columns - sum(G_j))  # 计算权重for i in range(rows):for j in range(columns):Z_ij[i][j] = data[i][j] * W_j[j]ret = Z_ij.sum(axis=1)weight.append(W_j.tolist())# print("ret", ret)return ret

CRITIC

  代码如下:

def critic(data, rows, columns):Z_ij = np.array([[None] * rows for i in range(columns)])data_std = np.std(data, axis=1, ddof=1)# print(data_std)data_rela = np.corrcoef(data)data_rela = data_rela.sum(axis=1)# print(data_std, "\n", data_rela)        # 样本标准差(n-1)C_i = data_rela * data_std              # 矩阵点乘W_i = C_i/sum(C_i)# print(W_i)for i in range(columns):for j in range(rows):Z_ij[i][j] = data[i][j] * W_i[i]ret = Z_ij.sum(axis=0)# print(ret)weight.append(W_i.tolist())return ret

因子分析

  代码如下:

def factor(data, columns, rows):df2_corr = np.corrcoef(data.T)  # 皮尔逊相关系数kmo = calculate_kmo(data)  # kmo值要大于0.7bartlett = calculate_bartlett_sphericity(data)  # bartlett球形度检验p值要小于0.05print('kmo:{},bartlett:{}'.format(kmo[1], bartlett))# 使用最大方差法旋转因子载荷矩阵fa = FactorAnalyzer(n_factors=rows, rotation='varimax', method='principal', impute='mean')fa.fit(data)fa_sd = fa.get_factor_variance()        # 得到贡献率fa_sd[1]fa_rotate = FactorAnalyzer(rotation='varimax', n_factors=rows, method='principal')fa_rotate.fit(data)# 查看旋转后的因子载荷# print("\n旋转后的因子载荷矩阵:\n", fa_rotate.loadings_)# 因子得分(回归方法)(系数矩阵的逆乘以因子载荷矩阵)X1 = np.mat(df2_corr)X1 = nlg.inv(X1)factor_score = np.dot(X1, fa_rotate.loadings_)# print("\n因子得分(每个样本的因子权重):\n", factor_score)fa_t_score = np.dot(np.matrix(data), np.matrix(factor_score))# print("\n样本的因子得分:\n", pd.DataFrame(fa_t_score))# 综合得分(加权计算)fa_t_score = np.dot(fa_t_score, fa_sd[1]) / sum(fa_sd[1])weight .append((fa_sd[1] / sum(fa_sd[1])).tolist())return np.array(fa_t_score)[0]

主函数

  代码如下:

def main():data = read_file(path, 1)      # 读取excel并保存# print("源数据", data)for i in range(6, 13):data[i] = 1-data[i]/data[i].max()Standard_data = Normalization(data)      # 对每一列最大最小归一化数据rows = Standard_data.shape[0]columns = Standard_data.shape[1]# 客观ret_topsis = topsis(Standard_data.T, columns, rows)ret_E = E_evalution(Standard_data.T, columns, rows)ret_critic = critic(Standard_data, columns, rows)ret_factor = factor(Standard_data.T, columns, rows)# 主观ret_ahp = ahp(Standard_data, rows, columns)# 合并result = np.dstack((ret_ahp, ret_topsis, ret_E, ret_critic, ret_factor))if __name__ == '__main__':main()

结果可视化


  可以看出AHP效果不佳,分析发现主要原因是专家评分不合理,我们后期还可以继续修正。
  图中的Subjective,Objective,Final Score是联合模型的结果,联合方法见此博客:https://blog.csdn.net/Hjh1906008151/article/details/123431230

多种综合评价方法的python实现相关推荐

  1. 斐波那契数列 (Fibonacci) 多种实现方法(Python)与详细介绍

    斐波那契数列 Fibonacci Sequence 本文介绍了多种方式得到斐波那契数列或斐波那契数.斐波那契数列也称为"兔子数列".来源于兔子繁殖的预测.它的重要性体现在相邻两数之 ...

  2. python switch语句的多种实现方法

    python switch语句的多种实现方法 说明:  - python中没有switch关键字   - 定义 字典  - 调用 字典的get(key)获取对应的表达式 1,实现switch的一般方式 ...

  3. 运用Python进行TOPSIS综合评价方法

    运用Python进行TOPSIS综合评价方法 第一步,读取数据: 第二步,对数据进行趋同化: 第三步,对数据进行归一化: 第四步,获取最优列值向量和最劣值向量: 第五步,计算最优方案和最劣方案: 第六 ...

  4. 数学建模--综合评价方法

    综合评价方法 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮 ...

  5. SPSSAU综合评价方法汇总

    综合评价是对某事物进行多指标综合评价的过程,是一种科学研究和科学决策的过程.一般应当包括指标体系设计.收集资料.整理资料和统计分析几个阶段. 简单从分析角度来讲,综合评价方法步骤主要包括:确定指标体系 ...

  6. python任意输入一个正整数、判断该数是否为素数_Python编程判断一个正整数是否为素数的方法,python素数...

    Python编程判断一个正整数是否为素数的方法,python素数 本文实例讲述了Python编程判断一个正整数是否为素数的方法.分享给大家供大家参考,具体如下: import string impor ...

  7. 复合数值积分方法以及Python程序实现

    ■ 前言 在 Composite Numerical Integration 中给出了三种复合数值积分方法它们分别是: Newton-Cotes Formulas 01三种方法的公式及其Python程 ...

  8. 用Alpha生成Trimp图的方法(python)

    用Alpha生成Trimp图的方法(python) 文章目录: 一.Alpha图生成Trump图(方法一) 二. 一.Alpha图生成Trump图(方法一) __Author__ = 'Shliang ...

  9. python 取反_自从用了这招pandas 空数据处理方法,python编程速度提升了不少

    今天为大家带来的内容是:自从用了这招pandas 空数据处理方法,python编程速度提升了不少 文章内容主要介绍了pandas 空数据处理方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工 ...

最新文章

  1. redis-高级特性
  2. python输入一个列表的语句_python自学笔记使用if语句处理列表作业
  3. c语言密码程序返回,想程序高手求助--用C语言来编辑一个输入密码的程序
  4. linux服务端口加密,linux – 如何通过单个端口处理加密和未加密的http连接
  5. bundle + forever部署Meteor App
  6. MySQL和数据库可视化工具的下载与安装
  7. 生物信息学_分子数据库(二)核酸
  8. Vue 实现电子签名
  9. Excel快速合并,简单方法,轻松搞定!
  10. 去除百度搜索列表中广告的方法-电脑端
  11. Android 布局优化方案
  12. Vue Devtools下载使用
  13. Android光线传感器
  14. oracle 数据库导入导出文章
  15. 图像梯度特征的常用算子:Sobel、Prewitt、Roberts
  16. png转jpg背景颜色改变的问题
  17. 解决no matching host key type found. Their offer: ssh-rsa报错信息具体方法
  18. 写javaEE初学者的我
  19. 秋招寒冬不如换个思维——试试中小厂
  20. Single TPR论文解读

热门文章

  1. 丝雨学姐小灶班——Week 6
  2. Quartus 工程中移除signaltap的方法
  3. miniblink载入html,miniblink使用小结
  4. 后台是怎么判断管理员用户还是普通用户_用户浏览器被阿里私自【托管】?仔细一查,这事并不简单...
  5. C#——String.IndexOf方法与Array.IndexOf方法的异同
  6. ZOJ1654.Place the Robots放置机器人——最大独立集
  7. 在ios中无法获取ajax返回数据类型,在iOS10系统中微信后退无法发起ajax请求的问题解决办法...
  8. 剑指Offer13_机器人的运动范围
  9. Mac 无法读外置 USB 硬件解决方法
  10. 利用jsdelivr创建免费的CDN