问题

请问如何使用matlab进行垂直距离topsis方法操作?

回答
MATLAB实现垂直距离Topsis方法详解

Topsis(Technique for Order Preference by Similarity to Ideal Solution)是一种常用的多属性决策分析方法,其核心思想是寻找与理想解最接近、与负理想解最远的方案。垂直距离Topsis(Vertical Distance Topsis,VDTopsis)是Topsis方法的一个变种,它在计算方案与理想点和负理想点之间的距离时,考虑了决策矩阵的垂直方向上的信息,能够更精细地反映方案的优劣。

本文将详细介绍如何使用MATLAB实现垂直距离Topsis方法,并提供清晰的代码示例和操作步骤,帮助您掌握这一实用的决策分析工具。

1. VDTopsis 方法概述

VDTopsis 方法与传统Topsis方法在计算距离时的主要区别在于:

传统 Topsis: 计算的是方案与理想点/负理想点之间的欧氏距离。
VDTopsis: 在计算距离时,会考虑决策矩阵中各列(属性)的权重和贡献度,以及方案在垂直方向上的相对位置,从而得到更具区分度的距离度量。

VDTopsis 的基本步骤如下:

1. 构建决策矩阵: 收集所有待评估方案在各个评价指标上的数值。
2. 数据标准化: 由于不同指标的量纲和单位可能不同,需要对数据进行标准化处理,使其具有可比性。
3. 计算权重: 为每个评价指标赋予权重,反映其在决策过程中的重要程度。
4. 确定理想点和负理想点: 根据标准化后的矩阵和权重,确定最优值(理想点)和最劣值(负理想点)。
5. 计算方案与理想点/负理想点的垂直距离: 这是VDTopsis的核心步骤,会引入垂直距离的概念。
6. 计算相对接近度: 根据计算出的垂直距离,计算每个方案与理想点的相对接近度。
7. 方案排序: 根据相对接近度的高低对方案进行排序。

2. MATLAB 实现步骤与代码示例

下面我们将逐一介绍在MATLAB中实现VDTopsis方法的具体步骤,并提供详细的代码示例。

假设我们有以下一个简单的决策矩阵,需要评估三个方案(S1, S2, S3)在两个指标(C1, C2)上的表现:

| 方案 | C1 (越大越优) | C2 (越小越优) |
| : | : | : |
| S1 | 5 | 2 |
| S2 | 3 | 4 |
| S3 | 7 | 1 |

同时,我们假设两个指标的权重分别为 `w1 = 0.6` 和 `w2 = 0.4`。

步骤 1:构建决策矩阵

首先,在MATLAB中创建一个表示决策矩阵的变量。

```matlab
% 定义决策矩阵 (行是方案, 列是指标)
decision_matrix = [5, 2;
3, 4;
7, 1];

% 定义指标类型 (1表示越大越优, 0表示越小越优)
% 在这个例子中, C1越大越优, C2越小越优
indicator_types = [1, 0];

% 定义指标权重
weights = [0.6, 0.4];
```

步骤 2:数据标准化

为了消除不同指标量纲的影响,我们需要对数据进行标准化。常用的标准化方法有最大最小标准化、Zscore标准化等。这里我们采用最大最小标准化。

对于越大越优的指标: 标准化值 = (原始值 最小值) / (最大值 最小值)
对于越小越优的指标: 标准化值 = (最大值 原始值) / (最大值 最小值)

```matlab
% 获取矩阵的维度
[num_schemes, num_indicators] = size(decision_matrix);

% 初始化标准化矩阵
standardized_matrix = zeros(num_schemes, num_indicators);

% 进行数据标准化
for j = 1:num_indicators
col_data = decision_matrix(:, j); % 获取当前指标列数据

if indicator_types(j) == 1 % 越大越优
min_val = min(col_data);
max_val = max(col_data);
% 防止除以零,如果所有值都相同
if max_val min_val == 0
standardized_matrix(:, j) = 1; % 或者0,取决于你的处理逻辑
else
standardized_matrix(:, j) = (col_data min_val) / (max_val min_val);
end
elseif indicator_types(j) == 0 % 越小越优
min_val = min(col_data);
max_val = max(col_data);
% 防止除以零
if max_val min_val == 0
standardized_matrix(:, j) = 1; % 或者0,取决于你的处理逻辑
else
standardized_matrix(:, j) = (max_val col_data) / (max_val min_val);
end
end
end

disp('标准化矩阵:');
disp(standardized_matrix);
```

步骤 3:计算加权标准化矩阵

