从0自学数学建模算法日记1.3--评价决策类——灰色关联

1.基础概念:

1.灰色系统:

灰色系统用颜色来描述一个系统所含信息量的大小,若说一个系统是白色的,即该系统信息完备,清晰。若为黑色,即该系统信息少。而处于白色与黑色之间,简单来说就是系统信息不完全,便用灰色系统来称呼。

“信息不完全”一般指:(1)系统因素不完全明确

                              (2)因素关系不完全清楚

                                (3)系统的结构不完全知道     

                              (4)系统的作用原理不完全明了

2.灰色系统的基础原理:

灰色系统理论是根据因素之间的发展态势相似程度来衡量其之间关联程度。

关联度:关联度是因素之间关联性大小的度量,它定量地描述了因素之间相对变化的情况。从思路上看,关联度分析属于几何处理范畴基本思想是根据序列曲线集合形状的相似程度来判断其联系是否紧密,即认为几何形状越接近,关联程度越大。因此,利用灰色关联度可对评价对象的优劣进行比较分析。

什么叫几何形状接近呢?

例:(图出自b站up莱布尼茨伯努利)

图中招商引资所呈现的曲线在发展态势上与总收入更为接近,则二者之间的关联度大,而农业招商发展态势与总收入并不太接近,则二者的关联度小

3.灰色系统理论的优势

由前面我们可以知道,灰色系统理论主要是利用已有信息来确定系统的末知信息,使系统由灰色系统理论主要是利用已知信息将“灰”变“白”。


且由于关联度分析方法是按发展趋势作分析,因此对样本量的多少没有要求,也不需要有典型(线性,指数,对数)的分布规律,只需算其发展趋势即可,判断关联度。而关联度分析方法的最大优点便是对数据的多与少并没有要求,即数据多与少都可以分析。(不会影响画出来的函数吗?)它大优点是它对数据量没有太高的的数学方法是非统计方法,在系统数据资料较少和条件不满足统计要求的情况下,更具有实用性。

简单来说:由于其是对发展趋势进行分析,对数据多少不做要求,且无论数据分布是否典型都可以使用。

4.灰色关联分析

灰色关联分析基于灰色系统理论,是一种多因素分析方法,不同于传统的数理统计分析方法,要求数据多,要求数据分布为典型等等等缺点。灰色关联分析,计算量小,且对数据分布不做要求,使用起来也方便。

2.实现的基础步骤

构建一个母序列,相关样本为子序列

例:(图出自b站up数模加油站)

国名生产总值便为母序列,工业产值与农业产值为子序列

1.数据处理:

1.正向化:将数据都化为极大型指标。(在熵权法中提到,这里不过多赘述)

2.预处理:每一个序列除于其数据对应的均值,目的是消除数据本身具有的量纲,预处理不影响其的发展趋势。

2..计算灰色关联系数:

\xi_i便是子序列指标对应母序列指标的灰色关联系数

其中:

简单理解,既母序列的指标的数值减去子序列对应指标的数值。

例:(此图数据为上图预处理后,但将年份放在行,项目放在了列)

而a,b的公式为

即为

中找到最小值与最大值给a,b(就是找这个矩阵中的最小值与最大值)

得到a,b后便可以计算每个指标对应的\xi_i

3..计算关联度:

利用此公式,便可以计算出该样本对应的子序列与母序列的关联度

3.代码

事先声明:我是将行看作样本,列看作指标对应的值,即一个样本的数据对应着一行,但由于在python中比较倾向于列的运算,在进行行运算时需要捋清楚其中的逻辑,而且在最后的表达上并不咋好看,所以计算这个的时候建议将样本放在列上,数据放在行上

1.输入矩阵

import numpy as np
A = np.array([[55,24,10],
              [65,38,22],
              [75,40,18],
              [100,50,20]])

2.正向化矩阵

(在熵权法中讲过,不过多赘述)

3.预处理

Mean = np.mean(A,axis=1)#行之内求均值
A =  np.transpose(A)
A = A / Mean
A =  np.transpose(A)

np.mean()为均值函数,axis=1为行之内求均值,即对每一行求出其的均值

由于得到的均值形成一个行向量Mean,而此时A/Mean,是列对列相除,此时我们求出A的转置,然后再除Mean再转置回去,就可以得到预处理后的A

4.得到|x0-xi|

#计算A的行数,1为列数,0为行数
row = A.shape[0]
col = A.shape[1]

for i in range(row -1):
    if i ==0:
        x = abs(A[0] - A[i+1])#第一行减去第二行,abs()为取绝对值函数
    else :
        y = abs(A[0] - A[i+1])
        x = np.vstack([x,y])#vstack()水平堆叠函数,用法与hstack()类似

5.获得a,b

a = np.min(x)#获得x中最小值
b = np.max(x)#获得x中最大值

若想获得每一列对应的最小(大)值,加个axis=0(行为1)即可,,如:np.min(x,axis=0)

6.计算关联度

p = 0.5#分辨系数
gamma = (a + p * b) / ( x+ p * b)

print("关联系数 \n{}".format(gamma))

r_0 = np.mean(gamma,axis=0)#求均值
r_1 = r_0.reshape(-1,1)
print("关联度:\n",r_1)

结果为

4.实际问题的解决:

由于在实际问题中,我们有时候并没有母序列,例如评价多个商品的好坏的时候,这个时候并没有母序列,而仅仅有多个商品的指标数据,这个时候我们要自己构建一个母序列,将商品与指标数据构成的矩阵中,将每一个指标的最大值拿出来构造母序列。

我们便可以分别拿出成本,销售情况,市场前景的最大值来构造母序列为{4,8,11},后续按照步骤一步步来即可

  • 40
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值