基于python的numpy和pandas库的灰色关联分析及可视化(含实例)

使用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
第二步,变量的无量纲化
  • 对变量进行预处理
    目的:去除量纲,缩小度量范围简化计算,便于比较
    处理:对母序列和子序列的每个指标进行预处理:
    常用方法: 标准化,归一化
  1. 标准化:
    x ∗ = ( x − μ ) / σ ( μ 为 均 值 , σ 为 标 准 差 ) x^* = (x - μ)/ σ (μ为均值,σ为标准差) x=(xμ)/σμσ
  2. 归一化:
    x ∗ = x − m i n ( x ) / m a x ( x ) − m i n ( x ) x^* = x - min(x)/ max(x) - min(x) x=xmin(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)| minminy(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)|为 maxmaxy(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=inξi(k)

实例

  • 为研究红酒各因素之间的影响,使用关联对其进行分析
    基于python的numpy和pandas库的灰色关联分析及可视化(含实例)_第1张图片
  • 代码(含注释)
# 导入可能要用到的库
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

基于python的numpy和pandas库的灰色关联分析及可视化(含实例)_第2张图片

# 无量纲化
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

基于python的numpy和pandas库的灰色关联分析及可视化(含实例)_第3张图片

# 结果可视化
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)
  • 最终结果可视化
    基于python的numpy和pandas库的灰色关联分析及可视化(含实例)_第4张图片

你可能感兴趣的:(数学建模,可视化,python,机器学习,数据挖掘,灰色关联分析)