将标准化后的矩阵与对应的权重相乘,得到加权标准化矩阵。

```matlab
% 计算加权标准化矩阵
weighted_standardized_matrix = standardized_matrix . weights;

disp('加权标准化矩阵:');
disp(weighted_standardized_matrix);
```

步骤 4:确定理想点和负理想点

根据加权标准化矩阵,确定每列的最大值作为理想点(正理想点),最小值作为负理想点(负理想点)。

```matlab
% 确定正理想解 (A+) 和负理想解 (A)
positive_ideal_solution = max(weighted_standardized_matrix, [], 1);
negative_ideal_solution = min(weighted_standardized_matrix, [], 1);

disp('正理想解 (A+):');
disp(positive_ideal_solution);
disp('负理想解 (A):');
disp(negative_ideal_solution);
```

步骤 5:计算方案与理想点/负理想点的垂直距离

这是VDTopsis的核心所在。对于每个方案 $i$ 和每个指标 $j$,其与正理想点 $A^+$ 的垂直距离 $d_{i,j}^+$ 和与负理想点 $A^$ 的垂直距离 $d_{i,j}^$ 计算如下:

垂直距离到正理想点: $d_{i,j}^+ = |w_j cdot v_{ij} w_j cdot v_{j}^+| $
垂直距离到负理想点: $d_{i,j}^ = |w_j cdot v_{ij} w_j cdot v_{j}^| $

其中,$w_j$ 是指标 $j$ 的权重,$v_{ij}$ 是方案 $i$ 在指标 $j$ 上的标准化值,$v_{j}^+$ 是正理想点在指标 $j$ 上的值,$v_{j}^$ 是负理想点在指标 $j$ 上的值。

然后,将每个方案在所有指标上的垂直距离加权求和,得到方案与理想点和负理想点的总垂直距离。

```matlab
% 初始化用于存储垂直距离的矩阵
positive_vertical_distance_matrix = zeros(num_schemes, num_indicators);
negative_vertical_distance_matrix = zeros(num_schemes, num_indicators);

% 计算每个方案与正负理想点的垂直距离
for i = 1:num_schemes
for j = 1:num_indicators
% 垂直距离到正理想点
positive_vertical_distance_matrix(i, j) = abs(weighted_standardized_matrix(i, j) positive_ideal_solution(j));
% 垂直距离到负理想点
negative_vertical_distance_matrix(i, j) = abs(weighted_standardized_matrix(i, j) negative_ideal_solution(j));
end
end

% 计算每个方案的总垂直距离到正理想点和负理想点
% VDTopsis 通常是将各指标的垂直距离加权求和
% 注意:这里的“垂直距离”概念在不同的VDTopsis文献中可能略有不同。
% 一种常见的解释是将标准化值与理想值的差值乘以权重。
% 如果您有特定的VDTopsis公式,请在此处进行调整。
% 以下示例是基于对“垂直距离”的一种常见理解的实现。

% 这里我们直接使用 weighted_standardized_matrix 与 ideal/negative_ideal_solution 的差值的绝对值

% 计算方案到正理想点的总垂直距离
total_positive_vertical_distance = sum(positive_vertical_distance_matrix, 2);

% 计算方案到负理想点的总垂直距离
total_negative_vertical_distance = sum(negative_vertical_distance_matrix, 2);

disp('方案到正理想点的垂直距离矩阵:');
disp(positive_vertical_distance_matrix);
disp('方案到负理想点的垂直距离矩阵:');
disp(negative_vertical_distance_matrix);

disp('每个方案到正理想点的总垂直距离:');
disp(total_positive_vertical_distance);
disp('每个方案到负理想点的总垂直距离:');
disp(total_negative_vertical_distance);
```

关于“垂直距离”的进一步解释:

在Topsis方法中,计算距离(通常是欧氏距离)的公式为:
$D_i^+ = sqrt{sum_{j=1}^n (w_j cdot v_{ij} w_j cdot v_j^+)^2}$

VDTopsis 的一个核心思想是,它不直接对距离进行平方和再开方,而是更关注指标层面的贡献和偏差。 在某些VDTopsis的定义中,它可能指的是:

1. 指标层面的加权偏差: $|w_j cdot v_{ij} w_j cdot v_j^+|$
2. 考虑垂直方向的投影: 这可能涉及到更复杂的几何解释,例如在权重空间中的投影。

在上面的MATLAB代码中,我们采用了方案在每个指标上加权后的标准化值与该指标的理想值(或负理想值)的绝对差值。这可以被理解为方案在每个指标方向上与理想状态的“垂直”偏差,并且这个偏差已经被其权重进行了调整。

