灰色关联度与最大互信息系数的python简单实现

#coding:utf-8
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.sparse import issparse
import os
import gc
from minepy import MINE
np.random.seed(0)

"""
主要功能:
    1.两序列间灰色关联度分析
    2.两列间最大互信息关联度分析
"""

#两序列间灰色关联度分析
class Grey_Relation():
    def __init__(self,rho=0.5):
        self.rho = rho

    #执行函数
    def fit(self, X):
        """
        执行函数
        :param X: dataframe,共两列,其中第二列为参照列
        :return:
        """
        Y = self.__min(X)                        #归一化
        self.r = self.__calculation_relevancy(Y)
        return self.r

    #归一化
    def __min(self, X):
        """
        归一化
        :param X: dataframe,共两列,其中第二列为参照列
        :return:
            X: dataframe,归一化结果,共两列
        """
        Xmin = np.min(X, axis=0)
        for i in range(X.shape[1]):
            X[:, i] = X[:, i]/(Xmin[i]+0.000001) #避免除数为零
        return X

    #计算关联度
    def __calculation_relevancy(self, X):
        """
        计算关联度
        :param X: dataframe,共两列,其中第二列为参照列
        :return:
            关联度计算结果,float
        """
        # 计算参考序列与比较序列差值
        Delta = np.zeros((X.shape))
        for i in range(X.shape[1]):
            Delta[:, i] = np.fabs(X[:, i]-X[:, 1])
        # 计算关联系数
        t = np.delete(Delta, 1, 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

#两列间最大互信息关联度分析
class Mic__Relation():
    def __init__(self,alpha=None,C=None,est=None):
        self.alpha = alpha
        self.C = C
        self.est = est

    #计算互信息系数
    def fit(self,X):
        """
        计算最大互信息系数
        :param X: dataframe,共两列,其中第二列为参照列
        :return:
            最大互信息系数,float
        """
        mine = MINE(alpha=self.alpha, c=self.C, est=self.est)
        mine.compute_score(X[:, 0], X[:, 1])
        return mine.mic()


if __name__ == "__main__":
    #1.加载数据和列名
    data = pd.read_csv(r"C:\Users\Admin\Desktop\data.csv")  #读取数据表,列名为 [x1,x2,x3,y]
    cols = data.columns.tolist()[:-1]                       #读取数据框的列名列表,不含标签列,为[x1,x2,x3]

    #2.遍历每个待计算列与参照列的关联性
    for col in cols:                                        #对于每个xi
        X = data[col,"y"]                                   #X为dataframe,第2列为标签,即参照列

        #3.计算灰色关联度
        grey = Grey_Relation()                              #加载灰色关联度计算类
        r_grey = grey.fit(X)                                     #拟合关联度结果
        print("灰色关联度得分:",col,r_grey)                         #打印当前列计算结果

        #4.计算最大互信息
        mic = Mic__Relation()                               #加载灰色关联度计算类
        r_mic = mic.fit(X)                                     #拟合关联度结果
        print("最大互信息关联度得分:", col, r_mic)                       #打印当前列计算结果

参考文献:

灰色关联分析法(GRA)实现 - yejifeng - 博客园

minepy 包——基于最大信息的非参数估计_搬砖小工053的博客-CSDN博客_python minepy.mine 参数

你可能感兴趣的:(python,numpy,机器学习)