TOPSIS(逼近理想解)算法原理详解与代码实现
寫在前面:
個(gè)人理解:針對存在多項(xiàng)指標(biāo),多個(gè)方案的方案評價(jià)分析方法,也就是根據(jù)已存在的一份數(shù)據(jù),判斷數(shù)據(jù)中各個(gè)方案的優(yōu)劣。中心思想是首先確定各項(xiàng)指標(biāo)的最優(yōu)理想值(正理想值)和最劣理想值(負(fù)理想解),所謂正理想值是一設(shè)想的最好值(方案),它的的各個(gè)屬性值都達(dá)到各候選方案中最好的值,而負(fù)理想解是另一設(shè)想的最壞的值(方案),然后求出各個(gè)方案與正理想值和負(fù)理想值之間的加權(quán)歐氏距離,由此得出各方案與最優(yōu)方案的接近程度,作為評價(jià)方案的優(yōu)劣標(biāo)準(zhǔn),最后得到各個(gè)方案的優(yōu)劣值。
目錄
一、TOPSIS算法
1.1 TOPSIS算法的原理
1.2 TOPSIS算法的實(shí)現(xiàn)
二、數(shù)據(jù)預(yù)處理
2.1 數(shù)據(jù)正向化處理
2.1.1對于極小型指標(biāo)的正向化處理
2.1.2 對于中間型指標(biāo)的正向化處理
2.1.3對于區(qū)間型指標(biāo)的正向化處理
2.2數(shù)據(jù)標(biāo)準(zhǔn)化處理
三、TOPSIS算法實(shí)現(xiàn)
3.1最優(yōu)解與最劣解計(jì)算
3.2 TOPSIS評分計(jì)算
四、TOPSIS算法總結(jié)
4.1 TOPSIS算法實(shí)現(xiàn)步驟
五、TOPSIS算法示例與擴(kuò)展
5.1 TOPSIS算法示例
5.2 TOPSIS算法擴(kuò)展
六、程序源碼
?
?
由于本文發(fā)在知乎上,目前CSDN沒辦法直接導(dǎo)入文檔,所以本文可讀性很差。強(qiáng)烈建議點(diǎn)擊下面鏈接閱讀原文:
TOPSIS(逼近理想解)算法原理詳解與代碼實(shí)現(xiàn) - 子木的文章 - 知乎 https://zhuanlan.zhihu.com/p/266689519
TOPSIS(逼近理想解)算法原理詳解與代碼實(shí)現(xiàn) - 子木的文章 - 知乎
?
如有專業(yè)問題或者需要仿真可以點(diǎn)下面付費(fèi)咨詢鏈接。
知乎用戶?www.zhihu.com
?
一、TOPSIS算法
1.1 TOPSIS算法的原理
TOPSIS法(Technique for Order Preference by Similarity to Ideal Solution)可翻譯為逼近理想解排序法,國內(nèi)常簡稱為優(yōu)劣解距離法TOPSIS 法是一種常用的綜合評價(jià)方法,其能充分利用原始數(shù)據(jù)的信息,其結(jié)果能精確地反映各評價(jià)方案之間的差距。
為了對眾多方案給出一個(gè)排序,在給出所有方案之后,可以根據(jù)這些數(shù)據(jù),構(gòu)造出一個(gè)所有方案組成的系統(tǒng)中的理想最優(yōu)解和最劣解。而TOPSIS的想法就是,通過一定的計(jì)算,評估方案系統(tǒng)中任何一個(gè)方案距離理想最優(yōu)解和最劣解的綜合距離。如果一個(gè)方案距離理想最優(yōu)解越近,距離最劣解越遠(yuǎn),我們就有理由認(rèn)為這個(gè)方案更好。那理想最優(yōu)解和最劣解又是什么呢?很簡單,理想最優(yōu)解就是該理想最優(yōu)方案的各指標(biāo)值都取到系統(tǒng)中評價(jià)指標(biāo)的最優(yōu)值,最劣解就是該理想最劣方案的各指標(biāo)值都取到系統(tǒng)中評價(jià)指標(biāo)的最劣值。
理想最優(yōu)解中的數(shù)據(jù)都是各方案中的數(shù)據(jù),而不要選擇方案中沒有的數(shù)據(jù),理想最劣解同理。
如何衡量某一個(gè)方案與理想最優(yōu)解和最劣解的綜合距離呢?
TOPSIS基本思想是用下面這個(gè)表達(dá)式進(jìn)行衡量:
?
?
可以發(fā)現(xiàn),如果方案取到了理想最優(yōu)解,其表達(dá)式取值為1;如果方案取到了理想最劣解,其表達(dá)式取值為0。我們便可以用這個(gè)表達(dá)式來衡量系統(tǒng)中某一個(gè)方案距離理想最優(yōu)解和最劣解的綜合距離,也直接用它給方案進(jìn)行打分。
當(dāng)然這個(gè)公式只是一個(gè)基本的思路,實(shí)際上,為了更準(zhǔn)確與合理,會對該公式進(jìn)行優(yōu)化。
1.2 TOPSIS算法的實(shí)現(xiàn)
在了解TOPSIS算法的基本思想后就是對相應(yīng)參數(shù)的計(jì)算了,從上面的描述可以知道,除了要對該公式進(jìn)行改進(jìn)之外,因?yàn)樯婕暗綌?shù)據(jù)之間的比較,還需要對方案數(shù)據(jù)進(jìn)行處理,消除量綱以及范圍太大帶來的一系列問題。
二、數(shù)據(jù)預(yù)處理
2.1 數(shù)據(jù)正向化處理
在處理數(shù)據(jù)時(shí),有些指標(biāo)的數(shù)據(jù)越大越好,有些則是越小越好,有些又是中間某個(gè)值或者某段區(qū)間最好。我們可以對其進(jìn)行“正向化處理”,使指標(biāo)都可以像考試分?jǐn)?shù)那樣,越大越好。
將指標(biāo)分為四類,如下表所示。
?
四類指標(biāo)類型
正向化處理,就是將上述的四種指標(biāo)數(shù)據(jù)進(jìn)行處理,將其全部轉(zhuǎn)化為極大型指標(biāo)數(shù)據(jù),這樣我們計(jì)算時(shí)問題就少一點(diǎn),碼代碼時(shí)也更加統(tǒng)一。
2.1.1 對于極小型指標(biāo)的正向化處理
例如費(fèi)用,我們可以用
?
?將其轉(zhuǎn)化為極大型,如果所有元素都為正數(shù),也可以使用
?
2.1.2 對于中間型指標(biāo)的正向化處理
如果其最佳數(shù)值是
??,我們可以取
??,之后按照
?
轉(zhuǎn)化。
?
PH值正向化處理
2.1.3 對于區(qū)間型指標(biāo)的正向化處理
對于區(qū)間型指標(biāo),如果其最佳區(qū)間是[a,b],我們?nèi)?/p>
?,之后按照
?
轉(zhuǎn)化,示例如下。
?
區(qū)間型指標(biāo)正向化處理
至此,已將所有的數(shù)據(jù)都轉(zhuǎn)化為極大型數(shù)據(jù)了。
2.2 數(shù)據(jù)標(biāo)準(zhǔn)化處理
為了消除不同的數(shù)據(jù)指標(biāo)量綱的影響,我們還有必要對已經(jīng)正向化的矩陣進(jìn)行標(biāo)準(zhǔn)化。在概率統(tǒng)計(jì)中,標(biāo)準(zhǔn)化的方法一般是
??,不過這里我們不采用。記標(biāo)準(zhǔn)化后的矩陣為Z,其中
??,也就是
??。
對數(shù)據(jù)進(jìn)行了相應(yīng)的處理后,可以用向量
?來表達(dá)第i個(gè)方案。假設(shè)有n個(gè)待評價(jià)的方案,m個(gè)指標(biāo),此時(shí)
??。由這n個(gè)向量構(gòu)成的矩陣也就是我們的標(biāo)準(zhǔn)化矩陣Z了。
?
經(jīng)過了正向化處理和標(biāo)準(zhǔn)化處理的評分矩陣Z,里面的數(shù)據(jù)全部是極大型數(shù)據(jù)。
三、TOPSIS算法實(shí)現(xiàn)
3.1 最優(yōu)解與最劣解計(jì)算
經(jīng)過了正向化處理和標(biāo)準(zhǔn)化處理的評分矩陣Z,里面的數(shù)據(jù)全部是極大型數(shù)據(jù)。我們就可以從中取出理想最優(yōu)解和最劣解。因此我們?nèi)〕雒總€(gè)指標(biāo),即每一列中最大的數(shù),構(gòu)成理想最優(yōu)解向量,即
?
同理,取每一列中最小的數(shù)計(jì)算理想最劣解向量:
?
?
?就是
??,
??就是
??。
在得到理想最優(yōu)解和理想最劣解的基礎(chǔ)上就能計(jì)算每個(gè)方案的評分了。根據(jù)上面的距離評分公式:
?
對其進(jìn)行變型,也就是:
?
變型的目的是為了使用歐幾里得距離來衡量兩個(gè)方案的距離,變形前后分母的計(jì)算結(jié)果其實(shí)是不同的(因?yàn)檫@里zi是一個(gè)向量)。這樣更能體現(xiàn)出是綜合距離。否則所有方案計(jì)算得分時(shí)分母都是相同的,相當(dāng)于只衡量了分子,也就是距離最劣解的距離。
3.2 TOPSIS評分計(jì)算
于是計(jì)算距離評分:
對于第i個(gè)方案zi,我們計(jì)算它與最優(yōu)解的距離:
?
與最劣解的距離:
?
定義第i個(gè)方案的評分為Si:
?
也就是前面提到的綜合距離。
?
?,且
??越小,也就是該方案與最優(yōu)解的距離越小時(shí),
?
越大;相應(yīng)的,
?越小,也就是該方案與最劣解的距離越小時(shí),
?
越小。 為同時(shí)兼顧了該方案與最優(yōu)解與最劣解的距離的評分。
這個(gè)時(shí)候我們就有了每個(gè)方案的分?jǐn)?shù)了,按分?jǐn)?shù)排排序,就知道哪個(gè)方案比較好哪個(gè)方案比較差。
四、TOPSIS算法總結(jié)
4.1 TOPSIS算法實(shí)現(xiàn)步驟
1.將原始數(shù)據(jù)矩陣正向化。也就是將那些極小性指標(biāo),中間型指標(biāo),區(qū)間型指標(biāo)對應(yīng)的數(shù)據(jù)全部化成極大型指標(biāo),方便統(tǒng)一計(jì)算和處理。
2.將正向化后的矩陣標(biāo)準(zhǔn)化。也就是通過標(biāo)準(zhǔn)化消除量綱的影響。
3.計(jì)算每個(gè)方案各自與最優(yōu)解和最劣解的距離:
與最優(yōu)解的距離:
?
與最劣解的距離:
?
4.根據(jù)最優(yōu)解與最劣解計(jì)算得分并排序
?
五、TOPSIS算法示例
5.1 TOPSIS算法示例
對一個(gè)需要根據(jù)學(xué)生智商和情商進(jìn)行排名的數(shù)據(jù):原始數(shù)據(jù)矩陣如下
?
對其進(jìn)行正向化:
?
對其進(jìn)行標(biāo)準(zhǔn)化:
?
計(jì)算與最優(yōu)解和最劣解的距離:
?
最后計(jì)算得分給出排名:
?
這個(gè)例子告訴我們,成績很重要,但是情商更重要。小王雖然只考了60分,但也及格了,而且他從不與人爭吵,所以我們可以給他一個(gè)最好的評價(jià)。
5.2 TOPSIS算法擴(kuò)展
從上面計(jì)算各自與最優(yōu)解和最劣解的距離時(shí),我們看到,每一項(xiàng)指標(biāo)的權(quán)重是一樣的。
?
在實(shí)際問題中,不同的指標(biāo)重要程度可能是不一樣的。例如評獎學(xué)金的時(shí)候,成績往往是最重要的,之后還有參與活動分,志愿服務(wù)分等等,他們的權(quán)重又低一點(diǎn)。因此,在實(shí)際的應(yīng)用中,我們也可以給指標(biāo)進(jìn)行賦權(quán),將權(quán)重放到計(jì)算距離的公式中。
?
考慮權(quán)重后,不同指標(biāo)對最后的影響不一樣,考慮權(quán)重的評價(jià)往往是實(shí)際生活中很常見的一種評價(jià)方式。
關(guān)于權(quán)重的選取也有不同的方法,比如層次分析法(主觀給出)、熵權(quán)法等等。
六、程序源碼
TOPSIS.m程序
?clear all
clc
%% 導(dǎo)入數(shù)據(jù)
% (1)在工作區(qū)右鍵,點(diǎn)擊新建(Ctrl+N),輸入變量名稱為X
% (2)雙擊進(jìn)入X,輸入或拷貝數(shù)據(jù)到X
% (3)關(guān)掉這個(gè)窗口,點(diǎn)擊X變量,右鍵另存為,保存為mat文件
% (4)注意,代碼和數(shù)據(jù)要放在同一個(gè)目錄下哦,且Matlab的當(dāng)前文件夾也要是這個(gè)目錄。
load data_water_quality.mat
%% 數(shù)據(jù)預(yù)處理_正向化
[n,m] = size(X);
disp(['共有' num2str(n) '個(gè)評價(jià)對象, ' num2str(m) '個(gè)評價(jià)指標(biāo)'])
Judge = input(['這' num2str(m) '個(gè)指標(biāo)是否需要經(jīng)過正向化處理,需要請輸入1 ,不需要輸入0: ']);
if Judge == 1
Position = input('請輸入需要正向化處理的指標(biāo)所在的列,例如[2,3,6]: '); %[2,3,4]
disp('請輸入需要處理的這些列的指標(biāo)類型(1:極小型, 2:中間型, 3:區(qū)間型) ')
Type = input('例如[1,3,2]: '); %[2,1,3]
% 注意,Position和Type是兩個(gè)同維度的行向量
for i = 1 : size(Position,2)%對每一列進(jìn)行正向化處理
X(:,Position(i)) = Positivization(X(:,Position(i)),Type(i),Position(i));
% 第一個(gè)參數(shù)是要正向化處理的那一列向量 X(:,Position(i))
% 第二個(gè)參數(shù)是對應(yīng)的這一列的指標(biāo)類型(1:極小型, 2:中間型, 3:區(qū)間型)
% 第三個(gè)參數(shù)是告訴函數(shù)我們正在處理的是原始矩陣中的哪一列
% 返回值返回正向化之后的指標(biāo)
end
disp('正向化后的矩陣 X = ')
disp(X)
end
%% 數(shù)據(jù)預(yù)處理_標(biāo)準(zhǔn)化
Z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1);
disp('標(biāo)準(zhǔn)化矩陣 Z = ')
disp(Z)
%% 指標(biāo)權(quán)重賦值
disp("請輸入是否需要增加權(quán)重向量,需要輸入1,不需要輸入0")
Judge = input('請輸入是否需要增加權(quán)重: ');
if Judge == 1
disp(['有多少個(gè)指標(biāo)就輸入多少個(gè)權(quán)重?cái)?shù)(權(quán)重和為1),如[0.25,0.25,0.5]']);
weigh = input(['請輸入輸入' num2str(m) '個(gè)權(quán)重: ']);
if abs(sum(weigh) - 1)<0.000001 && size(weigh,1) == 1 && size(weigh,2) == m % 這里要注意浮點(diǎn)數(shù)的運(yùn)算是不精準(zhǔn)的。
else
weigh = input('你輸入的有誤,請重新輸入權(quán)重行向量: ');
end
else
weigh = ones(1,m) ./ m ; %如果不需要加權(quán)重就默認(rèn)權(quán)重都相同,即都為1/m
end
%% 計(jì)算與最大值的距離和最小值的距離,并算出得分
D_P = sum([(Z - repmat(max(Z),n,1)) .^ 2 ] .* repmat(weigh,n,1) ,2) .^ 0.5; % D+ 與最大值的距離向量
D_N = sum([(Z - repmat(min(Z),n,1)) .^ 2 ] .* repmat(weigh,n,1) ,2) .^ 0.5; % D- 與最小值的距離向量
S = D_N ./ (D_P+D_N); % 未歸一化的得分
disp('最后的得分為:')
stand_S = S / sum(S)% 歸一化的得分
[sorted_S,index] = sort(stand_S ,'descend')%對得分進(jìn)行排序并返回原來的位置
plot(sorted_S,'r-o')
xmin=1;xmax = size(sorted_S,1);
ymin = 0;ymax = max(sorted_S)+min(sorted_S);
axis([xmin xmax ymin ymax]); % 設(shè)置坐標(biāo)軸在指定的區(qū)間
grid on
xlabel('方案');ylabel('分?jǐn)?shù)');%坐標(biāo)軸表示對bai象標(biāo)簽
title('TOPSIS算法最終評分排序')
正向化處理函數(shù)Positivization.m程序
?function [posit_x] = Positivization(x,type,i)
% 輸入變量有三個(gè):
% x:需要正向化處理的指標(biāo)對應(yīng)的原始列向量
% type: 指標(biāo)的類型(1:極小型, 2:中間型, 3:區(qū)間型)
% i: 正在處理的是原始矩陣中的哪一列
% 輸出變量posit_x表示:正向化后的列向量
if type == 1 %極小型
disp(['第' num2str(i) '列是極小型,正在正向化'] )
posit_x = Min2Max(x); %調(diào)用Min2Max函數(shù)來正向化
disp(['第' num2str(i) '列極小型正向化處理完成'] )
disp('~~~~~~~~~~~~~~~~~~~~分界線~~~~~~~~~~~~~~~~~~~~')
elseif type == 2 %中間型
disp(['第' num2str(i) '列是中間型'] )
best = input('請輸入最佳的那一個(gè)值(中間的那個(gè)值): ');
posit_x = Mid2Max(x,best);
disp(['第' num2str(i) '列中間型正向化處理完成'] )
disp('~~~~~~~~~~~~~~~~~~~~分界線~~~~~~~~~~~~~~~~~~~~')
elseif type == 3 %區(qū)間型
disp(['第' num2str(i) '列是區(qū)間型'] )
a = input('請輸入?yún)^(qū)間的下界: ');
b = input('請輸入?yún)^(qū)間的上界: ');
posit_x = Inter2Max(x,a,b);
disp(['第' num2str(i) '列區(qū)間型正向化處理完成'] )
disp('~~~~~~~~~~~~~~~~~~~~分界線~~~~~~~~~~~~~~~~~~~~')
else
disp('沒有這種類型的指標(biāo),請檢查Type向量中是否有除了1、2、3之外的其他值')
end
end
以下面這個(gè)例子為例:
?
首先導(dǎo)入數(shù)據(jù),然后運(yùn)行程序,結(jié)果如下:
?
總結(jié)
以上是生活随笔為你收集整理的TOPSIS(逼近理想解)算法原理详解与代码实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实变函数与泛函分析课本pdf_实变函数与
- 下一篇: 骨干云池存储方式_你好,我存个对象(大误