数学建模学习记录

一、层次分析法

层次分析法(Analytic Hierarchy Process,简称 AHP)是一种将与决策总是有关的元素分解成目标、准则、方案等层次,在此基础上进行定性和定量分析的决策方法,常用于评价类问题的打分。

1.首先要确定层次结构

  • 评价的目标:明确具体的评价目标,如评估不同产品的综合性能、选择最佳的投资方案等,设为 x,y,z
  • 评价的标准:确定用于衡量目标达成程度的标准,如产品质量、成本、市场需求等,记为 a,b,c
  • 可选的方案:列出可供选择的具体方案,如不同品牌的产品、不同的投资项目等,记为 x,y,z

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为例,构建的判断矩阵形式如下: A=\begin{pmatrix} a_{aa} & a_{ab} & a_{ac} \\ a_{ba} & a_{bb} & a_{bc} \\ a_{ca} & a_{cb} & a_{cc} \end{pmatrix} 式中,a_{ij}表示相对于上一层某因素,因素i与因素j的相对重要性标度。例如,当判断认为标准a与b同等重要时,a_{ab}=1a_{ba}=1;若标准a比c稍微重要,则a_{ac}=3a_{ca}=1/3

同理,针对每个评价标准,构建关于可选方案的判断矩阵。以评价标准a为例,关于可选方案x、y、z的判断矩阵为:A_a=\begin{pmatrix} a_{xx} & a_{xy} & a_{xz} \\ a_{yx} & a_{yy} & a_{yz} \\ a_{zx} & a_{zy} & a_{zz} \end{pmatrix}这些判断矩阵为后续确定各因素权重,进而计算方案最终得分提供了数据基础 。

4.依照评价指标进行打分

针对每个评价标准,构建关于可选方案的判断矩阵。例如,当评价标准为 a,b,c 时,判断矩阵如下:\begin{matrix} a & b & c \\ a & 1 & 1/2 & 4 \\ b & 2 & 1 & 1/5 \\ c & 1/4 & 5 & 1 \end{matrix}

对于每个评价标准 a,b,c,针对可选方案 x,y,z 的判断矩阵分别为:

\begin{matrix} a & x & y & z \\ x & 1 & 1/6 & 1/3 \\ y & 6 & 1 & 4 \\ z & 3 & 1/4 & 1 \end{matrix}

\begin{matrix} b & x & y & z \\ x & 1 & 1/6 & 1/3 \\ y & 6 & 1 & 4 \\ z & 3 & 1/4 & 1 \end{matrix}

\begin{matrix} c & x & y & z \\ x & 1 & 1/6 & 1/3 \\ y & 6 & 1 & 4 \\ z & 3 & 1/4 & 1 \end{matrix}

方案的最终得分通过加权求和得到,即:方案最终得分 = 指标在一处得分 × 指标一的权重 + 指标在二处得分 × 指标二的权重 + … + 指标在 n 处得分 × 指标 n 的权重。

 

在确定权重之前,需要判断矩阵的一致性。对于非一致性矩阵,常用算术平均法求权重。同时,也可以使用特征值法求权重,为了保证结果的严谨性,建议两种方法同时使用。

5.求出权重,填表,求最后得分

确定各个判断矩阵的权重,并填入相应表格。通过计算,得出每个方案的最终得分.

权重xyzCICR/\lambda
a
b
c
最终得分

一致性指标:设构造 n 个判断矩阵,一致性指标 CI = \frac{\lambda_{max} - n}{n - 1},其中\lambda_{max}为判断矩阵的最大特征值, n 是判断矩阵阶数。

一致性比例:一致性比例CR = \frac{CI}{RI},其中 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 分布类型,如正态分布、梯形分布等,来确定隶属函数。以手机处理器性能评价为例,若采用正态分布隶属函数,需收集大量手机处理器性能数据,确定均值和标准差,进而构建隶属函数。

  • \mu_3(x)=\begin{cases} 0, & x\leqslant84 \\ \frac{x - 84}{15}, & 84<x<100 \\ 1, & x\geqslant100 \end{cases}
  • 对 F 分布确定隶属函数的过程进行详细说明。以正态分布隶属函数为例,设评价因素为 x,均值为\mu,标准差为\sigma,则隶属函数可表示为:\mu(x)=\exp\left(-\frac{(x - \mu)^2}{2\sigma^2}\right)在构建过程中,详细描述如何通过收集数据,利用统计方法计算\mu\sigma

三分法确定隶属函数:将评价对象的取值范围划分为三个区间,为每个区间确定相应的隶属函数。例如,在评价学生成绩时,可将成绩划分为低、中、高三个区间,分别构建隶属函数。

  • 对于三分法确定隶属函数,以评价学生成绩为例,假设成绩范围为 0 - 100 分,将其划分为低(0 - 59 分)、中(60 - 84 分)、高(85 - 100 分)三个区间,可构建如下隶属函数:
  • 低分段:\mu_1(x)=\begin{cases} 1, & x\leqslant59 \\ \frac{84 - x}{25}, & 59<x<84 \\ 0, & x\geqslant84 \end{cases}
  • 中间分段:\mu_2(x)=\begin{cases} 0, & x\leqslant59 \\ \frac{x - 59}{25}, & 59<x<84 \\ \frac{100 - x}{15}, & 84\leqslant x<100 \\ 0, & x\geqslant100 \end{cases}
  • 高分段: \mu_3(x)=\begin{cases} 0, & x\leqslant84 \\ \frac{x - 84}{15}, & 84<x<100 \\ 1, & x\geqslant100 \end{cases}

3、具体步骤:

(1)确定因素集(从某些可以评价的因素)

确定因素集:明确所有与评价对象相关的因素,构建因素集U={u1,u 2 ,…,un}

(2)确定评语集(评价的等级,例差,中,好,极好)

确定评价的等级类别,构建评语集V=\{v_1, v_2, \ldots, v_m\}

(3)确定各因素权重

确定各因素权重:运用层次分析法或熵权法等方法,确定每个因素在评价中的相对重要性,得到权重向量 A=(a_1, a_2, \ldots, a_n)\sum_{i = 1}^{n}a_i = 1

(4)确定综合模糊判断矩阵

邀请多位评价者对每个因素在各个评语等级上进行评价,统计评价结果,计算每个因素对各个评语等级的隶属度,从而构建综合模糊判断矩阵 R=(r_{ij})_{n\times m},其中r_{ij}表示第 i 个因素对第 j 个评语等级的隶属度。

进行模糊综合评判:通过矩阵运算 B = A \times R,得到模糊综合评价结果向量 B=(b_1, b_2, \ldots, b_m)。通常选择最大隶属度原则,即取b_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.正向化处理

在实际评价过程中,评价指标可分为极大型(越大越好)、极小型(越小越好)、中间型(越接近某个值越好)和区间型(落在某个区间最佳)。为了统一评价方向,方便后续计算,通常需要将极小型、中间型和区间型指标转化为极大型指标,这个过程即为正向化处理。

  • 极小型指标转极大型:通过公式x_i^*=\max(x)-x_i,可以将极小型指标转化为极大型。其中,x_i表示原始数据,x_i^*表示正向化后的数据,\max(x)为该指标下的最大值。
  • 中间型指标转极大型:设中间型指标的最佳值为x_best,先计算M=\max|x_i - x_{best}|,再通过公式x_i^*=1-\frac{|x_i - x_{best}|}{M}进行正向化。
  • 区间型指标转极大型:若指标的最佳区间为[a,b],首先计算M=\max\{a - \min(x), \max(x)-b\},当x_i < a时,x_i^*=1-\frac{a - x_i}{M};当a \leq x_i \leq b时,x_i^* = 1;当x_i > b时,x_i^*=1-\frac{x_i - b}{M}

2.标准化处理

正向化处理后的数据,由于各指标的量纲和数量级可能不同,会对后续计算产生影响。因此,需要对数据进行标准化处理,以消除量纲的影响。

  • 无负数数据标准化:当数据中不存在负数时,采用向量归一化法,公式为z_{ij}=\frac{x_{ij}}{\sqrt{\sum_{i = 1}^{n}x_{ij}^2}},其中x_{ij}表示第j个指标下的第i个样本值,z_{ij}表示标准化后的值,n为样本数量。
  • 存在负数数据标准化:当数据中存在负数时,采用极差标准化法,公式为z_{ij}=\frac{x_{ij}-\min(x_j)}{\max(x_j)-\min(x_j)},其中\max(x_j)\min(x_j)分别为第j个指标的最大值和最小值。

3.计算各个指标下每个样本比重

经过标准化处理后,计算第j个指标下第i个样本的比重p_{ij},公式为p_{ij}=\frac{z_{ij}}{\sum_{i = 1}^{n}z_{ij}}。比重p_{ij}反映了每个样本在对应指标下的相对占比情况。

4.计算信息熵和熵权

