clc;clear;

% 实现用熵值法求各指标(列)的权重及各数据行的得分

% x为原始数据矩阵, 一行代表一个样本, 每列对应一个指标

% s返回各行得分, w返回各列权重

load('data_water_quality.mat')%载入数据

x=X; %X为工作表中的样本数据

%% 数据的正向化处理

[n,m]=size(x); % X中有n个样本, m个指标

disp(['共有' num2str(n) '个评价对象, ' num2str(m) '个评价指标'])

Judge = input(['这' num2str(m) '个指标是否需要经过正向化处理,需要请输入1 ,不需要输入0: ']);

if Judge == 1

Position = input('请输入需要正向化处理的指标所在的列,例如第2、3、6三列需要处理,那么你需要输入[2,3,6]: '); %[2,3,4]

disp('请输入需要处理的这些列的指标类型(1:极小型, 2:中间型, 3:区间型) ')

Type = input('例如:第2列是极小型,第3列是区间型,第6列是中间型,就输入[1,3,2]: '); %[2,1,3]

% 注意,Position和Type是两个同维度的行向量

for i = 1 : size(Position,2) %这里需要对这些列分别处理,因此我们需要知道一共要处理的次数,即循环的次数

X(:,Position(i)) = Positivization(X(:,Position(i)),Type(i),Position(i));

% Positivization是我们自己定义的函数,其作用是进行正向化,其一共接收三个参数

% 第一个参数是要正向化处理的那一列向量 B(:,Position(i)) X(:,n)表示取第n列的全部元素

% 第二个参数是对应的这一列的指标类型(1:极小型, 2:中间型, 3:区间型)

% 第三个参数是告诉函数我们正在处理的是原始矩阵中的哪一列

% 该函数有一个返回值,它返回正向化之后的指标,我们可以将其直接赋值给我们原始要处理的那一列向量

end

disp('正向化后的矩阵 X = ')

disp(X)

end

%% 数据的归一化处理

