熵权法用matlab怎么,熵权法求权重原理详细步骤附matlab代码
clc;clear;
% 實(shí)現(xiàn)用熵值法求各指標(biāo)(列)的權(quán)重及各數(shù)據(jù)行的得分
% x為原始數(shù)據(jù)矩陣, 一行代表一個(gè)樣本, 每列對(duì)應(yīng)一個(gè)指標(biāo)
% s返回各行得分, w返回各列權(quán)重
load('data_water_quality.mat')%載入數(shù)據(jù)
x=X; %X為工作表中的樣本數(shù)據(jù)
%% 數(shù)據(jù)的正向化處理
[n,m]=size(x); % X中有n個(gè)樣本, m個(gè)指標(biāo)
disp(['共有' num2str(n) '個(gè)評(píng)價(jià)對(duì)象, ' num2str(m) '個(gè)評(píng)價(jià)指標(biāo)'])
Judge = input(['這' num2str(m) '個(gè)指標(biāo)是否需要經(jīng)過(guò)正向化處理,需要請(qǐng)輸入1 ,不需要輸入0: ']);
if Judge == 1
Position = input('請(qǐng)輸入需要正向化處理的指標(biāo)所在的列,例如第2、3、6三列需要處理,那么你需要輸入[2,3,6]: '); %[2,3,4]
disp('請(qǐng)輸入需要處理的這些列的指標(biāo)類(lèi)型(1:極小型, 2:中間型, 3:區(qū)間型) ')
Type = input('例如:第2列是極小型,第3列是區(qū)間型,第6列是中間型,就輸入[1,3,2]: '); %[2,1,3]
% 注意,Position和Type是兩個(gè)同維度的行向量
for i = 1 : size(Position,2) %這里需要對(duì)這些列分別處理,因此我們需要知道一共要處理的次數(shù),即循環(huán)的次數(shù)
X(:,Position(i)) = Positivization(X(:,Position(i)),Type(i),Position(i));
% Positivization是我們自己定義的函數(shù),其作用是進(jìn)行正向化,其一共接收三個(gè)參數(shù)
% 第一個(gè)參數(shù)是要正向化處理的那一列向量 B(:,Position(i)) X(:,n)表示取第n列的全部元素
% 第二個(gè)參數(shù)是對(duì)應(yīng)的這一列的指標(biāo)類(lèi)型(1:極小型, 2:中間型, 3:區(qū)間型)
% 第三個(gè)參數(shù)是告訴函數(shù)我們正在處理的是原始矩陣中的哪一列
% 該函數(shù)有一個(gè)返回值,它返回正向化之后的指標(biāo),我們可以將其直接賦值給我們?cè)家幚淼哪且涣邢蛄?/p>
end
disp('正向化后的矩陣 X = ')
disp(X)
end
%% 數(shù)據(jù)的歸一化處理
% 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; % 歸一化后的極差,若不調(diào)整該值, 則逆運(yùn)算會(huì)出錯(cuò)
B=mapminmax(X',ps);
% mapminmax('reverse',xx,ps); % 反歸一化, 回到原數(shù)據(jù)
B=B'; % B為歸一化后的數(shù)據(jù)
%% 計(jì)算第j個(gè)指標(biāo)下,第i個(gè)記錄占該指標(biāo)的比重p(i,j)
for i=1:n
for j=1:m
p(i,j)=B(i,j)/sum(X(:,j));
end
end
%% 計(jì)算第j個(gè)指標(biāo)的熵值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; % 計(jì)算信息熵冗余度
w=d./sum(d); % 求權(quán)值w
s=w*p'; % 求綜合得分[\code]
disp("信息冗余度為");disp(d)
disp("各樣本綜合得分s為");disp(s);
disp("各指標(biāo)權(quán)重w為");disp(w);
正向化函數(shù)代碼
(1)Positivization
% function [輸出變量] = 函數(shù)名稱(chēng)(輸入變量)
% 函數(shù)的中間部分都是函數(shù)體
% 函數(shù)的最后要用end結(jié)尾
% 輸出變量和輸入變量可以有多個(gè),用逗號(hào)隔開(kāi)
% function [a,b,c]=test(d,e,f)
% a=d+e;
% b=e+f;
% c=f+d;
% end
% 自定義的函數(shù)要單獨(dú)放在一個(gè)m文件中,不可以直接放在主函數(shù)里面(和其他大多數(shù)語(yǔ)言不同)
function [posit_x] = Positivization(x,type,i)
% 輸入變量有三個(gè):
% x:需要正向化處理的指標(biāo)對(duì)應(yīng)的原始列向量
% type: 指標(biāo)的類(lèi)型(1:極小型, 2:中間型, 3:區(qū)間型)
% i: 正在處理的是原始矩陣中的哪一列
% 輸出變量posit_x表示:正向化后的列向量
if type == 1 %極小型
disp(['第' num2str(i) '列是極小型,正在正向化'] )
posit_x = Min2Max(x); %調(diào)用Min2Max函數(shù)來(lái)正向化
disp(['第' num2str(i) '列極小型正向化處理完成'] )
disp('~~~~~~~~~~~~~~~~~~~~分界線~~~~~~~~~~~~~~~~~~~~')
elseif type == 2 %中間型
disp(['第' num2str(i) '列是中間型'] )
best = input('請(qǐng)輸入最佳的那一個(gè)值: ');
posit_x = Mid2Max(x,best);
disp(['第' num2str(i) '列中間型正向化處理完成'] )
disp('~~~~~~~~~~~~~~~~~~~~分界線~~~~~~~~~~~~~~~~~~~~')
elseif type == 3 %區(qū)間型
disp(['第' num2str(i) '列是區(qū)間型'] )
a = input('請(qǐng)輸入?yún)^(qū)間的下界: ');
b = input('請(qǐng)輸入?yún)^(qū)間的上界: ');
posit_x = Inter2Max(x,a,b);
disp(['第' num2str(i) '列區(qū)間型正向化處理完成'] )
disp('~~~~~~~~~~~~~~~~~~~~分界線~~~~~~~~~~~~~~~~~~~~')
else
disp('沒(méi)有這種類(lèi)型的指標(biāo),請(qǐng)檢查T(mén)ype向量中是否有除了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函數(shù)用法: zeros(3) zeros(3,1) ones(3)
% 初始化posit_x全為0 初始化的目的是節(jié)省處理時(shí)間
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
運(yùn)行結(jié)果如下圖所示:
總結(jié)
以上是生活随笔為你收集整理的熵权法用matlab怎么,熵权法求权重原理详细步骤附matlab代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: nodejs下载 安装 配置环境
- 下一篇: 熵权法 —— matlab