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