数模学习笔记(二)——TOPSIS模型

模型介绍

TOPSIS法(Technique for Order Preference by Similarity to Ideal Solution)
可翻译为逼近理想解排序法,国内常简称为优劣解距离法,TOPSIS 法是一种常用的综合评价方法,其能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。
适用情况:
(1)比较的对象一般要远大于两个。(例如比较一个班级的成绩)
(2)比较的指标也往往不只是一个方面的,例如成绩、工时数、课
外竞赛得分等。
(3)有很多指标不存在理论上的最大值和最小值,例如衡量经济增
长水平的指标:GDP增速。

步骤

基本过程

基本过程为先将原始数据矩阵统一指标类型(一般正向化处理)
得到正向化的矩阵,再对正向化的矩阵进行标准化处理以消除各指
标量纲的影响,并找到有限方案中的最优方案和最劣方案,然后分
别计算各评价对象与最优方案和最劣方案间的距离,获得各评价对
象与最优方案的相对接近程度,以此作为评价优劣的依据。该方法
对数据分布及样本含量没有严格限制,数据计算简单易行。

第一步:将原始矩阵正向化

常见四种指标
极大型(效益型)指标:越大(多)越好,如:成绩、GDP增速、企业利润
极小型(成本型)指标 :越小(少)越好,如:费用、坏品率、污染程度
中间型指标:越接近某个值越好,如:水质量评估时的PH值
区间型指标:落在某个区间最好,如:体温、水中植物性营养物量

所谓的将原始矩阵正向化,就是要将所有的指标类型统一转化为
极大型指标。(转换的函数形式可以不唯一哦~ )

极小型指标 → 极大型指标

极小型指标转换为极大型指标的公式:max - x
如果所有的元素均为正数,那么也可以使用 1/x
**注意:**正向化的公式不唯一,可以结合自己的数据进行适当的修改。
在这里插入图片描述
例:
在这里插入图片描述

中间型指标 → 极大型指标

中间型指标:指标值既不要太大也不要太小,取某特定值最好(如水质量评估 PH 值)
在这里插入图片描述

区间型指标 → 极大型指标

区间型指标:指标值落在某个区间内最好,例如人的体温在36°~37°这个区间比较好。
在这里插入图片描述

第二步:正向化矩阵标准化

标准化的目的是消除不同指标量纲的影响。
在这里插入图片描述
注意:标准化的方法有很多种,其主要目的就是去除量纲的影响,未来我们还可能见到更多
种的标准化方法,例如:(x‐x的均值)/x的标准差;具体选用哪一种标准化的方法在多数情况下
并没有很大的限制,这里我们采用的是前人的论文中用的比较多的一种标准化方法。

第三步:计算得分并归一化

只有一个指标的情况
在这里插入图片描述
类比只有一个指标的情况
在这里插入图片描述
带权重的TOPSIS
上面的方法没有考虑指标的权重,下面时带权重情况的计算方法
在这里插入图片描述
在这里插入图片描述
可以使用层次分析法给这m个指标确定权重
在这里插入图片描述

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C++实现TOPSIS法的代码: ``` #include <iostream> #include <cmath> using namespace std; const int MAXN = 100; const int MAXM = 100; double a[MAXN][MAXM], b[MAXM]; double w[MAXM], maxn[MAXM], minn[MAXM]; double d[MAXN], s[MAXN]; int n, m; void topsis() { // Step 1: Normalize the decision matrix for (int j = 0; j < m; j++) { maxn[j] = 0; minn[j] = 1e9; for (int i = 0; i < n; i++) { maxn[j] = max(maxn[j], a[i][j]); minn[j] = min(minn[j], a[i][j]); } w[j] = 1 / (maxn[j] - minn[j] + 1e-8); for (int i = 0; i < n; i++) { a[i][j] = w[j] * (a[i][j] - minn[j]); } } // Step 2: Calculate the ideal solution and negative ideal solution for (int j = 0; j < m; j++) { maxn[j] = 0; minn[j] = 1e9; for (int i = 0; i < n; i++) { maxn[j] = max(maxn[j], a[i][j]); minn[j] = min(minn[j], a[i][j]); } } // Step 3: Calculate the Euclidean distance between each alternative and the ideal solution for (int i = 0; i < n; i++) { d[i] = 0; for (int j = 0; j < m; j++) { d[i] += (a[i][j] - maxn[j]) * (a[i][j] - maxn[j]); } d[i] = sqrt(d[i]); } // Step 4: Calculate the Euclidean distance between each alternative and the negative ideal solution for (int i = 0; i < n; i++) { s[i] = 0; for (int j = 0; j < m; j++) { s[i] += (a[i][j] - minn[j]) * (a[i][j] - minn[j]); } s[i] = sqrt(s[i]); } // Step 5: Calculate the relative closeness to the ideal solution for (int i = 0; i < n; i++) { b[i] = s[i] / (s[i] + d[i]); } } int main() { cin >> n >> m; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> a[i][j]; } } topsis(); for (int i = 0; i < n; i++) { cout << b[i] << endl; } return 0; } ``` 其中,`a`为决策矩阵,`w`为权重向量,`maxn`和`minn`分别表示每列的最大值和最小值,`d`为每个样本到理想点的距离,`s`为每个样本到负理想点的距离,`b`为每个样本的相对接近度。首先进行数据标准化,然后计算理想点和负理想点,最后计算每个样本的相对接近度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值