% Matlab2010b,2011a,b版本都有bug,需如下处理. 其它版本直接用[X,ps]=mapminmax(x',0,1);即可

[B,ps]=mapminmax(X');

ps.ymin=0.002; % 归一化后的最小值

ps.ymax=0.996; % 归一化后的最大值

ps.yrange=ps.ymax-ps.ymin; % 归一化后的极差,若不调整该值, 则逆运算会出错

B=mapminmax(X',ps);

% mapminmax('reverse',xx,ps); % 反归一化, 回到原数据

B=B'; % B为归一化后的数据

%% 计算第j个指标下,第i个记录占该指标的比重p(i,j)

for i=1:n

for j=1:m

p(i,j)=B(i,j)/sum(X(:,j));

end

end

%% 计算第j个指标的熵值e(j)

k=1/log(n);

for j=1:m

e(j)=-k*sum(p(:,j).*log(p(:,j)));

end

d=ones(1,m)-e; % 计算信息熵冗余度

w=d./sum(d); % 求权值w

s=w*p'; % 求综合得分[\code]

disp("信息冗余度为");disp(d)

disp("各样本综合得分s为");disp(s);

disp("各指标权重w为");disp(w);

正向化函数代码

(1)Positivization

% function [输出变量] = 函数名称(输入变量)

% 函数的中间部分都是函数体

% 函数的最后要用end结尾

% 输出变量和输入变量可以有多个,用逗号隔开

% function [a,b,c]=test(d,e,f)

% a=d+e;

% b=e+f;

% c=f+d;

% end

% 自定义的函数要单独放在一个m文件中,不可以直接放在主函数里面(和其他大多数语言不同)

function [posit_x] = Positivization(x,type,i)

% 输入变量有三个:

% x:需要正向化处理的指标对应的原始列向量

% type: 指标的类型(1:极小型, 2:中间型, 3:区间型)

% i: 正在处理的是原始矩阵中的哪一列

% 输出变量posit_x表示:正向化后的列向量

if type == 1 %极小型

disp(['第' num2str(i) '列是极小型,正在正向化'] )

posit_x = Min2Max(x); %调用Min2Max函数来正向化

disp(['第' num2str(i) '列极小型正向化处理完成'] )

disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~')

elseif type == 2 %中间型

disp(['第' num2str(i) '列是中间型'] )

best = input('请输入最佳的那一个值: ');

posit_x = Mid2Max(x,best);

disp(['第' num2str(i) '列中间型正向化处理完成'] )

disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~')

elseif type == 3 %区间型

disp(['第' num2str(i) '列是区间型'] )

a = input('请输入区间的下界: ');

b = input('请输入区间的上界: ');

posit_x = Inter2Max(x,a,b);

disp(['第' num2str(i) '列区间型正向化处理完成'] )

disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~')

else

disp('没有这种类型的指标,请检查Type向量中是否有除了1、2、3之外的其他值')

end

end

(2)Inter2Max

function [posit_x] = Inter2Max(x,a,b)

r_x = size(x,1); % row of x

M = max([a-min(x),max(x)-b]);

posit_x = zeros(r_x,1); %zeros函数用法: zeros(3) zeros(3,1) ones(3)

% 初始化posit_x全为0 初始化的目的是节省处理时间

for i = 1: r_x

if x(i) < a

posit_x(i) = 1-(a-x(i))/M;

elseif x(i) > b

posit_x(i) = 1-(x(i)-b)/M;

else

posit_x(i) = 1;

end

end

end

(3)Mid2Max

function [posit_x] = Mid2Max(x,best)

M = max(abs(x-best));

posit_x = 1 - abs(x-best) / M;

end

(4)Min2Max

function [posit_x] = Min2Max(x)

posit_x = max(x) - x;

%posit_x = 1 ./ x; %如果x全部都大于0,也可以这样正向化

end

运行结果如下图所示:

熵权法用matlab怎么,熵权法求权重原理详细步骤附matlab代码相关推荐

  1. matlab写的单纯形法二阶段法 大m法,线性规划中的单纯形法与内点法(原理、步骤以及matlab实现)(二)...

    在线性规划中的单纯形法与内点法(原理.步骤以及matlab实现)(一)中,我们讨论了单纯形法的原理和普通单纯形法的应用,本文接着讨论大M法.两阶段法和对偶单纯形法 2.2 Big M Method ( ...

  2. 【模糊综合评价的运用】——《基于模糊评价法的高校户外公共活动空间研究》论文笔记(内附MATLAB程序)

    基于模糊评价法的高校户外公共活动空间研究 - 中国知网 (cnki.net) [模糊综合评价的运用]--<基于模糊评价法的高校户外公共活动空间研究>论文笔记(内附MATLAB程序) 文章目 ...

  3. matlab、carsim、prescan联合仿真从零开始详细步骤

    matlab.carsim.prescan联合仿真详细步骤 在matlab.carsim.prescan联合仿真中,prescan提供测试场景和传感器模型,但prescan也提供车辆动力学2D和3D模 ...

  4. 【无人机编队】基于动态窗口法实现的无人机编队目标分配及路径规划问题研究附matlab代码

    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.

  5. MATLAB实现睡眠脑电分期--sleep-EDF(详细步骤和代码)

    把毕设的部分内容写一写,复习一下,并且也给有需要的人一些参考(文章最下面还有一些处理好的数据可供下载使用) 目录 0.项目简介 1.数据库和数据导入 数据库简介 AASM标准 2.信号去噪 3.计算信 ...

  6. matlab程序4名商人,商人们怎样安全过河附MATLAB程序完整.doc

    商人们怎样安全过河附MATLAB程序完整.doc *** 商人们怎样安全过河 随从们密约, 在河的任一岸, 一旦随从的人数比商人多, 就杀人越货. 但是乘船渡河的方案由商人决定. 商人们怎样才能安全过 ...

  7. 基于MATLAB的拼图游戏设计(图文详解,附完整代码)

                                                                               基于MATLAB的拼图游戏设计 内容摘要:MATL ...

  8. matlab仿真点目标,sar合成孔径雷达图像点目标仿真报告(附matlab代码).docx

    sar合成孔径雷达图像点目标仿真报告(附matlab代码).docx SAR图像点目标仿真报告徐一凡1SAR原理简介合成孔径雷达(SyntheticApertureRadar,简称SAR)是一种高分辨 ...

  9. 基于MATLAB的二维与三维插值拟合运算(附完整代码)

    · 一. 一维插值 interp1函数在上个博客中(如下链接)已经更新了,此处再补充两个相关例题. 基于MATLAB的数据插值运算:Lagrange与Hermite算法(附完整代码)_唠嗑!的博客-C ...

  10. matlab 滤波窗函数,FIR滤波器窗函数设计法详细步骤以及Matlab代码

    采用窗函数法设计理想低通,高通滤波器,参考北京交通大学陈后金主编的[数字信号处理]5.2节 窗函数法设计线性相位FIR数字滤波器P164,和P188. 设计步骤如下: 1) 确定滤波器类型,不同的FI ...

最新文章

  1. 数据分析之全国热门景点分析
  2. dubbo-go 白话文 | 从零搭建 dubbogo 和 dubbo 的简单用例
  3. rx ajax,ajax_RxJS 中文文档_w3cschool
  4. PowerBI从Exchange跟踪日志中分析数据和KPI展现
  5. vc6.0 debug 比 release 快??_快速入门快应用——quickapp构建与发布
  6. 大学计算机二级的试题,大学计算机二级考试试题及其答案_..doc
  7. Qt之多线程编程初识
  8. python怎么读取excel-Python|读、写Excel文件(三种模块三种方式)
  9. JS调用摄像头屏幕截图
  10. uni-ap开发开发小程序 怎么使用阿里云播放器
  11. 基于SSH的在线问卷调查系统的设计与实现
  12. 在 vmware ESXi上安装mac系统虚拟机
  13. 电脑游戏业编年史之十二──叛逆
  14. 大数据学习路线(包含全套视频教程)
  15. java布局FlowLayout
  16. 3D游戏建模师的工资和发展前景到底怎么样?
  17. 【福利季】《手机历史漫谈》
  18. pandas中根据列的值选取多行数据
  19. 遭遇PegeFile.pif,IEXPLORE32.Sys,WinSys64.Sys,NewTemp.dll,avpdj.dll等1
  20. 思维导图在项目管理中的应用

热门文章

  1. python爬虫之数据提取Xpath(爬取起点中文网案例)
  2. 码支付系统源码免挂版_免挂码支付系统源码,码支付系统源码,码支付源码全新版
  3. 初级学电脑计算机的入门知识,电脑基础知识入门学习(小白学好电脑从哪里开始)...
  4. Bi系统 :poli部署
  5. 课设题目:哈希表实现电话号码查找系统
  6. 年金计算机在线,年金终值复利计算器在线(企业年金计算方法)
  7. 太牛X了,大四学生自创文言文编程语言,Hello World竟然这样写!?
  8. springboot内置浏览器_SpringBoot启动后启动内嵌浏览器的方法
  9. 《JavaScript权威指南第7版》第4章 表达式和运算符
  10. c语言各种头文件函数解释,c语言头文件及其函数