目錄
- 理想解法
- 原理簡介
- 算法步驟
- 屬性值規范化方法
- 代碼示例
理想解法
原理簡介
?TOPSIS(Technique for Order Preference by Simi larity to IdealSolution)法是一種逼近理想解的排序方法。其基本的處理思路是:首先建立初始化決策矩陣,而后基于規范化后的初始矩陣,找出有限方案中的最優方案和最劣方案(也就是正、負理想解),然后分別計算各個評價對象與最優方案和最劣方案的距離,獲得各評價方案與最優方案的相對接近程度,最后進行排序,并以此作為評價方案優劣的依據。
?設多屬性決策方案集為 D = { d 1 , d 2 , . . . , d m } D=\left \{ d_1,d_2,...,d_m \right \} D={d1?,d2?,...,dm?},衡量方案優劣的屬性變量為 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1?,x2?,...,xn?。,這時方案集 D D D中的每個方案 d i ( i = 1 , 2 , ? , m ) d_i(i=1,2,?,m) di?(i=1,2,?,m)的 n n n個屬性值構成的向量是 [ a i 1 , a i 2 , . . . , a i n ] \left [ a_{i1},a_{i2},...,a_{in} \right ] [ai1?,ai2?,...,ain?],它作為 n n n維空間中的一個點,能唯一地表征方案 d i d_i di?。正理想解 C ? C^* C?是一個方案集 D D D中并不存在的虛擬的最佳方案,它的每個屬性值都是決策矩陣中該屬性的最優值;而負理想解 C 0 C^0 C0則是虛擬的最差方案,它的每個屬性值都是決策矩陣中該屬性的最差值。在 n n n維空間中,將方案集 D D D中的各備選方案 d i d_i di?.與正理想解 C ? C^* C?和負理想解 C 0 C^0 C0的距離進行比較,既靠近正理想解又遠離負理想解的方案就是方案集D中的最優方案,并可以據此排定方案集D中各備選方案的優先序。對比備選方案和理想解需要定義適合的距離測度,TOPSIS所用的是歐幾里得距離。
算法步驟
假設初始的決策矩陣 A A A為:
A = [ a 11 … a 1 j … a 1 n ? ? ? ? ? a i 1 … a i j … a i n ? ? ? ? ? a m 1 … a m j … a m n ] A=\begin{bmatrix} a_{11}& \dots& a_{1j}& \dots &a_{1n} \\ \vdots& \vdots& \vdots& \vdots&\vdots\\ a_{i1}& \dots& a_{ij}& \dots &a_{in}\\ \vdots& \vdots& \vdots& \vdots&\vdots\\ a_{m1}& \dots& a_{mj}& \dots &a_{mn}\\ \end{bmatrix} A=?????????a11??ai1??am1??…?…?…?a1j??aij??amj??…?…?…?a1n??ain??amn???????????
(1)對初始決策矩陣 A A A的所有備選方案的每一個屬性進行規范化處理,即對 A A A的每一個列向量 [ a 1 j , a 2 j , . . . , a m j ] T , j ∈ 1 , . . . , n \left [ a_{1j},a_{2j},...,a_{mj} \right ]^T,j\in 1,...,n [a1j?,a2j?,...,amj?]T,j∈1,...,n規范化處理得到規范化的決策矩陣 B = ( b i j ) m × n B=\left ( b_{ij} \right )_{m\times n} B=(bij?)m×n?.
b i j = a i j ∑ i = 1 m a i j 2 , i = 1 , . . . , m , j = 1 , . . . , n b_{ij}=\frac{a_{ij}}{\sqrt{\sum_{i=1}^{m}a_{ij}^2}},i=1,...,m,j=1,...,n bij?=∑i=1m?aij2??aij??,i=1,...,m,j=1,...,n
(2)構造加權規范陣,假設 n n n個屬性的權重構成的權重向量為 ω = [ ω 1 , ω 2 , . . . , ω n ] ? \omega=\left [ \omega_1,\omega_2,...,\omega_n \right ]^\top ω=[ω1?,ω2?,...,ωn?]?,將規范化的決策矩陣 B = ( b i j ) m × n B=\left ( b_{ij} \right )_{m\times n} B=(bij?)m×n?的每一行與權重向量對應相乘即得到加權規范陣 C = ( c i j ) m × n C=\left ( c_{ij} \right )_{m\times n} C=(cij?)m×n?。
c i j = b i j ? ω j , j = 1 , . . . , n , i = 1 , . . . , m c_{ij}=b_{ij}\ast \omega_j,j=1,...,n,i=1,...,m cij?=bij??ωj?,j=1,...,n,i=1,...,m
(3)確定正理想解 C ? C^* C?和負理想解 C 0 C^0 C0,對于成本型屬性,選擇最小值,對于效益型屬性,選擇最大值。遍歷 C C C的每一列 C j ( j = 1 , . . . , n ) C_j(j=1,...,n) Cj?(j=1,...,n),根據指標類型選擇每一列的最大值或最小值。
c j ? = { max ? { C j } , j 為 效 益 型 指 標 min ? { C j } , j 為 成 本 型 指 標 c_{j}^*=\begin{cases} \max\left \{ C_{j} \right \},j為效益型指標 \\ \min\left \{ C_{j} \right \},j為成本型指標 \end{cases} cj??={max{Cj?},j為效益型指標min{Cj?},j為成本型指標?
c j 0 = { min ? { C j } , j 為 效 益 型 指 標 max ? { C j } , j 為 成 本 型 指 標 c_{j}^0=\begin{cases} \min\left \{ C_{j} \right \},j為效益型指標 \\ \max\left \{ C_{j} \right \},j為成本型指標 \end{cases} cj0?={min{Cj?},j為效益型指標max{Cj?},j為成本型指標?
其中 c j ? , c j 0 c_j^*,c_j^0 cj??,cj0?分別表示正、負理想解的第 j j j個元素取值。
(4)計算各方案到兩個理想解的距離,即計算加權規范陣 C C C的每一行 C i ( i = 1 , . . . , m ) C_i(i=1,...,m) Ci?(i=1,...,m)與理想解 C ? , C 0 C^*,C^0 C?,C0的距離。
-
距離正理想解的距離 s i ? s_i^* si??
s i ? = ∑ j = 1 n ( c i j ? c j ? ) 2 s_i^*=\sqrt{\sum_{j=1}^{n}\left ( c_{ij}-c_j^* \right )^2 } si??=j=1∑n?(cij??cj??)2? -
距離負理想解的距離 s i 0 s_i^0 si0?
s i 0 = ∑ j = 1 n ( c i j ? c j 0 ) 2 s_i^0=\sqrt{\sum_{j=1}^{n}\left ( c_{ij}-c_j^0 \right )^2 } si0?=j=1∑n?(cij??cj0?)2?
(5)計算各方案的排序指標值,按照指標值大小確定方案排序
f i ? = s i 0 s i 0 + s i ? , i = 1 , . . . , m f_i^*=\frac{s_i^0}{s_i^0+s_i^*},i=1,...,m fi??=si0?+si??si0??,i=1,...,m
屬性值規范化方法
數據的預處理又稱屬性值的規范化。
作用:
- 在綜合評價之前將屬性的類型作一致化處理使得表中任-屬性下性能越優的方案變換后的屬性值越大;
- 在用各種多屬性決策方法進行分析評價時需要排除量綱的選用對決策或評估結果的影響;
- 為了便于采用各種多屬性決策與評估方法進行評價’需要把屬性值表中的數值歸一化,即把表中數值均變換到 [ 0 , 1 ] \left [ 0,1 \right ] [0,1]區間上。
常見方法:
設原始的決策矩陣為 A = ( a i j ) m × n A=\left ( a_{ij} \right )_{m\times n} A=(aij?)m×n?,變化后的決策矩陣為 B = ( b i j ) m × n B=\left ( b_{ij} \right )_{m\times n} B=(bij?)m×n?。
-
標準化處理
在實際問題中,不同變量的測量單位往往不同,為了消除量綱效應,使每個變量都具有同等的表現力,數據分析中常對數據進行標準化處理,即
b i j = a i j ? μ j s j , i = 1 , . . . , m , j = 1 , . . . , n b_{ij}=\frac{a_{ij}-\mu_{j}}{s_j},i=1,...,m,j=1,...,n bij?=sj?aij??μj??,i=1,...,m,j=1,...,n
其中 μ j = 1 m ∑ i = 1 m a i j \mu_{j}=\frac{1}{m}\sum_{i=1}^{m}a_{ij} μj?=m1?∑i=1m?aij?表示第 j j j列均值, s j = 1 m ? 1 ∑ i = 1 m ( a i j ? u j ) 2 s_j=\sqrt{\frac{1}{m-1}\sum_{i=1}^{m}\left ( a_{ij}-u_j \right )^2} sj?=m?11?∑i=1m?(aij??uj?)2?表示第 j j j列方差, j = 1 , . . . , n j=1,...,n j=1,...,n。 -
線性變換
-
效益型屬性
b i j = a i j a j m a x , j = 1 , . . . , n b_{ij}=\frac{a_{ij}}{a_j^{max}},j=1,...,n bij?=ajmax?aij??,j=1,...,n
其中 a j m a x a_j^{max} ajmax?表示決策矩陣 A A A第 j j j列的最大值。 -
成本型屬性
b i j = 1 ? a i j a j m a x , j = 1 , . . . , n b_{ij}=1-\frac{a_{ij}}{a_j^{max}},j=1,...,n bij?=1?ajmax?aij??,j=1,...,n
-
-
標準0-1變換
-
效益型屬性
b i j = a i j ? a j m i n a j m a x ? a j m i n , j = 1 , . . . , n b_{ij}=\frac{a_{ij}-a_j^{min}}{a_j^{max}-a_j^{min}},j=1,...,n bij?=ajmax??ajmin?aij??ajmin??,j=1,...,n
其中 a j m a x , a j m i n a_j^{max},a_j^{min} ajmax?,ajmin?分別表示初始的決策矩陣 A A A第 j j j列的最大值、最小值。 -
成本型屬性
b i j = a j m a x ? a i j a j m a x ? a j m i n , j = 1 , . . . , n b_{ij}=\frac{a_j^{max}-a_{ij}}{a_j^{max}-a_j^{min}},j=1,...,n bij?=ajmax??ajmin?ajmax??aij??,j=1,...,n
-
-
區間屬性變換
對于區間屬性,設第 j j j個屬性最優屬性區間為 [ a j 0 , a j ? ] \left [ a_j^0,a_j^* \right ] [aj0?,aj??],無法容忍下限為 a j l b a_j^{lb} ajlb?,無法容忍上限為 a j u b a_j^{ub} ajub?,則
b i j = { 1 ? ( a j 0 ? a i j ) ( a j 0 ? a j l b ) ,? a j l b ≤ a i j < a j 0 1 ,? a j 0 ≤ a i j ≤ a j ? 1 ? ( a i j ? a j ? ) ( a j u b ? a j ? ) ,? a j ? < a i j ≤ a j u b 0 ,? o t h e r b_{ij}=\begin{cases} 1-\frac{\left ( a_j^0-a_{ij} \right ) }{\left ( a_j^0-a_j^{lb} \right )} & \text{ , } a_j^{lb}\le a_{ij}< a_j^0 \\ 1& \text{ , } a_j^{0}\le a_{ij}\le a_j^* \\ 1-\frac{\left ( a_{ij}-a_{j}^* \right ) }{\left ( a_j^{ub}-a_j^{*} \right )}& \text{ , } a_j^*< a_{ij}\le a_j^{ub} \\ 0& \text{ , } other \end{cases} bij?=????????????????1?(aj0??ajlb?)(aj0??aij?)?11?(ajub??aj??)(aij??aj??)?0??,?ajlb?≤aij?<aj0??,?aj0?≤aij?≤aj???,?aj??<aij?≤ajub??,?other? -
向量規范化
b i j = a i j ∑ i = 1 m a i j 2 , j = 1 , . . . , n b_{ij}=\frac{a_{ij}}{\sqrt{\sum_{i=1}^{m}a_{ij}^2} },j=1,...,n bij?=∑i=1m?aij2??aij??,j=1,...,n
規范化后,各方案同一屬性值的平方和為1。
代碼示例
? ?假設現有5個高校的數據,需要根據這些數據對高校進行評估。
人均專著/(本/人) | 生師比 | 科研經費/(萬元每年) | 逾期畢業率/% | |
---|---|---|---|---|
1 | 0.1 | 5 | 5000 | 4.7 |
2 | 0.2 | 6 | 6000 | 5.6 |
3 | 0.4 | 7 | 7000 | 6.7 |
4 | 0.9 | 10 | 10000 | 2.3 |
5 | 1.2 | 2 | 400 | 1.8 |
? ?對上面的4個指標進行分析,人均專著、科研經費屬于效益型指標,逾期畢業率屬于成本型指標,而生師比屬于區間型指標,假設生師比最優區間為 [ 5 , 6 ] \left [ 5,6 \right ] [5,6],無法容忍下限為2,無法容忍上限為12,需要對其中一些指標進行轉換。給出python代碼如下:
import numpy as npA = np.array([[0.1, 5, 5000, 4.7],[0.2, 6, 6000, 5.6],[0.4, 7, 7000, 6.7],[0.9, 10, 10000, 2.3],[1.2, 2, 400, 1.8]])# 師生比的最優區間
opt_range = [5, 6]
# 師生比的容忍上下限
to_lb = 2
to_ub = 12# 屬性的權向量
omega = np.array([0.2, 0.3, 0.4, 0.1])# 對師生比進行區間屬性進行規范化處理
def range_trans(param, opt_range, lb, ub):""":param param: 待轉換的元素值:param opt_range: 最優區間:param lb: 無法容忍下限:param ub: 無法容忍上限:return:"""if lb <= param < opt_range[0]:return 1 - (opt_range[0] - param)/(opt_range[0] - lb)elif param <= opt_range[1]:return 1elif param <= ub:return 1 - (param - opt_range[1])/(ub - opt_range[1])else:return 0# Press the green button in the gutter to run the script.
if __name__ == '__main__':# 方案數m,屬性數nm, n = np.shape(A)# 對師生比作區間變換for i in range(m):A[i, 1] = range_trans(A[i, 1], opt_range, to_lb, to_ub)# 對逾期畢業率做標準0-1變換a4_max = max(A[:, 3])a4_min = min(A[:, 3])for i in range(m):A[i, 3] = (a4_max - A[i, 3])/(a4_max - a4_min)# 屬性進行向量規范化B = np.zeros([m, n])for i in range(m):for j in range(n):B[i, j] = A[i, j] / np.linalg.norm(A[:, j])# 構建加權規范陣omega_mat = np.tile(omega, (m, 1))C = B * omega_mat# 求正、負理想解。前兩個屬性以及第三個max_vec = np.amax(C, axis=0)min_vec = np.amin(C, axis=0)# 計算各方案與正、負理想解之間的距離res_array = np.zeros([m])for i in range(m):d0 = np.linalg.norm(max_vec - C[i, :])d1 = np.linalg.norm(min_vec - C[i, :])res_array[i] = d1/(d0 + d1)print(res_array.tolist())
運行結果如下:
[0.5240156414355697, 0.5725615802335773, 0.61086314578445, 0.7027067250301631, 0.32916727350419983]
從運行結果上來看,數值越大說明對該高校的評估結果越好,具體的排名為 [ 4 , 3 , 2 , 1 , 5 ] \left [ 4,3,2,1,5 \right ] [4,3,2,1,5],因此第4所高校總體來說評價最好。