赞
踩
声明:文章参考数学建模清风的网课编写。
灰色关联分析主要应用于系统分析,其原理是根据两序列图像几何形状的相似程度来判断两序列的关联程度。
如:分析各产业对生产总值的影响。
使用excel绘制图表:
母序列(又称参考数列、母指标):能反映系统行为特征的数据序列,类似于因变量y。
子序列(又称比较数列、子指标):影响系统行为因素组成的数据序列,类似于自变量x。
在如图的例子中,母序列就是生产总值x0,子序列就是第一x1、第二x2、第三产业x3。
预处理目的:统一量纲,简化数据。
预处理公式,每个元素除所在列平均值:
A ./ repmat(mean(A), n, 1)
两级最小差:
a = min( min( abs(x0(k) - xi(k))))
两级最大差:
b = max( max( abs(x0(k) - xi(k))))
关联系数:
gamma(x0(k), xi(k)) = (a + p*b) / (|x0(k) - xi(k)| + p*b)
p为分辨系数,通常取0.5
每一列的算术平均:
gamma(x0, xi) = sum(A) / n
评价子序列对母序列的影响时,子序列的个数较小时使用灰色关联分析。否则,使用回归分析。
灰色关联分析用于系统分析代码:
clear;clc % 灰色关联分析的输入为一个n*m的矩阵。 % 每一列是一个系统序列。第一列为母序列,其余列为子序列 A = input('请输入矩阵A:'); [n, m] = size(A); % 预处理 A = A ./ repmat(mean(A), n, 1); % 第一列即母序列 firs = repmat(A(:, 1), 1, m - 1); % 后m-1列即子序列 A = A(:, 2 : end); % 两级最小差 和 两级最大差 A = abs(A - firs); a = min(A(:)); b = max(A(:)); disp('两级最小差为:'); disp(a); disp('两级最大差为:'); disp(b); p = 0.5; % p为分辨系数,通常取0.5 % gamma 关联系数 gamma = sum((a + p*b) ./ (A + p*b)) ./ n; % 每一列指标的关联系数为, 关联系数越大和母序列相关性越强 disp('每一列指标的关联系数为:'); disp(gamma);
指标正向化,在Topsis中有详细讲解。链接Topsis。
极小型指标标准化代码(trans_min.m):
% 将极小型转化为极大型
function [C] = trans_min(A)
% A列向量,为极小型
C = max(A) - A;
end
中间型指标标准化代码(trans_mid.m):
% 将中间型转化为极大型
function [C] = trans_mid(A, a)
% A为待转化的中间型列向量
% a为中间值 如:ph = 7
M = max(abs(A - a));
C = 1 - abs(A - a) ./ M;
end
区间型指标标准化代码(trans_seg.m):
% 区间型转化为极大型 function [C] = trans_seg(A, s) % A为带转化的区间型列向量 % s(1)为区间左端点; s(2)为区间右端点 a = s(1); b = s(2); M = max(max(A) - b, a - min(A)); C = A; for i = 1 : size(A) if A(i) < a C(i) = 1 - (a - A(i))/M; elseif A(i) > b C(i) = 1 - (A(i) - b)/M; else C(i) = 1; end end end
预处理方法同上,预处理得到矩阵 Z Z Z。
取矩阵Z每一行的最大值构成母序列。
% 取每一行最大值构成一个列向量
max(A, [], 2)
计算方法同上,计算得到关联系数 g a m m a gamma gamma, g a m m a gamma gamma为一个行向量。
计算公式,每一个系数除以所有系数之和:
ω
i
=
g
a
m
m
a
i
∑
i
=
1
n
g
a
m
m
a
i
(
1
≤
i
≤
n
)
\omega_{i} = \frac{gamma_{i}}{\sum_{i=1}^{n} gamma_{i}} \ (1\le i \le n)
ωi=∑i=1ngammaigammai (1≤i≤n)
得分的计算公式,每一行乘对应权重并相加:
S
k
=
∑
j
=
1
m
Z
k
j
ω
j
(
1
≤
k
≤
n
)
S_{k} = \sum_{j= 1}^{m} Z_{kj} \ \omega_{j} \ \ \ \ (1\le k \le n)
Sk=j=1∑mZkj ωj (1≤k≤n)
对得分进行归一化,分数越高则评价越高:
s c o r e i = S i ∑ i = 1 n S i score_{i} = \frac{S_{i}}{\sum_{i=1}^{n} S_{i}} scorei=∑i=1nSiSi灰色关联分析用于评价类问题代码:
% clear;clc % 灰色关联分析的输入为一个n*m的矩阵。 % 每一列是一个待评价指标, 每一行为一个待评价对象 % A = input('请输入待评价元素构成的矩阵A(行为待评价对象, 列为评价指标):'); % 指标正向化 [n, m] = size(A); % 正向化 % 待正向化的列 col = input('请输入待正向化的列[]:'); for i = 1 : size(col, 2) kind = input(['请输入' num2str(col(i)) '列所属类型(1:极小型;2:中间型;3:区间型):']); % 列 c = col(i); if kind == 1 A(:, c) = trans_min(A(:, c)); elseif kind == 2 a = input('请输入中间型的中间值:'); A(:, c) = trans_mid(A(:, c), a); elseif kind == 3 s = input('请输入区间型的两个端点[a, b]:'); A(:, c) = trans_seg(A(:, c), s); else disp('输入类型有误!'); end end disp('正向化后的矩阵:'); disp(A); % 矩阵处理 Z = A ./ repmat(mean(A), n, 1); A = Z; % 构造虚拟母序列 firs = repmat(max(A, [], 2), 1, m); % 两级最小差 和 两级最大差 A = abs(A - firs); a = min(A(:)); b = max(A(:)); disp('两级最小差为:'); disp(a); disp('两级最大差为:'); disp(b); p = 0.5; % p为分辨系数,通常取0.5 % gamma 关联系数 gamma = sum((a + p*b) ./ (A + p*b)) ./ n; % 每一列指标的关联系数为 disp('每一列指标的关联系数为:'); disp(gamma); % 计算权重 wi = gamma ./ sum(gamma, 2); wi = repmat(wi, n, 1); % 计算权重并归一化 score = sum(Z .* wi, 2); % 归一化 score = score ./ sum(score); disp('最终得分为:'); disp(score); [score, ind] = sort(score, 'descend'); disp('最终排名为:'); disp(ind);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。