GRA算法步骤

step1:确定参考序列 $x_0$ 和比较序列 $x_i$;

step2:对原始数据变换,将第 i 个属性的第 k 个数据 $x_i(k)$ 转换为 $y_i(k)$ 。方法有:

初值变换: $y_i(k) = \frac{x_i(k)}{x_i(1)}$.

均值变换: $y_i(k) = \frac{x_i(k)}{\overline{x}_i}$.

百分比变换(变换成小于1的数):$y_i(k) = \frac{x_i(k)}{\max_k {x}_i(k)}$ .

倍数变换(变换成大于1的数):$y_i(k) = \frac{x_i(k)}{\min_k {x}_i(k)}$ .

归一化变换:$y_i(k) = \frac{x_i(k)}{∑_k {x}_i(k)}$ .

区间变换:$y_i(k) = \frac{x_i(k) - \min_k {x}_i(k)}{\max_k {x}_i(k) - \min_k {x}_i(k)}$ .

step3:求绝对差序列,即比较序列与参考序列的差值 $△_{0i}(k) =|x_0(k)-x_i(k)| $ .

step4:使用下面公式计算灰关联系数,$γ(x_0(k),x_i(k))=\frac{△_{min}+ρ△_{max}}{△_{0i}(k)+ρ△_{max}}$,一般取分辨系数ρ=0.5。

step5:使用下面公式计算灰关联度,$γ(x_0,x_i)=\frac{1}{N}∑_{k=1}^N w_kγ(x_0(k),x_i(k)) $ ,wk为第k条数据权重。

step6:得到关键属性

如果参考序列 ${x_0}$ 为最优值数据列,那么灰关联度 $γ(x_0,x_i)$ 越大,则第 i 个属性越好;

如果参考序列 ${x_0}$ 为最劣值数据列,那么灰关联度 $γ(x_0,x_i)$ 越大,则第 i 个属性越不好;

GRA算法的Python实现

import numpy as np

import pandas as pd

import seaborn as sns

import matplotlib.pyplot as plt

from scipy.sparse import issparse

## 矩阵检查,必须是数据型,必须是二维的

def check_array(array, dtype="numeric"):

if issparse(array):

raise TypeError(‘PCA does not support sparse input.‘) # 不接受稀疏矩阵

if array.ndim != 2:

raise ValueError(‘Expected 2D array.‘) # 只接受二维矩阵

array = np.array(array, dtype=np.float64)

return array

class GRA():

def __init__(self, k=0, norm_method=‘norm‘, rho=0.5):

self.k = k

self.norm_method = norm_method

self.rho = rho

def fit(self, X, k=None):

‘‘‘ 与单个参考序列比较 ‘‘‘

if not k==None: self.k = k

X = check_array(X)

Y = self.__normalization(X) #归一化

self.r = self.__calculation_relevancy(Y)

return self.r

def fit_all(self, X):

‘‘‘ 所有序列依次为参考序列,互相比较 ‘‘‘

X = check_array(X)

self.data = np.zeros([X.shape[1], X.shape[1]])

for k in range(X.shape[1]):

self.k = k

Y = self.__normalization(X) #归一化

r = self.__calculation_relevancy(Y)

self.data[:,k] = r

return self.data

def __normalization(self, X):

if self.norm_method == ‘mean‘:

Y = self.__mean(X)

elif self.norm_method == ‘initial‘:

Y = self.__initial(X)

elif self.norm_method == ‘norm‘:

Y = self.__norm(X)

elif self.norm_method == ‘section‘:

Y = self.__section(X)

elif self.norm_method == ‘max‘:

Y = self.__max(X)

elif self.norm_method == ‘min‘:

Y = self.__min(X)

else:

raise ValueError("Unrecognized norm_method=‘{0}‘".format(self.norm_method))

print(Y)

return Y

def __norm(self, X):

Xsum = np.sum(X, axis=0)

for i in range(X.shape[1]):

X[:, i] = X[:, i]/Xsum[i]

return X

def __mean(self, X):

‘‘‘ 平均值归一化 ‘‘‘

Xmean = np.mean(X, axis=0, keepdims=True) #每一列的平均

for i in range(X.shape[1]):

X[:, i] = X[:, i]/Xmean[0][i]

return X

def __initial(self, X):

‘‘‘ 初值归一化 ‘‘‘

X0 = X[0,:]

for i in range(X.shape[1]):

X[:, i] = X[:, i]/X0[i]

return X

def __max(self, X):

‘‘‘ 百分比归一化 ‘‘‘

