备战数学建模四之灰色关联分析

 

 

 

 代码如下

# -*- coding: utf-8 -*-
from sklearn.preprocessing import StandardScaler
import pandas as pd
import numpy as np
import os


class GraModel():
    '''灰色关联度分析模型'''

    def __init__(self, inputData, p=0.5, standard=True):
        '''
        初始化参数
        inputData:输入矩阵,纵轴为属性名,第一列为母序列
        p:分辨系数,范围0~1,一般取0.5,越小,关联系数间差异越大,区分能力越强
        standard:是否需要标准化
        '''
        self.inputData = np.array(inputData)
        self.p = p
        self.standard = standard
        # 标准化
        self.standarOpt()
        # 建模
        self.buildModel()

    def standarOpt(self):
        '''标准化输入数据'''
        if not self.standard:
            return None
        self.scaler = StandardScaler().fit(self.inputData)
        self.inputData = self.scaler.transform(self.inputData)

    def buildModel(self):
        # 第一列为母列,与其他列求绝对差,因为转置过了,输入数据的行是现在的列
        momCol = self.inputData[:, 0]
        #soncol是许多个列
        sonCol = self.inputData[:, 0:]
        for col in range(sonCol.shape[1]):
            sonCol[:, col] = abs(sonCol[:, col] - momCol)
        # 求两级最小差和最大差
        minMin = sonCol.min()
        maxMax = sonCol.max()
        # 计算关联系数矩阵
        cors = (minMin + self.p * maxMax) / (sonCol + self.p * maxMax)

        # 求平均综合关联度
        meanCors = cors.mean(axis=0)
        self.result = {'cors': {'value': cors.T, 'desc': '关联系数矩阵'}, 'meanCors': {'value': meanCors, 'desc': '平均综合关联系数'}}


if __name__ == "__main__":
    # # 路径目录
    # curDir = os.path.dirname(os.path.abspath(__file__))  # 当前目录
    # baseDir = os.path.dirname(curDir)  # 根目录
    # staticDir = os.path.join(baseDir, 'Static')  # 静态文件目录
    # resultDir = os.path.join(baseDir, 'Result')  # 结果文件目录
    # 读数
    data = [
        #第一行是参考序列,母列,也就是最优的情况
        #后面三行是数据行比较用
        [1, 1.1, 2, 2.25, 3, 4],
        [1, 1.166, 1.834, 2, 2.314, 3],
        [1, 1.125, 1.075, 1.375, 1.625, 1.75],
        [1, 1, 0.7, 0.8, 0.9, 1.2]
    ]
    #转置是因为函数一个中括号默认是处理列。
    data = np.array(data).T
    # 建模
    model = GraModel(data, standard=True)


    #2022.7.23日yzy将输出的关联矩阵改成了转置,因为认为要跟原来的对应,所以转置了一下,现在输出结果为第一行全是1为绝对关联。后面几行每一行求均值得到平均关联系数
    print(model.result)

运行结果:

{'cors': {'value': array([[1.        , 1.        , 1.        , 1.        , 1.        ,
        1.        ],
       [0.38904184, 0.43935281, 0.91607589, 0.8314419 , 0.56834387,
        0.33603536],
       [0.42089837, 0.54150955, 0.48582322, 0.8253056 , 0.44052199,
        0.35724299],
       [0.66666667, 0.66666667, 0.36363636, 0.5       , 0.8       ,
        0.33333333]]), 'desc': '关联系数矩阵'}, 'meanCors': {'value': array([1.        , 0.58004861, 0.51188362, 0.55505051]), 'desc': '平均综合关联系数'}}

进程已结束,退出代码0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值