MATLAB熵權法綜合評價+代碼


熵權法

熵值法的主要目的是對指標體系進行賦權

熵越大說明系統越混亂,攜帶的信息越少,權重越小;熵越小說明系統越有序,攜帶的信息越多,權重越大。

熵值法是一種客觀賦權方法,,借鑒了信息熵思想,它通過計算指標的信息熵,根據指標的相對變化程度對系統整體的影響來決定指標的權重,即根據各個指標標志值的差異程度來進行賦權,從而得出各個指標相應的權重,相對變化程度大的指標具有較大的權重。

 

收集與整理

假設有m個待評價樣本,n項評價指標,形成原始指標數據矩陣:

其中Xij表示第 i 個樣本第 j 項評價指標的數值。

對於某項指標Xj,樣本的離散程度越大,則該指標在綜合評價中所起的作用就越大。如果該指標的標志值全部相等,則表示該指標在綜合評價中不起作用。

 

數據標准化處理

為消除因量綱不同對評價結果的影響,需要對各指標進行標准化處理。

若所用指標的值越大越好(正向指標:)

若所用指標的值越小越好(負向指標:)

其中xj為第j項指標值,  xmax為第j項指標的最大值,  xmin為第j項指標的最小值。或者:

權重計算

計算第 j 個指標中,第 i 個樣本標志值的權重:

因此,可以建立數據的比重矩陣

計算第j個指標的熵值

其中,常數

保證0<=ej<=1,即最大為1
所以,第j個指標的熵值為

定義第j個指標的差異程度

熵值法根據各個指標標志值的差異程度來進行賦權,從而得出各個指標相應的權重

定義權重

綜合評價

 

 

原理講解引自:https://blog.csdn.net/qq_42374697/article/details/105901229 

 

題目

評價下表中20條河流的水質情況。(熵權法和優劣解距離法對比)
注:含氧量越高越好;PH值越接近7越好;細菌總數越少越好;植物性營養物量介於10‐20之間最佳,超過20或低於10均不好。

河流

含氧量(ppm)

PH值

細菌總數(個/mL)

植物性營養物量(ppm)

A

4.69

6.59

51

11.94

B

2.03

7.86

19

6.46

C

9.11

6.31

46

8.91

D

8.61

7.05

46

26.43

E

7.13

6.5

50

23.57

F

2.39

6.77

38

24.62

G

7.69

6.79

38

6.01

H

9.3

6.81

27

31.57

I

5.45

7.62

5

18.46

J

6.19

7.27

17

7.51

K

7.93

7.53

9

6.52

L

4.4

7.28

17

25.3

M

7.46

8.24

23

14.42

N

2.01

5.55

47

26.31

O

2.04

6.4

23

17.91

P

7.73

6.14

52

15.72

Q

6.35

7.58

25

29.46

R

8.29

8.41

39

12.02

S

3.54

7.27

54

3.16

T

7.44

6.26

8

28.41


熵權法

.mat數據:在MATLAB里面隨便創建一個變量,將表格中的數據粘貼進變量中,再另存為.mat數據就行。

main.m

 

%% 數據讀取
clear,clc
load rivers_data.mat
%% 正向化處理
[n,m] = size(datas_matrix);
% 正向化處理的數據所在列
Pos = [2,3,4];
% 指標類型:1:極小型,2:中間型,3:區間型
ch = [2,1,3];
% 循環處理每一列
for i = 1 : size(Pos,2)
    datas_matrix(:,Pos(i)) = Forward_processing(datas_matrix(:,Pos(i)),ch(i),Pos(i));
end

%% 矩陣標准化
datas_S_matrix = datas_matrix ./ repmat(sum(datas_matrix.*datas_matrix) .^ 0.5, n, 1);

%%
model = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T"];
%% 熵權法
p = datas_S_matrix./sum(datas_S_matrix);
k = 1/log(n);
r = zeros(n,m);
for i = 1:n
    for j = 1:m
       if p(i,j) == 0
           r(i,j) = 0;
       else
           r(i,j) = log(p(i,j));
       end
    end
end
e = -k*sum(p.*r,1);
d = ones(1,m)-e;
weight = d./sum(d);
score = sum(weight.*datas_S_matrix,2);
results1 = 0 + (100-0)/(max(score)-min(score)).*(score - min(score));
[sorted_score,index] = sort(results1 ,'descend');
rivers1 = [];
for i = 1:n
    rivers1 = [rivers1;model(index(i))];
end
s = [rivers1,sorted_score];


%% 繪圖
bar(sorted_score);
title('熵權法')
set(gca,'XTick',1:20)
set(gca, 'xticklabel',{rivers1{1:20}});

%% 保存到文件
xlswrite('output.xls',s,'Sheet1');

 

 

Forward_processing.m

function [posit_x] = Forward_processing(x,type,~)
    if type == 1 %極小型
        %正向化
        posit_x = max(x) - x;
    elseif type == 2 %中間型
        best = 7;
        M = max(abs(x-best));
        posit_x = 1 - abs(x-best) / M;
    elseif type == 3 %區間型
        a = 10;
        b = 20;
        r_x = size(x,1);
        M = max([a-min(x),max(x)-b]);
        posit_x = zeros(r_x,1);
        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
end

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM