對之前的學(xué)習(xí)進行總結(jié),整個比賽下來好像就用到了這個方法,最后也不知道對不對,反正最后還有點趕,就是很懵的那種,對于層次分析話的還是有點了解了,由于是純小白,有錯誤的地方希望各位大佬能夠指出。
目錄
數(shù)據(jù)提取
歸一化處理
判斷矩陣
一致性檢驗
?算術(shù)平均法求權(quán)重
加權(quán)求和
過程體會
數(shù)據(jù)提取
有些題目就會自己提供數(shù)據(jù),數(shù)據(jù)是存儲在Excel里面的,要導(dǎo)入的話我是用xlsread來實現(xiàn)的,因為是只用到了數(shù)值部分,所以另外兩個參數(shù)就用~替代了。假設(shè)就是要提取“數(shù)學(xué)建模.xls”里面sheet1表中的內(nèi)容,前面跟著的文件的絕對路徑,用相對路徑應(yīng)該也可以吧,我這里沒嘗試了。
%[num, txt, raw] = xlsread(filename, sheet, range)
[num,~,~]=xlsread('C:\Users\25496\Desktop\數(shù)學(xué)建模.xls','sheet1');
一般這種數(shù)據(jù)也是有規(guī)律的,集中在一塊上面,直接就可以截取出來存在一個矩陣里面。如截取num中的1到10行,且5到14列的數(shù)據(jù)。如果有多組相同指標的數(shù)據(jù),看是通過直接相加還是什么變成一組數(shù)據(jù)。
data=num(1:10,5:14);
這里有一個要注意的地方,因為不同指標之間的數(shù)量級不同,如果直接放在同一個矩陣里面,很小的數(shù)和一個更小的數(shù)放在一起,可能就會導(dǎo)致更小的整個指標的數(shù)據(jù)直接變成0,這顯然是不被允許的,我當時的處理是把他們沒個指標的數(shù)據(jù)放在集合中,因為后面要歸一化處理,等處理之后在放在同一個矩陣里面,現(xiàn)在的話可以直接給他們整體乘以一個倍數(shù),就可以讓他們不至于被忽略了。
?
歸一化處理
因為不同指標之間的數(shù)量級可以不用,指標內(nèi)部的單位一致,但是指標和指標之后的值不同,這肯定是要進行歸一化處理的,不然一個很大的數(shù)但是這個指標的權(quán)重卻比較小,這不歸一化處理這整個的誤差就很大了。這里采用的是通過先求得整個指標數(shù)據(jù)的總和,再用每一個指標的數(shù)據(jù)除以整個總和,假設(shè)指標是一列一列的,就是用這一個數(shù)據(jù)除以這一列的總和得到一個數(shù)值。這樣處理之后不同指標數(shù)量級一致,指標內(nèi)部之間的排名沒有發(fā)生改變。
這個計算的話,我比較擔(dān)心的就是精度的問題了,然后可以直接通過循環(huán)來完成整個過程。這個除數(shù)的話習(xí)慣寫還是用./,用/也行。
matlab中乘法“*”和點乘“.*”;除法“/”和點除“./”的聯(lián)系和區(qū)別。_matlab 矩陣乘法_xiaotao_1的博客-CSDN博客https://blog.csdn.net/xiaotao_1/article/details/79026406
%歸一化處理
[mm,nn]=size(data);%數(shù)據(jù)行數(shù)和列數(shù)
for j=1:nn %針對每一列
msum=sum(data(:,j)); %求這一列元素之和
for i=1:mm
data(i,j)=data(i,j)./msum; %每一個元素的值都除以這行的和
end
end
?我當時是轉(zhuǎn)換成元胞數(shù)組了,然后運算之后要變成矩陣的形式。
%歸一化處理
[~,nn]=size(ingredient);
[mm,~]=size(ingredient{1});
for j=1:nn
msum=sum(ingredient1{j});
for i=1:mm
ingredient{j}(i)=ingredient{j}(i)./msum;
end
end
%元胞數(shù)組轉(zhuǎn)矩陣
ing=cell2mat(ingredient);
判斷矩陣
因為不同指標之間的含義不同,所以側(cè)重點也不同,所以一般是通過指標數(shù)值乘以權(quán)重再相加來區(qū)分重要性的,指標我們之前已經(jīng)統(tǒng)一在同一個數(shù)量級了,現(xiàn)在我們要求的就是權(quán)重了。
首先就要人為設(shè)定一個判斷矩陣,來表示指標之間的重要性,那么可以隨便設(shè)定嗎,這顯然是不可以的,但是為什么不可以呢,因為我們對指標的重要性進行兩兩比較構(gòu)造的判斷矩陣,這可能就會導(dǎo)致出現(xiàn)不一致的情況,所以矩陣是否滿足要求,就是要看他是否可以通過一致性檢驗。
一致性檢驗
計算一致性比例CR,CR=CI/RI,其中CI=(λmax-n)/(n-1),λmax為判斷矩陣的最大特征值,n為指標數(shù)(判斷矩陣行數(shù)),RI為平均隨機一致性指標,通過查表可得到不同n對應(yīng)的RI。
如果一致性比例CR=0,說明判斷矩陣是一致矩陣,不會出現(xiàn)任何矛盾的情況。
如果一致性比例CR<0.1,可以認為判斷矩陣一致舉證的“差異”不大,通過一致性檢驗。
如果一致性比例CR>=0.1,需要修改判斷矩陣,直到CR<0.1。
這個當時的話我一直不知道RI是什么意思,查表?到哪里查表,后面發(fā)現(xiàn)這個就是一個固定的東西。
RI=[0,0,0.58,0.9,1.12,1.24,1.32,1.41,1.45,1.49];
然后對于判斷矩陣的話,當時我們選了九個指標吧,可以想象當時的難度多大,不過還好通過一些特殊手段是直接得到了一個判斷矩陣。缺點就是忽略的重要性那個東西,就是求出這個判斷矩陣,通過判斷矩陣來得到他們之間的重要性,調(diào)節(jié)指標在程序中的位置。
A=[1 3/2 3/4 1/5 1/4 3/2 2 3/4 1
2/3 1 1/2 1/4 1/6 1 3/2 1 1/2
4/3 2 1 1/3 1/2 2 3/2 1 3/2
5 4 3 1 2 4 5 2 4
4 6 2 1/2 1 3 4 2 5
2/3 1 1/2 1/4 1/3 1 3/2 1 1/2
1/2 2/3 2/3 1/5 1/4 2/3 1 1/3 2/3
4/3 1 1 1/2 1/2 2 3/2 1 3/2
1 2 2/3 1/4 1/5 2 3/2 2/3 1];
那么怎么判斷他對不對呢,就是要看一致性檢驗了。不得不說MATLAB是真的方便,最大特征值就求出來了。
A=[1 3/2 3/4 1/5 1/4 3/2 2 3/4 1
2/3 1 1/2 1/4 1/6 1 3/2 1 1/2
4/3 2 1 1/3 1/2 2 3/2 1 3/2
5 4 3 1 2 4 5 2 4
4 6 2 1/2 1 3 4 2 5
2/3 1 1/2 1/4 1/3 1 3/2 1 1/2
1/2 2/3 2/3 1/5 1/4 2/3 1 1/3 2/3
4/3 1 1 1/2 1/2 2 3/2 1 3/2
1 2 2/3 1/4 1/5 2 3/2 2/3 1];
%一致性檢驗
%求矩陣特征值
maxlam=max(eig(A));
[~,n]=size(A);
RI=[0,0,0.58,0.9,1.12,1.24,1.32,1.41,1.45,1.49];
CI=(maxlam-n)/(n-1);
CR=CI/RI(n);
if CR<0.10
disp("通過一致性檢測")
else
disp("沒有通過一致性檢測")
return %終止運行
end
?算術(shù)平均法求權(quán)重
這個我最終就是要求權(quán)重,那么每一個指標對應(yīng)的權(quán)重怎么求呢?這里是通過算術(shù)平均法來求解的。
- 將通過一致性檢驗的判斷矩陣按列歸一化
- 每一列分別求和,求和的結(jié)果除以n,得到列向量就是權(quán)重向量。
%算數(shù)平均法求權(quán)重
[n,~]=size(A);
Asum=sum(A,1);%按列求和
Aprogress=A./(ones(n,1)*Asum);
%求權(quán)重向量
W=sum(Aprogress,2)./n;
這里要注意的就是sum函數(shù),sum(A,1)是按列求和,sum(Aprogress,2)是按行求和的。默認是按列求和的。
matlab中sum函數(shù)的用法_matlab sum函數(shù)_一只佳佳怪的博客-CSDN博客https://blog.csdn.net/iii66yy/article/details/128474643
加權(quán)求和
最后就是對所有的指標進行加權(quán)求和了,得到最后的總評分。
gred=ing*W;
?當時我們是14個人,選了9個指標吧,也不知道是不是這樣寫的,最后就得到了這最后的一組數(shù)據(jù),就是他們14個人的綜合打分了,數(shù)值越大的就越優(yōu)秀了。
過程體會
不太知道是否正確,就記錄了整個的過程,下面是我自己對問題的理解:
為什么要對原始的指標進行歸一化處理?
因為不同指標之間的數(shù)量級不同。
為什么要設(shè)定判斷矩陣?
因為不同指標之間的側(cè)重不同,假設(shè)指標A比指標B更加能夠說明問題,那指標A肯定就比指標B更加重要一些。整個的設(shè)定過程本身就是主觀的,好比一道菜肴,有人認為營養(yǎng)更加重要,也有人認為味道更加重要,所以這個設(shè)定就是看個人的傾向,能通過一致性檢驗的矩陣就是滿足的矩陣。
為什么要用算術(shù)平均法求權(quán)重?文章來源:http://www.zghlxwxcb.cn/news/detail-530649.html
這個的話應(yīng)該還有其他的方法,這里用的是算術(shù)平均分求的,先對判斷矩陣進行歸一化之后,就算術(shù)平均得到權(quán)重,當做整個指標的權(quán)重了。最后剛好行列向量相乘,得到最終的得分矩陣。文章來源地址http://www.zghlxwxcb.cn/news/detail-530649.html
到了這里,關(guān)于層次分析法(MATLAB)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!