一、层次分析法
层次分析法(Analytic Hierarchy Process,简称 AHP)是一种将与决策总是有关的元素分解成目标、准则、方案等层次,在此基础上进行定性和定量分析的决策方法,常用于评价类问题的打分。
1.首先要确定层次结构
- 评价的目标:明确具体的评价目标,如评估不同产品的综合性能、选择最佳的投资方案等,设为
。
- 评价的标准:确定用于衡量目标达成程度的标准,如产品质量、成本、市场需求等,记为
。
- 可选的方案:列出可供选择的具体方案,如不同品牌的产品、不同的投资项目等,记为
。
2.画出层次结构图:确定目标层,准则层,方案层
在论文或报告中,需清晰展示层次结构,将评价目标置于顶层,即目标层;将评价标准置于中间层,即准则层;将可选方案置于底层,即方案层。这种可视化的展示有助于理解整个评价体系的架构。
3.构造判断矩阵(确定评价指标重要性)
在层次分析法中,为量化各因素间的相对重要性,需构建判断矩阵。该过程采用两两比较的方式,借助数字标度体系将定性判断转化为定量数值。具体标度规则如下表所示: 表 1:判断矩阵标度及其含义
标度 | 含义 |
---|---|
1 | 表示两个因素相比,具有同等重要性 |
3 | 表示两个因素相比,前者比后者稍重要 |
5 | 表示两个因素相比,前者比后者明显重要 |
7 | 表示两个因素相比,前者比后者强烈重要 |
9 | 表示两个因素相比,前者比后者极端重要 |
2, 4, 6, 8 | 表示上述相邻判断的中间值 |
倒数 | 若因素 i 与 j 比较得判断值\(a_{ij}\),那么因素 j 与 i 比较的判断值为\(a_{ji}=1/a_{ij}\) |
依据上述规则,针对评价标准构建判断矩阵。以评价标准a、b、c为例,构建的判断矩阵形式如下: 式中,
表示相对于上一层某因素,因素i与因素j的相对重要性标度。例如,当判断认为标准a与b同等重要时,
,
;若标准a比c稍微重要,则
,
。
同理,针对每个评价标准,构建关于可选方案的判断矩阵。以评价标准a为例,关于可选方案x、y、z的判断矩阵为:这些判断矩阵为后续确定各因素权重,进而计算方案最终得分提供了数据基础 。
4.依照评价指标进行打分
针对每个评价标准,构建关于可选方案的判断矩阵。例如,当评价标准为 a,b,c 时,判断矩阵如下:
对于每个评价标准 a,b,c,针对可选方案 x,y,z 的判断矩阵分别为:
方案的最终得分通过加权求和得到,即:方案最终得分 = 指标在一处得分 × 指标一的权重 + 指标在二处得分 × 指标二的权重 + … + 指标在 n 处得分 × 指标 n 的权重。
在确定权重之前,需要判断矩阵的一致性。对于非一致性矩阵,常用算术平均法求权重。同时,也可以使用特征值法求权重,为了保证结果的严谨性,建议两种方法同时使用。
5.求出权重,填表,求最后得分
确定各个判断矩阵的权重,并填入相应表格。通过计算,得出每个方案的最终得分.
权重 | x | y | z | CI | CR/ | |
a | ||||||
b | ||||||
c | ||||||
最终得分 |
一致性指标:设构造 n 个判断矩阵,一致性指标 ,其中
为判断矩阵的最大特征值, n 是判断矩阵阶数。
一致性比例:一致性比例,其中 RI 为随机一致性指标。当 CR 小于 0.1 时,判断矩阵的一致性可以接受;否则,需要对判断矩阵进行修改。
6.层次总排序一次性检验
对整个层次结构进行总排序的一致性检验。若 CR 小于 0.1,则符合一致性要求;否则,不符合一致性要求,需重新调整判断矩阵。
7.代码
%% 层次分析法
% 只有非一致矩阵才需要一致性检验
% % 要先进行一致性检验,通过后才能求权重
%% 获取判断矩阵
disp('请输入判断矩阵A')
A=input('A=');
[m, n] = size(A); % 先获取矩阵的行数和列数
% 检查矩阵是否为方阵
if m ~= n
error('输入的矩阵不是方阵,请重新输入!');
end
%% 方法1: 算术平均法求权重
Sum_A = sum(A); %将A矩阵按列求和
SUM_A = repmat(Sum_A,n,1);
Stand_A = A ./ SUM_A;
disp('算术平均法求权重的结果为:');
w1 = sum(Stand_A,2)./n;
disp(w1)
%% 方法2: 特征值法求权重
[V,D] = eig(A);
Max_eig = max(max(D));% 先按列求最大值,得到行向量,再从这个向量里面求最大值
[r,c]=find(D == Max_eig , 1);
disp('特征值法求权重的结果为:');
w2 = V(:,c) ./ sum(V(:,c));
disp(w2)
disp('两种方法的平均权值为:');
disp((w1 + w2) ./ 2);
%% 计算一致性比例CR
CI = (Max_eig - n) / (n-1);
RI=[0 0.0001 0.52 0.89 1.12 1.26 1.36 1.41 1.46 1.49 1.52 1.54 1.56 1.58 1.59]; %这里的RI最多支持 n = 15,注意检查!
% 这里n=2时,RI=0,我们为了避免分母为0,将这里的第二个元素改为了很接近0的正数
% 检查矩阵阶数是否超过15
if n > 15
error('矩阵阶数超过15,超出RI数组的支持范围,请重新输入!');
end
CR=CI/RI(n);
disp('最大特征值为:');
disp(Max_eig);
disp('一致性指标CI=');disp(CI);
disp('一致性比例CR=');disp(CR);
if CR<0.10
disp('CR<0.10,该判断矩阵A的一致性可以接受!');
else
disp('注意:CR >= 0.10,该判断矩阵需要进行修改!');
end
二、模糊综合评价
1.解决评价类问题
应用场景:模糊综合评价广泛应用于解决评价标准模糊、难以精确量化的问题,例如产品质量评价、员工绩效评估、环境质量评估等。在这些场景中,评价结果往往带有主观性和模糊性,模糊综合评价能有效处理此类问题。
2、确定隶属函数
F 分布确定隶属函数:依据评价因素的特性,选择合适的 F 分布类型,如正态分布、梯形分布等,来确定隶属函数。以手机处理器性能评价为例,若采用正态分布隶属函数,需收集大量手机处理器性能数据,确定均值和标准差,进而构建隶属函数。
- 对 F 分布确定隶属函数的过程进行详细说明。以正态分布隶属函数为例,设评价因素为 x,均值为
,标准差为
,则隶属函数可表示为:
在构建过程中,详细描述如何通过收集数据,利用统计方法计算
和
。
三分法确定隶属函数:将评价对象的取值范围划分为三个区间,为每个区间确定相应的隶属函数。例如,在评价学生成绩时,可将成绩划分为低、中、高三个区间,分别构建隶属函数。
- 对于三分法确定隶属函数,以评价学生成绩为例,假设成绩范围为 0 - 100 分,将其划分为低(0 - 59 分)、中(60 - 84 分)、高(85 - 100 分)三个区间,可构建如下隶属函数:
- 低分段:
- 中间分段:
- 高分段:
3、具体步骤:
(1)确定因素集(从某些可以评价的因素)
确定因素集:明确所有与评价对象相关的因素,构建因素集。
(2)确定评语集(评价的等级,例差,中,好,极好)
确定评价的等级类别,构建评语集
(3)确定各因素权重
确定各因素权重:运用层次分析法或熵权法等方法,确定每个因素在评价中的相对重要性,得到权重向量 且
(4)确定综合模糊判断矩阵
邀请多位评价者对每个因素在各个评语等级上进行评价,统计评价结果,计算每个因素对各个评语等级的隶属度,从而构建综合模糊判断矩阵 ,其中
表示第 i 个因素对第 j 个评语等级的隶属度。
进行模糊综合评判:通过矩阵运算 ,得到模糊综合评价结果向量
。通常选择最大隶属度原则,即取
中数值最大的对应的评语等级作为最终评价结果。
多级模糊综合评价:当评价因素较多时,可将因素集划分为多个层次,进行多级模糊综合评价。首先对最底层因素进行评价,得到上一层因素的模糊评价矩阵,再逐层向上进行评价,直至得到最终的评价结果。
4.代码的实现
function fuzzy_evaluation()
% 提示用户输入评价的级数
levels = input('请输入模糊综合评价的级数 (1 表示单级,大于 1 表示多级): ');
% 存储各级因素的权重向量和模糊判断矩阵
weights = cell(levels, 1);
fuzzy_matrices = cell(levels, 1);
% 输入各级因素的权重向量和模糊判断矩阵
for i = 1:levels
fprintf('请输入第 %d 级因素的权重向量 (用空格分隔元素): ', i);
weights{i} = input('');
% 检查权重向量元素之和是否为 1
if abs(sum(weights{i}) - 1) > 1e-6
error('第 %d 级因素的权重向量元素之和必须为 1,请重新输入。', i);
end
fprintf('请输入第 %d 级因素的模糊判断矩阵 (按行输入,每行元素用空格分隔,行与行之间用回车分隔):\n', i);
fuzzy_matrices{i} = input('');
end
% 进行模糊综合评价
result = perform_fuzzy_evaluation(weights, fuzzy_matrices);
% 输出模糊综合评价结果
disp('模糊综合评价结果:');
disp(result);
% 找出最大隶属度对应的索引
[~, index] = max(result);
% 输出最终评价等级
fprintf('最终评价等级:%d\n', index);
end
function result = perform_fuzzy_evaluation(weights, fuzzy_matrices)
levels = length(weights);
if levels == 1
% 单级模糊综合评价
result = weights{1} * fuzzy_matrices{1};
else
% 多级模糊综合评价
% 从最底层开始逐级评价
sub_results = cell(levels - 1, 1);
for i = levels:-1:2
if i == levels
sub_results{i - 1} = weights{i} * fuzzy_matrices{i};
else
sub_results{i - 1} = weights{i} * sub_results{i};
end
end
% 进行第一级模糊综合评价
result = weights{1} * sub_results{1};
end
end
三、熵权法
熵权法作为一种客观赋权方法,依据指标数据的离散程度来确定权重。数据离散程度越大,表明该指标在综合评价中所蕴含的有效信息越多,其在综合评价里发挥的作用就越大,相应的权重也就越高。由于该方法仅依赖数据本身的特征,避免了人为因素干扰,因此在多指标综合评价领域应用广泛,如企业竞争力分析、环境质量评估、医疗风险评价等场景。
1.正向化处理
在实际评价过程中,评价指标可分为极大型(越大越好)、极小型(越小越好)、中间型(越接近某个值越好)和区间型(落在某个区间最佳)。为了统一评价方向,方便后续计算,通常需要将极小型、中间型和区间型指标转化为极大型指标,这个过程即为正向化处理。
- 极小型指标转极大型:通过公式
,可以将极小型指标转化为极大型。其中,
表示原始数据,
表示正向化后的数据,
为该指标下的最大值。
- 中间型指标转极大型:设中间型指标的最佳值为
,先计算
,再通过公式
进行正向化。
- 区间型指标转极大型:若指标的最佳区间为
,首先计算
,当
时,
;当
时,
;当
时,
。
2.标准化处理
正向化处理后的数据,由于各指标的量纲和数量级可能不同,会对后续计算产生影响。因此,需要对数据进行标准化处理,以消除量纲的影响。
- 无负数数据标准化:当数据中不存在负数时,采用向量归一化法,公式为
,其中
表示第j个指标下的第i个样本值,
表示标准化后的值,n为样本数量。
- 存在负数数据标准化:当数据中存在负数时,采用极差标准化法,公式为
,其中
和
分别为第j个指标的最大值和最小值。
3.计算各个指标下每个样本比重
经过标准化处理后,计算第j个指标下第i个样本的比重,公式为
。比重
反映了每个样本在对应指标下的相对占比情况。
4.计算信息熵和熵权
基于样本比重,计算第j个指标的信息熵,公式为
,信息熵可以衡量指标数据的无序程度或不确定性。再计算信息效用值
,信息效用值越大,说明该指标在评价中提供的有效信息越多。最后,通过公式
计算第j个指标的熵权,其中m为指标数量。
代码:
% 清空工作区和命令窗口
clear; clc;
% 读取数据
X = xlsread('blind date.xlsx');
%% 正向化
disp('***************正在进行正向化...***************');
vec = input('请输入要正向化的向量组,请以数组的形式输入,如[1 2 3]表示1,2,3列需要正向化,不需要正向化请输入-1\n');
if (vec ~= -1)
for i = 1 : length(vec)
flag = input(['第' num2str(vec(i)) '列是哪类数据(【1】:极小型 【2】:中间型 【3】:区间型),请输入序号:\n']);
switch flag
case 1 % 极小型
X(:,vec(i)) = Min2Max(X(:,vec(i)));
case 2 % 中间型
best = input('请输入中间型的最好值:\n');
X(:,vec(i)) = Mid2Max(X(:,vec(i)), best);
case 3 % 区间型
arr = input('请输入最佳区间,按照“[a,b]”的形式输入:\n');
X(:,vec(i)) = Int2Max(X(:,vec(i)), arr(1), arr(2));
otherwise
error('输入的序号无效,请输入1、2或3。');
end
end
disp('所有的数据均已完成正向化!')
end
%% 标准化
disp('***************正在进行标准化...***************');
[n, m] = size(X);
% 先检查有没有负数元素
isNeg = any(X(:) < 0);
if ~isNeg
stand_X = X ./ repmat(sqrt(sum(X.^2)), n, 1);
else
max_X = max(X, [], 1);
min_X = min(X, [], 1);
stand_X = (X - repmat(min_X, n, 1)) ./ (repmat(max_X, n, 1) - repmat(min_X, n, 1));
end
disp('标准化完成!')
%% 计算样本概率、信息熵和熵权
disp('***************正在用熵权法确定权值...***************');
P = stand_X ./ repmat(sum(stand_X), n, 1);
% 处理概率为0的情况
P(P == 0) = 0.00001;
H_x = sum(-P .* log(P));
e_j = H_x / log(n);
d_j = 1 - e_j;
% 进行归一化,获得熵权
disp('熵权完成,权值为:');
w = d_j / sum(d_j);
%% 极小型转极大型
function res = Min2Max(X)
res = max(X) - X;
end
%% 中间型转极大型
function res = Mid2Max(X, best)
M = max(abs(X - best));
res = 1 - abs(X - best) / M;
end
%% 区间型转极大型
function res = Int2Max(X, a, b)
M = max(a - min(X), max(X) - b);
for i = 1 : length(X)
if X(i) < a
X(i) = 1 - (a - X(i)) / M;
elseif X(i) >= a && X(i) <= b
X(i) = 1;
elseif X(i) > b
X(i) = 1 - (X(i) - b) / M;
end
end
res = X;
end
% 绘制 x*log(x) 的图像
x = linspace(0.0001, 1, 100);
y = x .* log(x);
figure;
plot(x, y);
xlabel('x');
ylabel('x * log(x)');
title('x * log(x) 函数图像');
四、 TOPSIS
TOPSIS(Technique for Order Preference by Similarity to an Ideal Solution),即逼近理想解排序法,是一种常用的多属性决策分析方法。该方法通过计算评价对象与理想解(最优解)和负理想解(最劣解)之间的距离,来评估各对象的优劣程度,在工程、经济、管理等众多领域都有广泛应用。
1.指标正向化
在多指标评价体系中,评价指标通常分为极大型(越大越好)、极小型(越小越好)、中间型(越接近某个值越好)和区间型(落在某个区间最佳)。由于 TOPSIS 方法要求所有指标具有同向性,所以需要将极小型、中间型和区间型指标转化为极大型指标,这一过程被称为指标正向化。
- 极小型指标转极大型:对于极小型指标,使用公式
进行转换,其中
为原始数据,
为正向化后的数据,
是该指标下的最大值。例如,在评估产品成本时,成本属于极小型指标,经过上述转换,可将其转化为极大型指标,方便后续计算。
- 中间型指标转极大型:设中间型指标的最佳值为
,首先计算
,再通过公式
进行正向化。以评估室内温度为例,人体感觉最舒适的温度为中间型指标,通过该方法可将其转化为极大型指标。
- 区间型指标转极大型:若指标的最佳区间为
,先计算
。当
时,
;当
时,
;当
时,
。例如在评价水质时,某些化学物质的含量需处于特定区间,就可采用此方法正向化。
2.第二步标准化
正向化处理后,各指标的量纲和数量级可能不同,会对评价结果产生影响。因此,需要对数据进行标准化处理,以消除量纲的影响,使不同指标具有可比性。常用的标准化方法为向量归一化法,公式为,其中
表示第j个指标下的第i个样本值,
表示标准化后的值,n为样本数量。
3.第三步用优略解打分
3.1 确定正、负理想解
标准化后,确定正理想解和负理想解
。正理想解是由各指标的最优值组成的向量,负理想解则由各指标的最劣值组成的向量。对于极大型指标,
,
;对于极小型指标则相反。
3.2 计算距离
计算每个评价对象与正理想解和负理想解的欧氏距离。与正理想解的距离为
,与负理想解的距离
为
,其中m为指标数量。
3.3 计算贴近度
通过计算贴近度来评估各评价对象的优劣,贴近度公式为
。
的值越接近 1,表示该评价对象越接近正理想解,即越优;越接近 0,表示该评价对象越接近负理想解,即越劣。
4.基于熵权法topsis优劣解距离法
熵权法是一种客观赋权方法,通过计算指标的信息熵来确定指标权重。将熵权法与 TOPSIS 相结合,可以更客观地评价对象的优劣。
4.1 熵权法确定权重
采用熵权法确定指标权重,计算步骤如下:
- 计算比重:根据标准化后的数据
,计算第j个指标下第i个样本的比重
。
- 计算信息熵:计算第j个指标的信息熵
。
- 计算信息效用值:计算信息效用值
,信息效用值越大,表明该指标在评价中提供的有效信息越多。
- 计算权重:计算第j个指标的熵权
。
-
4.2 加权 TOPSIS 计算
利用熵权法确定的权重,对标准化后的数据进行加权处理,得到加权标准化矩阵
。然后,基于加权标准化矩阵,重新确定正理想解
和负理想解
,并计算各评价对象与正、负理想解的加权欧氏距离
和
,贴近度
,以此对评价对象进行排序。
function topsis_entropy()
% 读取数据
% 从名为'工作簿1.xlsx'的Excel文件中读取数据,并存储在矩阵X中
% 假设该文件包含待分析的多指标数据,每一行代表一个样本,每一列代表一个指标
X = xlsread('工作簿1.xlsx');
% 正向化处理
% 调用forward_normalize函数对数据矩阵X进行正向化处理
% 该函数会根据用户输入,将指定列的指标(极小型、中间型、区间型)转化为极大型指标
X = forward_normalize(X);
% 标准化处理
% 调用standardize函数对正向化后的数据矩阵X进行标准化处理
% 采用向量归一化法消除各指标的量纲影响,使数据具有可比性
X = standardize(X);
% 熵权法确定权重
% 调用entropy_weight函数,通过熵权法计算各指标的权重
% 该函数会返回一个权重向量,代表每个指标在评价中的相对重要性
weight = entropy_weight(X);
% TOPSIS计算
% 调用define_ideal_solutions函数,根据标准化后的数据X和指标权重weight
% 确定正理想解和负理想解,分别存储在positive_ideal和negative_ideal中
[positive_ideal, negative_ideal] = define_ideal_solutions(X, weight);
% 调用calculate_distances函数,计算每个样本与正理想解和负理想解的加权欧氏距离
% 距离结果分别存储在distance_positive和distance_negative中
[distance_positive, distance_negative] = calculate_distances(X, positive_ideal, negative_ideal, weight);
% 调用calculate_closeness函数,根据上述计算的距离,计算每个样本的贴近度
% 贴近度反映了样本与正理想解的接近程度,存储在closeness中
closeness = calculate_closeness(distance_positive, distance_negative);
% 输出结果
% 打印提示信息,表明即将输出贴近度结果
fprintf('贴近度:\n');
% 显示每个样本的贴近度值
disp(closeness);
end
function X = forward_normalize(X)
% 显示提示信息,表明正在进行正向化操作
disp('***************正在进行正向化...***************');
% 提示用户输入需要正向化的列向量组,以数组形式输入,如[1 2 3]表示1、2、3列需要正向化
% 若不需要正向化则输入-1,输入结果存储在vec中
vec = input('请输入要正向化的向量组,请以数组的形式输入,如[1 2 3]表示1,2,3列需要正向化,不需要正向化请输入-1\n');
if vec ~= -1
for i = 1:length(vec)
% 提示用户输入指定列的数据类型(1:极小型,2:中间型,3:区间型),输入结果存储在flag中
flag = input(['第' num2str(vec(i)) '列是哪类数据(【1】:极小型 【2】:中间型 【3】:区间型),请输入序号:\n']);
switch flag
case 1 % 极小型
% 调用Min2Max函数将极小型指标转化为极大型指标
X(:,vec(i)) = Min2Max(X(:,vec(i)));
case 2 % 中间型
% 提示用户输入中间型指标的最佳值,输入结果存储在best中
best = input('请输入中间型的最好值:\n');
% 调用Mid2Max函数将中间型指标转化为极大型指标
X(:,vec(i)) = Mid2Max(X(:,vec(i)), best);
case 3 % 区间型
% 提示用户输入区间型指标的最佳区间,以“[a,b]”形式输入,输入结果存储在arr中
arr = input('请输入最佳区间,按照“[a,b]”的形式输入:\n');
% 调用Int2Max函数将区间型指标转化为极大型指标
X(:,vec(i)) = Int2Max(X(:,vec(i)), arr(1), arr(2));
otherwise
% 若用户输入的序号无效,抛出错误提示
error('输入的序号无效,请输入1、2或3。');
end
end
% 显示提示信息,表明所有数据的正向化已完成
disp('所有的数据均已完成正向化!');
end
end
function X = standardize(X)
% 显示提示信息,表明正在进行标准化操作
disp('***************正在进行标准化...***************');
% 获取数据矩阵X的行数n和列数m
[n, m] = size(X);
% 采用向量归一化法对数据进行标准化处理
% 将每一列的元素除以该列元素平方和的平方根,以消除量纲影响
X = X ./ repmat(sqrt(sum(X.^2, 1)), n, 1);
% 显示提示信息,表明标准化已完成
disp('标准化完成!');
% 返回标准化后的数据矩阵X
return X;
end
function weight = entropy_weight(X)
% 显示提示信息,表明正在使用熵权法确定权重
disp('***************正在用熵权法确定权值...***************');
% 获取数据矩阵X的行数n和列数m
[n, m] = size(X);
% 计算每个样本在各指标下的比重矩阵P
% 将数据矩阵X的每一个元素除以该列元素之和,得到比重矩阵
P = X ./ repmat(sum(X, 1), n, 1);
% 将比重矩阵P中值为0的元素替换为一个极小值eps,避免log(0)的错误
P(P == 0) = eps;
% 计算各指标的信息熵H_x
% 根据比重矩阵P,按照信息熵公式计算每个指标的信息熵
H_x = -sum(P .* log(P)) / log(n);
% 计算各指标的信息效用值d_j
% 用1减去信息熵得到信息效用值,信息效用值越大,指标越重要
d_j = 1 - H_x;
% 计算各指标的熵权weight
% 将信息效用值进行归一化处理,得到各指标的熵权
weight = d_j / sum(d_j);
% 打印提示信息,表明熵权计算已完成,并显示各指标的熵权值
fprintf('熵权完成,权值为:\n');
disp(weight);
% 返回熵权向量weight
return weight;
end
function [positive_ideal, negative_ideal] = define_ideal_solutions(X, weight)
% 获取数据矩阵X的行数n和列数m
[n, m] = size(X);
% 确定正理想解positive_ideal
% 取每列的最大值,并乘以对应的指标权重,得到正理想解向量
positive_ideal = max(X,[],1).*weight;
% 确定负理想解negative_ideal
% 取每列的最小值,并乘以对应的指标权重,得到负理想解向量
negative_ideal = min(X,[],1).*weight;
% 返回正理想解和负理想解向量
return positive_ideal, negative_ideal;
end
function [distance_positive, distance_negative] = calculate_distances(X, positive_ideal, negative_ideal, weight)
% 获取数据矩阵X的行数n和列数m
[n, m] = size(X);
% 计算每个样本与正理想解的加权欧氏距离distance_positive
% 先计算每个样本与正理想解的差值,乘以权重后求平方和,再开方得到距离
distance_positive = sqrt(sum((repmat(weight,n,1).*(X - repmat(positive_ideal,n,1))).^2, 2));
% 计算每个样本与负理想解的加权欧氏距离distance_negative
% 同理,计算每个样本与负理想解的差值,乘以权重后求平方和,再开方得到距离
distance_negative = sqrt(sum((repmat(weight,n,1).*(X - repmat(negative_ideal,n,1))).^2, 2));
% 返回与正理想解和负理想解的距离向量
return distance_positive, distance_negative;
end
function closeness = calculate_closeness(distance_positive, distance_negative)
% 计算每个样本的贴近度closeness
% 根据贴近度公式,用与负理想解的距离除以与正、负理想解距离之和
closeness = distance_negative ./ (distance_positive + distance_negative);
% 返回贴近度向量
return closeness;
end
function res = Min2Max(X)
% 将极小型指标转化为极大型指标
% 用该指标的最大值减去原始数据,得到正向化后的数据
res = max(X) - X;
end
function res = Mid2Max(X, best)
% 将中间型指标转化为极大型指标
% 先计算原始数据与最佳值的绝对差值的最大值M
M = max(abs(X - best));
% 根据公式计算正向化后的数据
res = 1 - abs(X - best) / M;
end
function res = Int2Max(X, a, b)
% 将区间型指标转化为极大型指标
% 计算最佳区间两端与数据最小值、最大值的差值的最大值M
M = max(a - min(X), max(X) - b);
for i = 1:length(X)
if X(i) < a
% 若数据小于区间下限,根据公式计算正向化后的数据
X(i) = 1 - (a - X(i)) / M;
elseif X(i) >= a && X(i) <= b
% 若数据在区间内,正向化后的值为1
X(i) = 1;
elseif X(i) > b
% 若数据大于区间上限,根据公式计算正向化后的数据
X(i) = 1 - (X(i) - b) / M;
end
end
% 返回正向化后的数据向量
res = X;
end