日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

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

發布時間:2023/12/31 循环神经网络 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 熵权法用matlab怎么,熵权法求权重原理详细步骤附matlab代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。