基于样本比重,计算第j个指标的信息熵e_j,公式为e_j = -\frac{1}{\ln(n)}\sum_{i = 1}^{n}p_{ij}\ln(p_{ij}),信息熵可以衡量指标数据的无序程度或不确定性。再计算信息效用值d_j = 1 - e_j,信息效用值越大,说明该指标在评价中提供的有效信息越多。最后,通过公式w_j=\frac{d_j}{\sum_{j = 1}^{m}d_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 方法要求所有指标具有同向性,所以需要将极小型、中间型和区间型指标转化为极大型指标,这一过程被称为指标正向化。

  • 极小型指标转极大型:对于极小型指标,使用公式x_i^* = \max(x) - x_i进行转换,其中x_i为原始数据,x_i^*为正向化后的数据,\max(x)是该指标下的最大值。例如,在评估产品成本时,成本属于极小型指标,经过上述转换,可将其转化为极大型指标,方便后续计算。
  • 中间型指标转极大型:设中间型指标的最佳值为x_{best},首先计算x_{best},再通过公式x_i^* = 1 - \frac{|x_i - x_{best}|}{M}进行正向化。以评估室内温度为例,人体感觉最舒适的温度为中间型指标,通过该方法可将其转化为极大型指标。
  • 区间型指标转极大型:若指标的最佳区间为[a, b],先计算M = \max\{a - \min(x), \max(x) - b\}。当x_i < a时,x_i^* = 1 - \frac{a - x_i}{M};当a \leq x_i \leq b时,x_i^* = 1;当x_i > b时,x_i^* = 1 - \frac{x_i - b}{M}。例如在评价水质时,某些化学物质的含量需处于特定区间,就可采用此方法正向化。

2.第二步标准化

正向化处理后,各指标的量纲和数量级可能不同,会对评价结果产生影响。因此,需要对数据进行标准化处理,以消除量纲的影响,使不同指标具有可比性。常用的标准化方法为向量归一化法,公式为z_{ij} = \frac{x_{ij}}{\sqrt{\sum_{i = 1}^{n}x_{ij}^2}},其中x_{ij}表示第j个指标下的第i个样本值,z_{ij}表示标准化后的值,n为样本数量。

3.第三步用优略解打分

3.1 确定正、负理想解

标准化后,确定正理想解Z^+和负理想解Z^-。正理想解是由各指标的最优值组成的向量,负理想解则由各指标的最劣值组成的向量。对于极大型指标,Z_j^+ = \max_{i}(z_{ij})Z_j^- = \min_{i}(z_{ij});对于极小型指标则相反。

3.2 计算距离

计算每个评价对象与正理想解和负理想解的欧氏距离。与正理想解的距离D_i^+D_i^+ = \sqrt{\sum_{j = 1}^{m}(z_{ij} - Z_j^+)^2},与负理想解的距离D_i^-D_i^- = \sqrt{\sum_{j = 1}^{m}(z_{ij} - Z_j^-)^2},其中m为指标数量。

3.3 计算贴近度

通过计算贴近度C_i来评估各评价对象的优劣,贴近度公式为C_i = \frac{D_i^-}{D_i^+ + D_i^-}C_i的值越接近 1,表示该评价对象越接近正理想解,即越优;越接近 0,表示该评价对象越接近负理想解,即越劣。

4.基于熵权法topsis优劣解距离法

熵权法是一种客观赋权方法,通过计算指标的信息熵来确定指标权重。将熵权法与 TOPSIS 相结合,可以更客观地评价对象的优劣。

4.1 熵权法确定权重

采用熵权法确定指标权重,计算步骤如下:

  • 计算比重:根据标准化后的数据z_{ij},计算第j个指标下第i个样本的比重p_{ij} = \frac{z_{ij}}{\sum_{i = 1}^{n}z_{ij}}
  • 计算信息熵:计算第j个指标的信息熵e_j = -\frac{1}{\ln(n)}\sum_{i = 1}^{n}p_{ij}\ln(p_{ij})
  • 计算信息效用值:计算信息效用值d_j = 1 - e_j,信息效用值越大,表明该指标在评价中提供的有效信息越多。
  • 计算权重:计算第j个指标的熵权w_j = \frac{d_j}{\sum_{j = 1}^{m}d_j}
  • 4.2 加权 TOPSIS 计算

    利用熵权法确定的权重,对标准化后的数据进行加权处理,得到加权标准化矩阵Y_{ij} = w_jz_{ij}。然后,基于加权标准化矩阵,重新确定正理想解Y^+和负理想解Y^-,并计算各评价对象与正、负理想解的加权欧氏距离S_i^+S_i^-,贴近度C_i' = \frac{S_i^-}{S_i^+ + S_i^-},以此对评价对象进行排序。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拖延症晚期第九期

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值