如果您的VDTopsis方法有更具体的数学公式,请务必根据公式调整计算距离的部分。 例如,如果您的VDTopsis将指标权重直接加到距离计算中(如上面代码所示的 `abs(weighted_standardized_matrix(i, j) positive_ideal_solution(j))`),那么这就是一个有效的实现。

步骤 6:计算相对接近度

相对接近度是衡量方案与理想解的接近程度的指标。在VDTopsis中,它通常根据方案到理想点的距离和到负理想点的距离来计算。一种常见的计算方式为:

$CI_i = frac{D_i^}{D_i^+ + D_i^}$

其中,$CI_i$ 是方案 $i$ 的相对接近度,$D_i^$ 是方案 $i$ 到负理想点的总垂直距离,$D_i^+$ 是方案 $i$ 到正理想点的总垂直距离。

```matlab
% 计算相对接近度 (CI)
% 防止分母为零的情况
relative_closeness = zeros(num_schemes, 1);
for i = 1:num_schemes
if (total_positive_vertical_distance(i) + total_negative_vertical_distance(i)) == 0
relative_closeness(i) = 0; % 或者一个特殊值,表示无法计算
else
relative_closeness(i) = total_negative_vertical_distance(i) / (total_positive_vertical_distance(i) + total_negative_vertical_distance(i));
end
end

disp('方案的相对接近度 (CI):');
disp(relative_closeness);
```

步骤 7:方案排序

根据计算出的相对接近度对方案进行排序。相对接近度越高的方案越优。

```matlab
% 对方案进行排序
% 将方案索引与相对接近度组合起来
scheme_scores = [ (1:num_schemes)', relative_closeness ];

% 按相对接近度降序排序 (分数越高越好)
sorted_schemes = sortrows(scheme_scores, 2, 'descend');

disp('方案排序结果 (方案索引, 相对接近度):');
disp(sorted_schemes);

fprintf('最优方案是方案 %d,其相对接近度为 %.4f。 ', sorted_schemes(1, 1), sorted_schemes(1, 2));
```

3. 完整的MATLAB代码

将以上所有代码块整合在一起,就构成了一个完整的VDTopsis实现函数。

```matlab
function sorted_schemes = vertical_distance_topsis(decision_matrix, indicator_types, weights)
% vertical_distance_topsis: 使用垂直距离方法对方案进行排序
%
% 输入:
% decision_matrix: 决策矩阵 (行是方案, 列是指标)
% indicator_types: 指标类型向量 (1表示越大越优, 0表示越小越优)
% weights: 指标权重向量
%
% 输出:
% sorted_schemes: 排序后的方案结果 (包括方案索引和相对接近度,按降序排列)

[num_schemes, num_indicators] = size(decision_matrix);

% 步骤 2: 数据标准化
standardized_matrix = zeros(num_schemes, num_indicators);
for j = 1:num_indicators
col_data = decision_matrix(:, j);

if indicator_types(j) == 1 % 越大越优
min_val = min(col_data);
max_val = max(col_data);
if max_val min_val == 0
standardized_matrix(:, j) = 1;
else
standardized_matrix(:, j) = (col_data min_val) / (max_val min_val);
end
elseif indicator_types(j) == 0 % 越小越优
min_val = min(col_data);
max_val = max(col_data);
if max_val min_val == 0
standardized_matrix(:, j) = 1;
else
standardized_matrix(:, j) = (max_val col_data) / (max_val min_val);
end
end
end

% 步骤 3: 计算加权标准化矩阵
weighted_standardized_matrix = standardized_matrix . weights;

% 步骤 4: 确定理想点和负理想点
positive_ideal_solution = max(weighted_standardized_matrix, [], 1);
negative_ideal_solution = min(weighted_standardized_matrix, [], 1);

% 步骤 5: 计算方案与理想点/负理想点的垂直距离
positive_vertical_distance_matrix = zeros(num_schemes, num_indicators);
negative_vertical_distance_matrix = zeros(num_schemes, num_indicators);

for i = 1:num_schemes
for j = 1:num_indicators
% VDTopsis 的一个常见距离计算方式:加权标准化值与理想值的差的绝对值
positive_vertical_distance_matrix(i, j) = abs(weighted_standardized_matrix(i, j) positive_ideal_solution(j));
negative_vertical_distance_matrix(i, j) = abs(weighted_standardized_matrix(i, j) negative_ideal_solution(j));
end
end

% 计算每个方案的总垂直距离
total_positive_vertical_distance = sum(positive_vertical_distance_matrix, 2);
total_negative_vertical_distance = sum(negative_vertical_distance_matrix, 2);

% 步骤 6: 计算相对接近度
relative_closeness = zeros(num_schemes, 1);
for i = 1:num_schemes
denominator = total_positive_vertical_distance(i) + total_negative_vertical_distance(i);
if denominator == 0
relative_closeness(i) = 0; % 避免除以零
else
relative_closeness(i) = total_negative_vertical_distance(i) / denominator;
end
end

% 步骤 7: 方案排序
scheme_scores = [ (1:num_schemes)', relative_closeness ];
sorted_schemes = sortrows(scheme_scores, 2, 'descend'); % 按相对接近度降序排列

% 输出结果展示 (可选,可在调用函数时自行打印)
disp(' VDTopsis 分析结果 ');
disp('标准化矩阵:');
disp(standardized_matrix);
disp('加权标准化矩阵:');
disp(weighted_standardized_matrix);
disp('正理想解 (A+):');
disp(positive_ideal_solution);
disp('负理想解 (A):');
disp(negative_ideal_solution);
disp('方案到正理想点的总垂直距离:');
disp(total_positive_vertical_distance);
disp('方案到负理想点的总垂直距离:');
disp(total_negative_vertical_distance);
disp('方案的相对接近度 (CI):');
disp(relative_closeness);
disp('方案排序结果 (方案索引, 相对接近度):');
disp(sorted_schemes);
fprintf('最优方案是方案 %d,其相对接近度为 %.4f。 ', sorted_schemes(1, 1), sorted_schemes(1, 2));
disp('');

end % 函数结束

% 如何调用该函数
% 假设您将上面的代码保存为 'vertical_distance_topsis.m' 文件

% % 定义您的数据
% decision_matrix_data = [5, 2;
% 3, 4;
% 7, 1];
% indicator_types_data = [1, 0]; % C1越大越优, C2越小越优
% weights_data = [0.6, 0.4];
%
% % 调用函数进行分析
% sorted_results = vertical_distance_topsis(decision_matrix_data, indicator_types_data, weights_data);
%
% % sorted_results 变量将包含排序好的方案及其对应的相对接近度
```

