学习笔记i:TOPSIS模型

%1.读取和预处理数据:

clc
close all
clc,clear
data = xlsread("E:\数学建模\个人资料\2020年C题\企业指标","result"); % 读取数据,其中xlsread("文件所在位置“,”工作表名称“)
data1 = data(:,2:12); % 删除企业代号,即是从第2列到12列,而第1列是企业代号,故是删除企业代号
result = zeros(123,3); %创建一个123行3列的零矩阵来存储结果
 

%2.归一化处理:

for i = 1:11
    maxx = max(data1(:,i));  %取每一列的最大值放入maxx
    minn = min(data1(:,i));    %取每一列的最小值放入minn
    if i == 4 || i == 5             
        data1(:,i) = (maxx - data1(:,i)) / (maxx - minn); % 负向指标归一化
    else
        data1(:,i) = (data1(:,i) - minn) / (maxx - minn); % 正向指标归一化
    end

%这段条件语句用于处理特定的指标,即第 4 和第 5 列的数据。具体来说,这些列被视为负向指标。因此,需要用不同的归一化方法进行处理。负向指标的含义是,数值越小越好,比如污染指数、事故率等;而正向指标的含义是,数值越大越好,比如利润、产量等
end
%通过遍历每一列数据,对正向和负向指标分别进行归一化处理,使数据在0到1之间

%3.熵权法确定权重:

X = data1;                                           % 保存一下方便后面topsis代码书写
data1(find(data1 == 0)) = [0.0001];   
data1(find(data1 == 1)) = [0.9999];     %也可以不用[],这里表示把表data1中的所有0改写成0.0001,所有的1改写成0.9999,这样做的目的是:防止 e = p.*log(p) 无意义
summ = sum(data1);                           %把data1按行求和
p = data1 ./ summ;                               %./表示的是每个对应位置的元素相除,故其必须是相同大小的矩阵,即如A为5*5矩阵,则与它./的矩阵B也必须是5*5的矩阵
e = p .* log(p);                                     %计算熵值,表示的公式是:eij​=pij​log(pij​)其中,pij​ 是数据点 (i, j)在其对应指标中的比重。                                                        
k = -1 / log(123);                                  %k 是一个常数,通常取 k=−1/log⁡(n),n 是样本数量。
Ej = sum(e) * k;                                    %对每个指标的所有数据点的熵值贡献求和,得到每个指标的总熵值,其中乘以 k是为了使熵值规范化,使其在 0 和 1 之间。
Dj = 1 - Ej;                                            %计算每个指标的信息效用性,而因为Dj 表示该指标提供的信息量。熵值 EjE_jEj​ 越小,说明该指标的信息量越大,所以 Dj=1−Ej。
w = Dj / sum(Dj);                                   %计算每个指标的权重 wj​,使得所有权重之和为 1

%4.TOPSIS 方法计算风险程度:

for i = 1:11
    X(:,i) = X(:,i) / sqrt(sum(X(:,i).^2));
end                                                % 正向化矩阵标准化:这一步是对原始数据矩阵 XXX 进行标准化处理。对每一个指标列(假设共有11个指标),将每一个值除以该列所有值的平方和的平方根。这种处理消除了指标之间的量纲差异。
R = w .* X; % 构造加权规范阵
r_max = max(R); % 每个指标的最大值
r_min = min(R); % 每个指标的最小值
d_z = sqrt(sum((R - repmat(r_max, size(R,1), 1)).^2, 2)); % d+ 向量,dz​ 表示每个方案到理想解的欧氏距离;

d_f = sqrt(sum((R - repmat(r_min, size(R,1), 1)).^2, 2)); % d- 向量 ,dfd_fdf​ 表示每个方案到负理想解的欧氏距离。
s = d_f ./ (d_z + d_f); % 1 - 风险程度

%s 是每个方案的可靠性程度,即方案越接近负理想解且越远离理想解,其可靠性程度越低;

%f是每个方案的风险程度,计算公式为:f=1−s。
result(:,1) = data(:,1);
result(:,2) = f; % 风险程度
result(:,3) = s; % 可靠性程度

%对标准化矩阵进行加权处理。

%计算每个企业的正理想解(最优)和负理想解(最差)距离,并得出综合得分 s 和风险程度 f

%5.绘制图像:

plotyy(result(:,1), data(:,12), result(:,1), s);
%plotyy 用于创建带有两个 y 轴的图形,其中一个表示企业编号与某个数据列(如利润)的关系,%另一个表示企业编号与可靠性程度的关系。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值