Xmax = np.max(X, axis=0)

for i in range(X.shape[1]):

X[:, i] = X[:, i]/Xmax[i]

return X

def __min(self, X):

‘‘‘ 倍数归一化 ‘‘‘

Xmin = np.min(X, axis=0)

for i in range(X.shape[1]):

X[:, i] = X[:, i]/(Xmin[i]+0.000001) #避免除数为零

return X

def __section(self, X):

Xmax = np.max(X, axis=0)

Xmin = np.min(X, axis=0)

for i in range(X.shape[1]):

X[:, i] = (X[:, i]-Xmin[i])/(Xmax[i]-Xmin[i])

return X

def __calculation_relevancy(self, X):

‘‘‘ 计算关联度 ‘‘‘

# 计算参考序列与比较序列差值

Delta = np.zeros((X.shape))

for i in range(X.shape[1]):

Delta[:, i] = np.fabs(X[:, i]-X[:, self.k])

# 计算关联系数

t = np.delete(Delta, self.k, axis=1)

mmax=t.max().max()

mmin=t.min().min()

ksi=((mmin+self.rho*mmax)/(Delta+self.rho*mmax))

# 计算关联度

r = ksi.sum(axis=0) / ksi.shape[0]

return r

def sort_comparison(self):

idxs = np.argsort(-self.r)

data = []

for idx in idxs:

if idx == self.k: continue

data.append([‘第{}个特征‘.format(idx), self.r[idx]])

df = pd.DataFrame(

data=np.array(data),

columns=[‘特征‘,‘相关度‘],

index=[f"{i+1}" for i in range(len(data))],

)

print(‘\n与第{}个特征相关度的从大到小排序:‘.format(self.k))

print(df)

return df

def ShowGRAHeatMap(self):

‘‘‘ 灰色关联结果矩阵可视化 ‘‘‘

df = pd.DataFrame(

data=self.data,

columns=[f"{i}" for i in range(self.data.shape[1])],

index=[f"{i}" for i in range(self.data.shape[0])],

)

colormap = plt.cm.RdBu

plt.figure()

plt.title(‘Pearson Correlation of Features‘)

sns.heatmap(df.astype(float), linewidths=0.1, vmax=1.0, square=True, cmap=colormap, linecolor=‘white‘, annot=True)

plt.show()

接口调用

test 1

import numpy as np

X = np.array([[0.732, 0.646, 0.636, 0.598, 0.627],

[0.038, 0.031, 0.042, 0.036, 0.043],

[0.507, 0.451, 0.448, 0.411, 0.122],

[0.048, 0.034, 0.030, 0.030, 0.031],

[183.25, 207.28, 240.98, 290.80, 370.00],

[24.03, 44.98, 62.79, 83.44, 127.22],

[85508, 74313, 85966, 100554, 109804],

[175.87, 175.72, 183.69, 277.11, 521.26],

[10, 13, 13, 1, 1],])

X=X.T # 每一行为一条记录,每一列为一个特征数据

print(X.shape)

print(X)

gra = GRA(k=0, norm_method=‘min‘)

r = gra.fit(X)

print(r)

gra.sort_comparison()

tese 2

from GRA import GRA

import numpy as np

X = np.array([[0.732, 0.646, 0.636, 0.598, 0.627],

[0.038, 0.031, 0.042, 0.036, 0.043],

[0.507, 0.451, 0.448, 0.411, 0.122],

[0.048, 0.034, 0.030, 0.030, 0.031],

[183.25, 207.28, 240.98, 290.80, 370.00],

[24.03, 44.98, 62.79, 83.44, 127.22],

[85508, 74313, 85966, 100554, 109804],

[175.87, 175.72, 183.69, 277.11, 521.26],

[10, 13, 13, 1, 1],])

gra = GRA(norm_method=‘initial‘)

data = gra.fit_all(X)

print(data)

gra.ShowGRAHeatMap()

参考:

原文:https://www.cnblogs.com/yejifeng/p/13152728.html

