目錄
引入
層次分析法的局限性
簡介
例子
想法1?
想法2 運用實際分數進行處理
想法3
問題?
擴展問題:增加指標個數
極大型指標與極小型指標
統一指標類型-指標正向化
標準化處理
計算公式
計算得分
?對原公式進行變化
升級到m個指標和n個對象
代碼?
第一步 將原始矩陣正向化
常見的四種指標
極小型-->極大型
中間型-->極大型
區間型-->極大型
第二步 正向化矩陣標準化
第三步 計算得分并歸一化
練習
思路
代碼
模型擴展——帶權重的TOPSISI
引入
層次分析法的局限性
1)評價的決策層不能太多,太多n太大,導致判斷矩陣和一致矩陣有差異
2)填數據
簡介
TOPSIS法(Technique for Order Preference by Similarity to Ideal Solution) 可翻譯為逼近理想解排序法,國內常簡稱為優劣解距離法。TOPSIS 法是一種常用的綜合評價方法,其能充分利用原始數據的信息, 其結果能精確地反映各評價方案之間的差距。
例子
想法1?
按排名,之間進行占比,如第一名-4-0.4,第二名-3-0.3
具備不合理,如果分數跨度過大,會出現嚴重不公平,例如如果最高分是99,最低分是10,而他們分數分布是0.4和0.1
想法2 運用實際分數進行處理
x - min / max - min
運用公式計算,然后進行歸一化
新問題:如果最后一面考60是0分,如果最后一名考10分還是零分
想法3
這樣就相對來說公平些
問題?
- 比較的對象不可能只有四個
- 比較的指標不會只有一個
- 很多指標不存在理論上的最大和最小值,例如GDP增速?
擴展問題:增加指標個數
不難發現,成績是越高越好,與他人爭吵次數是越低越好
極大型指標與極小型指標
越高越好的指標是極大型指標(效益型),越低越好的指標是極小型指標?(成本型)
統一指標類型-指標正向化
極小型指標轉化為及大型指標公式
max - x?
標準化處理
標準化處理就是在消去量綱,即消去不同指標的影響
計算公式
會看即可,即xij除以列向量里面每一個元素的平方和再開方?
計算得分
?對原公式進行變化
| x - min | / ( |?x + max |?+ |?x - min | )
升級到m個指標和n個對象
與最大/小值的距離,也就是兩點距離公式的推廣
代碼?
???
第一步 將原始矩陣正向化
常見的四種指標
- 極大型指標?
- 越大越好
- 成績、GDP增速、企業利潤
- 極小型指標
- 越小越好
- 費用、壞頻率、污染程度
- 中間型指標
- 接近某個中間值越好
- PH
- 區間型指標
- 落在某個區間越好
- 體溫
所謂的將原始矩陣正向化,就是要將所有的指標類型統一轉化為 極大型指標。 (轉換的函數形式可以不唯一 ? )
極小型-->極大型
最常用的還是` max - x `?
中間型-->極大型
?M指的是原值到中間值的距離的最大值
帶入公式即可
區間型-->極大型
a和b表示區間的端點,按上述公式進行求解即可
第二步 正向化矩陣標準化
消去不同指標量綱的影響
本文在前面有提到并附有代碼,不在贅述
第三步 計算得分并歸一化
練習
思路
這是一個評價問題,用topsis方法
按照上面講過的步驟進行:
第一步,正向化,一般默認化為極大型指標,含氧量-極大型,PH-中間型,細菌總數-極小型,植物性營養物量-區間型,所以后面三個指標需要正向化;編寫matlab,按照上面介紹的公式進行即可。
第二步,標準化
第三步,計算與最大值和最小值的距離并歸一化
看熟代碼,了解原理即可
代碼
[n,m] = size(X);
disp(['共有' num2str(n) '個評價對象, ' num2str(m) '個評價指標'])
Judge = input(['這' num2str(m) '個指標是否需要經過正向化處理,需要請輸入1 ,不需要輸入0: ']);if Judge == 1Position = 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是我們自己定義的函數,其作用是進行正向化,其一共接收三個參數% 第一個參數是要正向化處理的那一列向量 X(:,Position(i)) 回顧上一講的知識,X(:,n)表示取第n列的全部元素% 第二個參數是對應的這一列的指標類型(1:極小型, 2:中間型, 3:區間型)% 第三個參數是告訴函數我們正在處理的是原始矩陣中的哪一列% 該函數有一個返回值,它返回正向化之后的指標,我們可以將其直接賦值給我們原始要處理的那一列向量enddisp('正向化后的矩陣 X = ')disp(X)
end%% 對正向化后的矩陣進行標準化
Z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1);
disp('標準化矩陣 Z = ')
disp(Z)%% 計算與最大值的距離和最小值的距離,并算出得分
D_P = sum([(Z - repmat(max(Z),n,1)) .^ 2 ],2) .^ 0.5; % D+ 與最大值的距離向量
D_N = sum([(Z - repmat(min(Z),n,1)) .^ 2 ],2) .^ 0.5; % D- 與最小值的距離向量
S = D_N ./ (D_P+D_N); % 未歸一化的得分
disp('最后的得分為:')
stand_S = S / sum(S)
[sorted_S,index] = sort(stand_S ,'descend')
模型擴展——帶權重的TOPSISI
在前面計算得分時,我們都是默認指標的權重相同進行計算,而在實際運用中,應該時有權重關系的。
層次分析法的主觀性太強了,更推薦使用熵權法來進行客觀賦值。?后面會補充熵權topsis法