其他分享
首页 > 其他分享> > 三、数学建模之灰色关联分析【清风数学建模个人笔记】

三、数学建模之灰色关联分析【清风数学建模个人笔记】

作者:互联网

目录

灰色关联分析概述

应用一:进行系统分析

什么是系统分析

步骤

 代码

 应用二用于综合评价

步骤:


灰色关联分析概述

当样本个数n较大时使用标准化回归;当样本个数n较少时,才使用灰色关联分析

系统分析的方法:回归分析、方差分析、主成分分析等

灰色关联分析对样本量的多少和样本有误规律都同样适用,而且计算量小,十分方便,更不会出现量化结果与定性分析结果不相符的情况

灰色关联分析的基本思想是根据序列曲线几何形状的相似程度来判断其联系是否紧密。曲线越接近,相应序列之间的关联程度就越大,犯组织就越小

综合评价的方法:层次分析法,优劣解距离法等

应用一:进行系统分析

什么是系统分析

一般的抽象系统,如社会系统、经济系统、农业系统、生态系统、教育系统等都是多种因素共同作用的结果决定了该系统的发展态势。在这些众多因素中,哪些是主要因素,哪些是次要因素;哪些因素对系统发展影响大,哪些影响小;哪些因素对系统发展起推动作用需强化发展,哪些因素对系统发展起阻碍作用需加以抑制

步骤

例题:

下表为某地区国内生产总值的统计数据(以百万元计),问该地区从2000年到2005年之间哪一种产业对GDP总量影响最大。

年份

国内生产总值

第一产业

第二产业

第三产业

2000

1988

386

839

763

2001

2061

408

846

808

2002

2335

422

960

953

2003

2750

482

1258

1010

2004

3356

511

1577

1268

2005

3806

561

1893

1352

第一步画统计图

画图分析

第二步确定分析序列

第三步对变量进行预处理

先求出每个指标的均值,再用该指标中的每个元素都除以其均值

 目的:去量纲、缩小变量范围简化计算

第四步计算序列中各个指标与母序列的关联系数

 第五步计算灰色关联度

本例中n=6,m=3

两极最小差:每一个子序列与母序列作差后求绝对值

 灰色关联度:对第四步求出的关联度表格求算术平均值,该值为该子序列与母序列的灰色关联度

第六步比较三个子序列与母序列的关联度得出结论

美赛不推荐用 

 代码

load gdp.mat  % 导入数据 一个6*4的矩阵
% 不会导入数据的同学可以看看第二讲topsis模型,我们也可以自己在工作区新建变量,并把Excel的数据粘贴过来
% 注意Matlab的当前文件夹一定要切换到有数据文件的这个文件夹内
Mean = mean(gdp);  % 求出每一列的均值以供后续的数据预处理
gdp = gdp ./ repmat(Mean,size(gdp,1),1);  %size(gdp,1)=6, repmat(Mean,6,1)可以将矩阵进行复制,复制为和gdp同等大小,然后使用点除(对应元素相除),这些在第一讲层次分析法都讲过
disp('预处理后的矩阵为:'); disp(gdp)
Y = gdp(:,1);  % 母序列
X = gdp(:,2:end); % 子序列
absX0_Xi = abs(X - repmat(Y,1,size(X,2)))  % 计算|X0-Xi|矩阵(在这里我们把X0定义为了Y)
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)  % 计算子序列中各个指标与母序列的关联系数
disp('子序列中各个指标的灰色关联度分别为:')
disp(mean(gamma))

 应用二用于综合评价

例题:

步骤:

第五步相当于归一化,归一化后更方便分析

%% 灰色关联分析用于综合评价模型例题的讲解
clear;clc
load data_water_quality.mat
% 不会导入数据的同学可以看看第二讲topsis模型,我们也可以自己在工作区新建变量,并把Excel的数据粘贴过来
% 注意Matlab的当前文件夹一定要切换到有数据文件的这个文件夹内

%%  判断是否需要正向化
[n,m] = size(X);
disp(['共有' num2str(n) '个评价对象, ' num2str(m) '个评价指标']) 
Judge = input(['这' num2str(m) '个指标是否需要经过正向化处理,需要请输入1 ,不需要输入0:  ']);   %1

if Judge == 1
    Position = 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:区间型)
    % 第三个参数是告诉函数我们正在处理的是原始矩阵中的哪一列
    % 该函数有一个返回值,它返回正向化之后的指标,我们可以将其直接赋值给我们原始要处理的那一列向量
    end
    disp('正向化后的矩阵 X =  ')
    disp(X)
end

%% 对正向化后的矩阵进行预处理
Mean = mean(X);  % 求出每一列的均值以供后续的数据预处理
Z = X ./ repmat(Mean,size(X,1),1);  
disp('预处理后的矩阵为:'); disp(Z)

%% 构造母序列和子序列
Y = max(Z,[],2);  % 母序列为虚拟的,用每一行的最大值构成的列向量表示母序列【max()函数用法自己搜吧】
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') % 进行排序

标签:gdp,disp,Xi,建模,笔记,absX0,数学,序列,size
来源: https://blog.csdn.net/m0_58882109/article/details/122788679