灰色关联方法matlab csdn,灰色关联分析法(GRA)实现相关推荐

  1. 灰色关联度分析法(GRA)_python

    灰色系统理论及其应用系列博文: 一.灰色关联度分析法(GRA)_python 二.灰色预测模型GM(1,1) 三.灰色预测模型GM(1,n) 四.灰色预测算法改进1-背景值Z 五.灰色预测改进2-三角 ...

  2. 利用Matlab进行灰色预测,利用matlab进行灰色预测.pdf

    利用matlab进行灰色预测,灰色预测matlab程序,灰色预测模型matlab,matlab灰色预测,matlab灰色预测代码,matlab灰色预测工具箱,灰色预测的matlab程序,matlab灰 ...

  3. 软件可靠性分析方法有失效模式影响分析法、严酷度分析法、故障树分析法、事件树分析法、潜在线路分析法

    研究 软件可靠性分析方法有失效模式影响分析法.严酷度分析法.故障树分析法.事件树分析法.潜在线路分析法 http://wenku.baidu.com/link?url=_XcuD0fStz39Doo5 ...

  4. MATLAB AHP AHP层次分析法code 自写代码 完美运行。 权重设计

    MATLAB AHP AHP层次分析法code 自写代码 完美运行. 权重设计 ID:5150612144581085YouthOG

  5. 数学建模常用算法—灰色关联分析法(GRA)

    解决问题 灰色关联分析的基本思想是根据序列曲线几何形状的相似程度来判断其联系是否紧密.曲线越接近,相应序列之间的关联度就越大,反之就越小. 一般的抽象系统,如社会系统.经济系统.农业系统.生态系统.教 ...

  6. 灰色关联分析法(GRA)-C++实现

    目录 1. 前言 2. 理论基础 3. 代码 1. 前言 最近小白在跟进一个项目,其中运用到了灰色关联分析法用来分析样本数据.同时在阅读了一些原理资料后,设计了一个模块化的C++程序(其实也不算模块化 ...

  7. 数据分析方法中的杜邦分析法

    我们在前面提到了5w2h方法,以及AARRR模型,5w2h就是5W2H分析法的内容,有7个单词组成,分别是What(用户要什么?)Why(为什么要?)Where(从哪儿得到?)When(我们什么时候做 ...

  8. 杜邦分析法、漏斗分析法和矩阵关联分析法

    数据分析工作涉及到很多的分析方法,比如说杜邦分析法.漏斗分析法以及矩阵关联分析法,这些方法都是能够帮助我们更好地进行数据分析工作.在这篇文章中我们就给大家介绍一下关于杜邦分析法.漏斗分析法和矩阵关联分 ...

  9. 目标层准则层MATLAB,层次分析法-MATLAB

    层次分析法-MATLAB 第八章 层次分析法 层次分析法(Analytic Hierarchy Process,简称AHP)是对一些较为复杂.较为模糊的问题作出决策的简易方法,它特别适用于那些难于完全 ...

最新文章

  1. 【读书笔记-数据挖掘概念与技术】聚类分析:基本概念和方法
  2. 墨瞳漫画h5一期 vuejs总结
  3. Receiver ED、Link quality indicator (LQI)、Clear channel assessment (CCA)究竟是什么?802.15.4标准
  4. 关于站库分离渗透思考总结
  5. DB2 乱码
  6. InfoQ宣布成立CNUT容器技术俱乐部 欲连接中国容器社区
  7. Wiwiz无线Web认证实现限速
  8. 开发经验分享_05_葫芦画瓢
  9. 百度的一道 java 高频面试题的多种解法
  10. NASM汇编语言与计算机系统11-9号与0X16号中断显示键盘输入(int)
  11. getX,getRawX,getWidth,getTranslationX等的区别
  12. js add方法_爬虫必备:Python 执行 JS 代码 —— PyExecJS、PyV8、Js2Py
  13. 安卓现盗号木马 威胁网银盗刷
  14. 使用advancedInstaller制作安装包无法成功添加图标或者(以及)赋予管理员权限
  15. 一位全减器逻辑电路图_半减器逻辑原理图 [全减器]
  16. 目标检测算法YOLO3论文解读
  17. 工作半年后,我总结了这十点工作经验!
  18. 信息时代的管理信息系统
  19. RTOS系统全Thumb编译+Neon加速火力全开
  20. 微型计算机的基本组成及各个部分的作用

热门文章

  1. 华三服务器序列号,H3C UIS服务器 FIST安装指导-6W101
  2. 数字货币,已成为理解现代经济不可排斥的一个因素
  3. 将py程序封装成exe应用程序
  4. 应届生工资怎么谈? 今天告诉你个概念叫整体报酬
  5. 流氓软件“拉法日历”近期活跃 多数来自下载站
  6. python写入excel文件 保存_python:写入 Excel 文档
  7. 【nuXmv学习笔记】3:模型检测流程
  8. Y6(YT699)加密狗软件锁开发工具
  9. iOS上架的20条注意事项,避免App被拒
  10. 题7.18:给出年,月,日。计算该天是该年的第几天。