4. 关键点和注意事项

VDTopsis 公式的变种: 需要强调的是,关于“垂直距离”在Topsis方法中的具体数学定义可能存在不同的版本。本文提供了一种基于加权差值的实现,这是一种常见且易于理解的解释。在实际应用中,请确保您使用的VDTopsis公式与您所参考的文献或标准一致。如果您有更具体的VDTopsis公式,请务必根据公式调整第 5 步中的距离计算方式。
数据标准化: 选择合适的标准化方法对于多属性决策至关重要。最大最小标准化是最常用的方法之一,但也可能受到异常值的影响。
指标权重: 指标权重的确定是决策过程中的关键环节。权重可以由专家主观确定,也可以通过客观赋权方法(如熵权法、CRITIC法等)计算得出。
处理极端情况: 在标准化过程中,如果某指标的所有值都相同(最大值等于最小值),则会出现除以零的情况。代码中对这种情况进行了简单的处理(赋予标准化值为1),但您可能需要根据具体场景调整处理逻辑。同样,在计算相对接近度时,也要注意分母为零的情况。
MATLAB 代码的可读性: 良好的代码注释和清晰的变量命名有助于理解和维护代码。

通过上述详细的步骤和代码示例,您可以有效地使用MATLAB来实现垂直距离Topsis方法,并应用于实际的决策分析场景中。如果您在操作过程中遇到任何问题,或者需要更复杂的VDTopsis变种的实现,请随时提出。

网友意见

user avatar

不大明白你说的垂直距离是啥意思?

上面讲了topsis流程。

核心的步骤就是 从规范化矩阵N到 正理想解与负理解的这个步骤。

一言以蔽之,这个步骤就是 带权值的距离公式。

你说的垂直距离不知道指的是哪个距离公式。

这种距离公式可以说有无数种。

你可能说的是马氏距离公式。

另外一种用TOPSIS有高级一点的版本。

上面是计算过程。流程图如下:

换言之你是求Pa Qa对应的矩阵。 其中K+ 跟K-就是所谓分维求距离。

上面是一种更复杂的降维过程。

核心就是 N矩阵到 K 的两个矩阵。

最后请明确一下你问的垂直距离是什么意思?

第一、是不是马氏距离公式?

第二、是不是只求每个分维的正负理想点的距离。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有