参考学习b站:数学建模学习交流
感觉这篇博客写的很好:灰色关联分析+Matlab代码实现
看完后自己尝试运行的一下,发现和自己本地的matlab代码运行结果不同,就把其中细节写到这篇博客里了
运行上述博客应用2的代码,将更多中间变量输出出来,得到结果:
请输入最佳的中间值:7
请输入区间的下界:10
请输入区间的下界:20
正向化后的矩阵为:
4.6900 0.7172 3.0000 1.0000
2.0300 0.4069 35.0000 0.6940
9.1100 0.5241 8.0000 0.9058
8.6100 0.9655 8.0000 0.4443
7.1300 0.6552 4.0000 0.6914
2.3900 0.8414 16.0000 0.6007
7.6900 0.8552 16.0000 0.6551
9.3000 0.8690 27.0000 0
5.4500 0.5724 49.0000 1.0000
6.1900 0.8138 37.0000 0.7848
7.9300 0.6345 45.0000 0.6992
4.4000 0.8069 37.0000 0.5419
7.4600 0.1448 31.0000 1.0000
2.0100 0 7.0000 0.4546
2.0400 0.5862 31.0000 1.0000
7.7300 0.4069 2.0000 1.0000
6.3500 0.6000 29.0000 0.1824
8.2900 0.0276 15.0000 1.0000
3.5400 0.8138 0 0.4088
7.4400 0.4897 46.0000 0.2731
a =
2.1526
b =
48.0900
各个指标对于母序列的灰色关联度为:
gamma =
0.6320 0.6323 0.6254 0.6326
各个指标的权重为:
weight =
0.2506 0.2507 0.2479 0.2508
******标准化后的矩阵为:
Z =
0.1622 0.2483 0.0245 0.3065
0.0702 0.1408 0.2863 0.2127
0.3150 0.1814 0.0655 0.2776
0.2977 0.3342 0.0655 0.1361
0.2466 0.2268 0.0327 0.2119
0.0826 0.2912 0.1309 0.1841
0.2659 0.2960 0.1309 0.2008
0.3216 0.3008 0.2209 0
0.1885 0.1981 0.4009 0.3065
0.2141 0.2817 0.3027 0.2405
0.2742 0.2196 0.3682 0.2143
0.1522 0.2793 0.3027 0.1661
0.2580 0.0501 0.2536 0.3065
0.0695 0 0.0573 0.1393
0.0705 0.2029 0.2536 0.3065
0.2673 0.1408 0.0164 0.3065
0.2196 0.2077 0.2373 0.0559
0.2867 0.0095 0.1227 0.3065
0.1224 0.2817 0 0.1253
0.2573 0.1695 0.3763 0.0837
Z_max =
0.3216 0.3342 0.4009 0.3065
Z_min =
0.0695 0 0 0
D_max =
0.2082
0.1751
0.1843
0.1879
0.2004
0.1913
0.1484
0.1785
0.0953
0.0841
0.0791
0.1236
0.1632
0.2832
0.1597
0.2163
0.1703
0.2143
0.2423
0.1429
D_min =
0.2032
0.1914
0.2091
0.2162
0.1796
0.1845
0.2145
0.2252
0.2771
0.2497
0.2602
0.2256
0.2214
0.0754
0.2232
0.1959
0.1766
0.1978
0.1566
0.2300
该矩阵得分为:
S =
0.4940
0.5223
0.5316
0.5350
0.4727
0.4910
0.5911
0.5578
0.7441
0.7481
0.7670
0.6460
0.5758
0.2102
0.5830
0.4754
0.5091
0.4800
0.3926
0.6167
矩阵归一化后得分为:
S =
0.0451
0.0477
0.0486
0.0489
0.0432
0.0449
0.0540
0.0510
0.0680
0.0684
0.0701
0.0590
0.0526
0.0192
0.0533
0.0434
0.0465
0.0439
0.0359
0.0564
但是我用下面的代码试了一下
%% 对正向化后的矩阵进行预处理
Mean = mean(X); % 求出每一列的均值
Z = X ./ repmat(Mean,size(X,1),1);
disp('预处理后的矩阵为:'); disp(Z)
%% 构造母序列和子序列
Y = max(Z,[],2); % 母序列为虚拟的,用每一行的最大值构成的列向量表示母序列
X = Z; % 子序列就是预处理后的数据矩阵
%% 计算得分
absX0_Xi = abs(X - repmat(Y,1,size(X,2))) % 计算|X0-Xi|矩阵
a = min(min(absX0_Xi)) % 计算两级最小差a
b = max(max(absX0_Xi)) % 计算两级最大差b
rho = 0.5; % 分辨系数取0.5
gamma = (a+rho*b) ./ (absX0_Xi + rho*b) % 计算子序列中各个指标与母序列的关联系数
weight = mean(gamma) / sum(mean(gamma)) % 利用子序列中各个指标的灰色关联度计算权重
score = sum(X .* repmat(weight,size(X,1),1),2); % 未归一化的得分
stand_S = score / sum(score); % 归一化后的得分
[sorted_S,index] = sort(stand_S ,'descend') % 进行排序
运行结果为:
正向化后的矩阵 X =
4.6900 0.7172 3.0000 1.0000
2.0300 0.4069 35.0000 0.6940
9.1100 0.5241 8.0000 0.9058
8.6100 0.9655 8.0000 0.4443
7.1300 0.6552 4.0000 0.6914
2.3900 0.8414 16.0000 0.6007
7.6900 0.8552 16.0000 0.6551
9.3000 0.8690 27.0000 0
5.4500 0.5724 49.0000 1.0000
6.1900 0.8138 37.0000 0.7848
7.9300 0.6345 45.0000 0.6992
4.4000 0.8069 37.0000 0.5419
7.4600 0.1448 31.0000 1.0000
2.0100 0 7.0000 0.4546
2.0400 0.5862 31.0000 1.0000
7.7300 0.4069 2.0000 1.0000
6.3500 0.6000 29.0000 0.1824
8.2900 0.0276 15.0000 1.0000
3.5400 0.8138 0 0.4088
7.4400 0.4897 46.0000 0.2731
预处理后的矩阵为:
0.7831 1.2228 0.1345 1.4997
0.3390 0.6937 1.5695 1.0408
1.5211 0.8936 0.3587 1.3584
1.4376 1.6461 0.3587 0.6662
1.1905 1.1170 0.1794 1.0369
0.3991 1.4345 0.7175 0.9008
1.2840 1.4580 0.7175 0.9825
1.5528 1.4815 1.2108 0
0.9100 0.9759 2.1973 1.4997
1.0336 1.3874 1.6592 1.1769
1.3241 1.0817 2.0179 1.0486
0.7347 1.3757 1.6592 0.8127
1.2456 0.2469 1.3901 1.4997
0.3356 0 0.3139 0.6818
0.3406 0.9994 1.3901 1.4997
1.2907 0.6937 0.0897 1.4997
1.0603 1.0229 1.3004 0.2735
1.3842 0.0470 0.6726 1.4997
0.5911 1.3874 0 0.6131
1.2423 0.8348 2.0628 0.4096
absX0_Xi =
0.7166 0.2769 1.3651 0
1.2306 0.8758 0 0.5287
0 0.6275 1.1624 0.1627
0.2085 0 1.2873 0.9799
0 0.0735 1.0111 0.1536
1.0354 0 0.7170 0.5336
0.1739 0 0.7405 0.4755
0 0.0714 0.3421 1.5528
1.2873 1.2214 0 0.6976
0.6256 0.2718 0 0.4823
0.6938 0.9362 0 0.9693
0.9245 0.2835 0 0.8465
0.2541 1.2528 0.1095 0
0.3462 0.6818 0.3679 0
1.1591 0.5003 0.1095 0
0.2090 0.8060 1.4100 0
0.2402 0.2775 0 1.0270
0.1155 1.4526 0.8270 0
0.7963 0 1.3874 0.7743
0.8205 1.2280 0 1.6532
a =
0
b =
1.6532
gamma =
0.5356 0.7491 0.3771 1.0000
0.4018 0.4855 1.0000 0.6099
1.0000 0.5684 0.4156 0.8355
0.7986 1.0000 0.3910 0.4576
1.0000 0.9183 0.4498 0.8433
0.4439 1.0000 0.5355 0.6077
0.8261 1.0000 0.5275 0.6348
1.0000 0.9205 0.7073 0.3474
0.3910 0.4036 1.0000 0.5423
0.5692 0.7526 1.0000 0.6315
0.5437 0.4689 1.0000 0.4603
0.4720 0.7446 1.0000 0.4941
0.7649 0.3975 0.8830 1.0000
0.7048 0.5480 0.6920 1.0000
0.4163 0.6230 0.8830 1.0000
0.7982 0.5063 0.3696 1.0000
0.7749 0.7486 1.0000 0.4460
0.8774 0.3627 0.4999 1.0000
0.5093 1.0000 0.3733 0.5163
0.5018 0.4023 1.0000 0.3333
weight =
0.2433 0.2482 0.2574 0.2511
sorted_S =
0.0703
0.0687
0.0659
0.0576
0.0572
0.0553
0.0549
0.0533
0.0529
0.0513
0.0509
0.0460
0.0458
0.0453
0.0449
0.0443
0.0437
0.0432
0.0321
0.0167
index =
9
11
10
12
20
7
13
15
8
3
4
2
17
1
18
16
5
6
19
14
上面仅列出了灰色关联分析的结果,发现a,b的值(全矩阵最小/大值)不太对
和:
之后看博主的代码,发现有些问题:
这里预处理后的矩阵应该是new_X
,而不是X
,改完后和下面代码结果的a
,b
值就一样了(0,1.6532)
,weight
也一样了(0.2433 ,0.2482,0.2574,0.2511)
那么修正后灰色关联分析归一化后的得分为(未排序):
stand_S =
0.0453
0.0460
0.0513
0.0509
0.0437
0.0432
0.0553
0.0529
0.0703
0.0659
0.0687
0.0576
0.0549
0.0167
0.0533
0.0443
0.0458
0.0449
0.0321
0.0572
这样问题得以解决