代码如下
# -*- 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