使用python实现灰色关联分析及其可视化
- 在这里总结一下的数学建模常用的几种模型评估方法,这里讲的是使用python的Pandas库和高效的Numpy科学计算库实现。如果想看用Python实现的模型的灵敏度分析,可以看我上一篇博文,传送门: 模型灵敏度分析及可视化. 下面将详细介绍灰色关联度分析并一个实例结束文章。
灰色关联分析法
简介
- 灰色系统理论提出了对各子系统进行灰色关联度分析的概念,意图透过一定的方法,去寻求系统中各子系统(或因素)之间的数值关系。因此,灰色关联度分析对于一个系统发展变化态势提供了量化的度量,非常适合动态历程分析。
使用场景
- 适用于对于两个系统之间的因素,其随时间或不同对象而变化的关联性大小的量度,称为关联度。在系统发展过程中,若两个因素变化的趋势具有一致性,即同步变化程度较高,即可谓二者关联程度较高;反之,则较低。因此,灰色关联分析方法,是根据因素之间发展趋势的相似或相异程度,亦即“灰色关联度”,作为衡量因素间关联程度的一种方法。
具体计算步骤
第一步,确定分析数列
- 确定反映系统行为特征的参考数列和影响系统行为的比较数列。反映系统行为特征的数据序列,称为参考数列。影响系统行为的因素组成的数据序列,称比较数列。
(1)参考数列(又称母序列):能反映系统行为特征的数据序列,类似于因变量Y
Y = Y ( k ) ∣ k = 1 , 2... n ; Y=Y(k)∣k=1,2...n; Y=Y(k)∣k=1,2...n;
(2)比较数列(又称子序列):影响系统行为的因素组成的数据序列,类似于自变量X
X i = X i ( k ) ∣ k = 1 , 2... n , i = 1 , 2... m Xi=Xi(k)∣k=1,2...n, i=1,2...m Xi=Xi(k)∣k=1,2...n,i=1,2...m
第二步,变量的无量纲化
- 对变量进行预处理
目的:去除量纲,缩小度量范围简化计算,便于比较
处理:对母序列和子序列的每个指标进行预处理:
常用方法: 标准化,归一化
- 标准化:
x ∗ = ( x − μ ) / σ ( μ 为 均 值 , σ 为 标 准 差 ) x^* = (x - μ)/ σ (μ为均值,σ为标准差) x∗=(x−μ)/σ(μ为均值,σ为标准差) - 归一化:
x ∗ = x − m i n ( x ) / m a x ( x ) − m i n ( x ) x^* = x - min(x)/ max(x) - min(x) x∗=x−min(x)/max(x)−min(x)
第三步,计算关联系数
上式中,
ξ
(
k
)
ξ(k)
ξ(k)为
x
i
x^i
xi对
y
(
k
)
y(k)
y(k)在
k
k
k点的关联系数;
∣
y
(
k
)
−
x
i
(
k
)
∣
|y(k)-x_i(k)|
∣y(k)−xi(k)∣为第
k
k
k点
y
y
y与
x
i
x_i
xi的绝对差;
m
i
n
m
i
n
∣
y
(
k
)
−
x
i
(
k
)
∣
min\,min|y(k)-x_i(k)|
minmin∣y(k)−xi(k)∣为
y
y
y数列与
x
i
x_i
xi的数列在
k
k
k点的二级最小差数绝对值,
m
a
x
m
a
x
∣
y
(
k
)
−
x
i
(
k
)
∣
为
max\,max|y(k)-x_i(k)|为
maxmax∣y(k)−xi(k)∣为y
数
列
与
数列与
数列与x_i的数列在
k
k
k点的二级最大差数绝对值,
ρ
\rho
ρ为灰色分析系数,取值0~1,一般取0.5。将各性状的关联系数代入公式,可求出
x
i
x_i
xi与
y
(
k
)
y(k)
y(k)的关联度
r
i
r_i
ri:
r i = 1 n ∑ k = i n ξ i ( k ) r_i = \frac{1}{n} \sum^{n}_{k=i}\xi_i(k) ri=n1k=i∑nξi(k)
实例
- 为研究红酒各因素之间的影响,使用关联对其进行分析
- 代码(含注释)
# 导入可能要用到的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# 读取数据
wine = pd.read_excel("C:/Users/Administrate/Desktop/wine.xls",index_col=0)
wine
# 无量纲化
def dimensionlessProcessing(df_values,df_columns):
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
res = scaler.fit_transform(df_values)
return pd.DataFrame(res,columns=df_columns)
# 求第一列(影响因素)和其它所有列(影响因素)的灰色关联值
def GRA_ONE(data,m=0): # m为参考列
# 标准化
data = dimensionlessProcessing(data.values,data.columns)
# 参考数列
std = data.iloc[:,m]
# 比较数列
ce = data.copy()
n = ce.shape[0]
m = ce.shape[1]
# 与参考数列比较,相减
grap = np.zeros([n,m])
for i in range(m):
for j in range(n):
grap[j,i] = abs(ce.iloc[j,i] - std[j])
# 取出矩阵中的最大值和最小值
mmax = np.amax(grap)
mmin = np.amin(grap)
ρ = 0.5 # 灰色分辨系数
# 计算值
grap = pd.DataFrame(grap).applymap(lambda x:(mmin+ρ*mmax)/(x+ρ*mmax))
# 求均值,得到灰色关联值
RT = grap.mean(axis=0)
return pd.Series(RT)
# 调用GRA_ONE,求得所有因素之间的灰色关联值
def GRA(data):
list_columns = np.arange(data.shape[1])
df_local = pd.DataFrame(columns=list_columns)
for i in np.arange(data.shape[1]):
df_local.iloc[:,i] = GRA_ONE(data,m=i)
return df_local
data_gra = GRA(data)
data_gra
# 结果可视化
import seaborn as sns # 可视化图形调用库
import matplotlib.pyplot as plt
%matplotlib inline
def ShowGRAHeatMap(data):
# 色彩集
colormap = plt.cm.RdBu
plt.figure(figsize=(18,16))
plt.title('Person Correlation of Features',y=1.05,size=18)
sns.heatmap(data.astype(float),linewidths=0.1,vmax=1.0,square=True,\
cmap=colormap,linecolor='white',annot=True)
plt.show()
ShowGRAHeatMap(data_gra)
- 最终结果可视化