清风数学建模学习笔记——Topsis法

数模评价类(2)——Topsis法

概述

Topsis:Technique for Order Preference by Similarity to Ideal Solution

也称优劣解距离法,该方法的基本思想是,通过计算每个备选方案与理想解和负理想解之间的距离,从而评估每个方案的优劣。

案例

已知下列20条河流几项指标数据,指标有含氧量、PH值、细菌总数、植物性营养物量,试对20条河流的水质进行评价和排序。

在这里插入图片描述

思考:适不适合使用层次分析法进行评价?

答:不适合。原因:1、决策层的方案数为20>15,很难构造通过一致性检验的判断矩阵,并且一致性检验中RI可查的最大n为15;2、若使用层次分析法,没有充分利用已知方案各向指标数据进行评价。

数据集基本概念:

如案例中所给数据表格构成一个典型的数据集,每一行代表一个记录/数据项/对象,

第一列构成索引列(index),除每一列外每一列代表一个指标/特征

Topsis步骤

Step1:正向化处理

指标分类:

在这里插入图片描述

在该案例中,极大型:含氧量,极小型:细菌含量,中间型:PH值,区间型:营养量

正向化处理即将所有指标转化为极大型指标

符号说明:x代表数据集中对应特征的一列, x i x_i xi表示该列第i行元素

极小型->极大型
x i ^ = m a x { x } − x i \hat{x_{i}}=max\{x\}-x_{i}\\ xi^=max{x}xi
如果所有元素为正数,可取倒数实现正向化

中间型->极大型
x i ^ = 1 − x i − x b e s t m a x { x i − x b e s t } \hat{x_i}=1-\frac{x_i-x_{best}}{max\{x_i-x_{best}\}} xi^=1max{xixbest}xixbest
在这里插入图片描述

注:这种正向化处理将数据值映射到[0,1],数据越趋近中间理想值,映射值越趋近于1

区间型->极大型

在这里插入图片描述

注:区间型指标正向化需考虑左右两侧,类似中间型指标的正向化方法,当两侧值越趋近理想趋近边界值时,映射值越趋近于1

Step2:正向化矩阵标准化

标准化处理是矩阵预处理中基础性的步骤,其目的是消除不同指标量纲的影响,这里采用向量归一化(也称为L2正则化,即将每一列向量转化为单位特征列向量)

在这里插入图片描述

Step3:计算得分并归一化

Topsis优劣解的核心思想就是先确定两个正(负)理想的数据向量,然后将每个对象数据向量对其评分。由于我们已经将所有指标正向化,因此抽出每一列的最大值构成最大值向量 Z + Z_{+} Z+,抽出每一列的最小值构成最小值向量 Z − Z_{-} Z,对于每个评价对象数据向量 Z i Z_i Zi,我们可以用向量距离公式计算 Z i Z_i Zi Z + Z_{+} Z+ Z − Z_{-} Z​的距离 D i + 和 D i − D_i^{+}和D_i^{-} Di+Di,然后得到每个对象未归一化的评分
S i = D i − D i − + D i + S_i=\frac{D_i^{-}}{D_i^{-}+D_i^{+}} Si=Di+Di+Di
在这里插入图片描述

归一化后就得到各对象最终评分

考虑指标权重系数,对算法进行修改

在这里插入图片描述

权重系数可由构造判断矩阵法得到,也可以由熵权法【后续讨论】得到

运行python代码结果:

在这里插入图片描述

简要分析结果可知I、J、K河流水质最好,N河流水质明显最差

以下是使用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、付费专栏及课程。

余额充值