数学建模:灰色关联分析

🔆 文章首发于我的个人博客:欢迎大佬们来逛逛

灰色关联分析法

算法流程

  1. 建立一个m行 n列的矩阵 X X X ,其中 m 表示评价对象, n表示评价指标
  2. 首先进行矩阵的归一化 ,得到归一化后的矩阵 d a t a data data
  3. 获取参考向量,即获取归一化后的矩阵的最大参考指标行 ,假设为 Y Y Y,即得到所有n个指标的最大值。
    1. 如果n表示评价指标,m表示评价对象,矩阵为 n ∗ m n*m n∗m ,则我们应该得到一个最大的参考指标列。
  4. 生成绝对值矩阵 A A A

A = ∣ X 1 − Y 1 ∣ A = ∣ x 4 − x 1 , x 5 − x 1 , x 6 − x 1 , x 7 − x 1 ∣ \begin{aligned}A&=|X_1-Y_1|\\A&=|x_4-x_1,x_5-x_1,x_6-x_1,x_7-x_1|\end{aligned} AA=∣X1−Y1∣=∣x4−x1,x5−x1,x6−x1,x7−x1∣

  1. 计算绝对值矩阵的最大值 d m a x d_{max} dmax和最小值 d m i n d_{min} dmin
  2. 计算灰色关联矩阵,假设为 B B B :其中 ρ \rho ρ 为一个分辨系数,设置为 0.5 为最佳。

B i j = d m i n + ρ d m a x A i j + ρ d m a x B_{ij}=\frac{d_{min}+\rho d_{max}}{A_{ij}+\rho d_{max}} Bij=Aij+ρdmaxdmin+ρdmax

  1. 分别计算最大与最小灰色关联度 ξ \xi ξ ,因此得到 ξ m i n \xi_{min} ξmin 与 ξ m a x \xi_{max} ξmax

ξ j = ∑ i = 1 m B i j m \xi_j=\frac{\sum_{i=1}^mB_{ij}}m ξj=m∑i=1mBij

  1. 计算评价总分:每个对象的 S c o r e j Score_j Scorej 如果与最大灰色关联度 ξ m a x \xi_{max} ξmax 越大,或者与最小灰色关联度 ξ m i n \xi_{min} ξmin 越大,则评价得分越高

S c o r e j = 1 1 + ( ξ j ( m i n ) / ξ j ( m a x ) ) 2 Score_j=\frac{1}{1+(\xi_j^{(min)}/\xi_j^{(max)})^2} Scorej=1+(ξj(min)/ξj(max))21

代码实现

matlab 复制代码
function [Score] = mfunc_GreyCorrelationAnalysis(data)
		% data表示一个 m * n 列的原始数据矩阵

    % 标准化mapminmax是对行操作的,因此转置一下,如果使用zscore(data)标准化则无须转置,但是无法标准化到0,1
    data1=mapminmax(data',0,1);%标准化到0.002-1区间
    % 
    data1=data1'; % mapminmax在再转置回来
    %
    V_max=max(data1);%最大参考指标行,指标最大
    V_min=min(data1);%最小参考指标行,指标最小

    % 与最大值的灰色关联度
    data2=abs(data1-V_max);
    %得到绝对值矩阵的全局最大值和最小值
    d_max=max(max(data2));
    d_min=min(min(data2));
    % 计算灰色关联矩阵
    a=0.5;   %分辨系数默认为0.5
    data3=(d_min+a*d_max)./(data2+a*d_max);
    %  计算灰色关联度
    xi_max=mean(data3'); %计算每个评价对象的灰色关联度,求mean平均值

    % 与最小值的灰色关联度
    data2=abs(data1-V_min);
    %得到绝对值矩阵的全局最大值和最小值
    d_max=max(max(data2));
    d_min=min(min(data2));
    data3=(d_min+a*d_max)./(data2+a*d_max);
    xi_min=mean(data3');

    % 综合评分
    %与最大相关系数越大,最小相关系数越小得分大
    Score=1./(1+(xi_min./xi_max)).^2;
    for i=1:length(Score)
        fprintf('第%d个投标者评分为:%4.2f\n',i,Score(i));   
    end
end
相关推荐
茗创科技2 小时前
Nature Mental Health | 基于皮层相似性网络分析,揭示神经性厌食症的神经机制
matlab·数据分析·脑网络
李日华大战鸡红6 小时前
滑膜观测器(学习记录)
stm32·单片机·学习·matlab·机器人
Martina_03217 小时前
AI生成3D场景导入 Unity/Unreal 后,NPC 总串层?用6步检查导航高度与跨层连接
人工智能·游戏·数学建模·3d·unity·自然语言处理·aigc
考研保研资料分享8 小时前
电子信息保研经验合辑:复旦直博与北邮集成电路,夏令营、预推免和专业面试
数学建模·面试·职场和发展·信息与通信
菜鸟~noob2339 小时前
【电子战】第21篇:扩展卡尔曼滤波(EKF)与动态跟踪【含matlab代码】
matlab·电子战
菜鸟~noob2331 天前
【电子战】第三季预告—波武器与电子系统强力毁伤
开发语言·数据库·matlab·电子战
菜鸟~noob2331 天前
【电子战】第20篇:凸优化与对数障碍法【含matlab代码】
开发语言·matlab
Evand J1 天前
【电机滤波例程1】PMSM永磁同步电机转速与位置估计,MATLAB程序:标准无迹卡尔曼滤波、模型说明与仿真验证
算法·matlab·电机·ekf·负载·卡尔曼滤波
Evand J1 天前
【电机滤波例程2】负载转矩增广扩展卡尔曼滤波(EKF)原理与MATLAB例程:五维PMSM状态与负载阶跃估计。订阅专栏后可查看完整代码
开发语言·matlab·电机·ekf·卡尔曼滤波
weixin_307779132 天前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab