1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
clear;clc load data_water_quality.mat
[n,m] = size(X); disp(['共有' num2str(n) '个评价对象, ' num2str(m) '个评价指标']) Judge = input(['这' num2str(m) '个指标是否需要经过正向化处理,需要请输入1 ,不需要输入0: ']);
if Judge == 1 Position = input('请输入需要正向化处理的指标所在的列,例如第2、3、6三列需要处理,那么你需要输入[2,3,6]: '); disp('请输入需要处理的这些列的指标类型(1:极小型, 2:中间型, 3:区间型) ') Type = input('例如:第2列是极小型,第3列是区间型,第6列是中间型,就输入[1,3,2]: '); for i = 1 : size(Position,2) X(:,Position(i)) = Positivization(X(:,Position(i)),Type(i),Position(i)); end disp('正向化后的矩阵 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_N = sum([(Z - repmat(min(Z),n,1)) .^ 2 ],2) .^ 0.5; S = D_N ./ (D_P+D_N); disp('最后的得分为:') stand_S = S / sum(S) [sorted_S,index] = sort(stand_S ,'descend')
function [posit_x] = Positivization(x,type,i)
if type == 1 disp(['第' num2str(i) '列是极小型,正在正向化'] ) posit_x = Min2Max(x); disp(['第' num2str(i) '列极小型正向化处理完成'] ) disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~') elseif type == 2 disp(['第' num2str(i) '列是中间型'] ) best = input('请输入最佳的那一个值: '); posit_x = Mid2Max(x,best); disp(['第' num2str(i) '列中间型正向化处理完成'] ) disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~') elseif type == 3 disp(['第' num2str(i) '列是区间型'] ) a = input('请输入区间的下界: '); b = input('请输入区间的上界: '); posit_x = Inter2Max(x,a,b); disp(['第' num2str(i) '列区间型正向化处理完成'] ) disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~') else disp('没有这种类型的指标,请检查Type向量中是否有除了1、2、3之外的其他值') end end
最大值 Intermax function [posit_x] = Inter2Max(x,a,b) r_x = size(x,1); M = max([a-min(x),max(x)-b]); posit_x = zeros(r_x,1); for i = 1: r_x if x(i) < a posit_x(i) = 1-(a-x(i))/M; elseif x(i) > b posit_x(i) = 1-(x(i)-b)/M; else posit_x(i) = 1; end end end
MId2max function [posit_x] = Mid2Max(x,best) M = max(abs(x-best)); posit_x = 1 - abs(x-best) / M; end
min2max function [posit_x] = Min2Max(x) posit_x = max(x) - x; end
|