草庐IT

【数学模型】灰色关联分析

老师我作业忘带了 2023-06-06 原文

灰色关联分析主要有两个作用:

  1. 进行系统分析
  2. 综合评价,就像之前学的层次分析、TOPSIS法。

文章目录

一、灰色关联分析概述

1.1 背景 

1.2 传统数理统计方法的不足之处

1.3 灰色关联分析基本思想

1.4 系统分析

二、应用1:系统分析

2.1 画出统计图  

2.2 确定分析数列

2.3 对变量进⾏预处理

2.4 计算子序列中各个指标与母序列的关联系数

2.5 计算灰色关联度

2.6 比较三个子序列和母序列的关联度得到结论

2.7 思考

1. 什么时候用标准化回归 , 什么时候用灰色关联分析 ?

2 . 如果母序列中有多个指标, 应该怎么分析 ?

三、用于综合评价问题 

3.1 正向化指标

3.2 对正向化后的矩阵进行预处理

3.3 将预处理后的矩阵每行取出最大值构成母序列(虚构的)

3.4 计算各个指标与母序列的灰色关联度

3.5 计算各个指标的权重

3.6 第k个评价对象的得分

3.7 对得分进行归一化

3.8 **代码

3.9 与熵权法修正的TOPSIS比较


一、灰色关联分析概述

1.1 背景 

一般的抽象系统,如社会系统、经济系统、农业系统、生态系统、教育系统等都包含有许多种因素,多种因素共同作用的结果决定了该系统的发展态势。人们常常希望知道在众多的因素中,哪些是主要因素,哪些是次要因素;哪些因素对系统发展影响大,哪些因素对系统发展影响小;哪些因素对系统发展起推动作用需强化发展,哪些因素对系统发展起阻碍作用需加以抑制;……这些都是系统分析中人们普遍关心的问题。例如,粮食生产系统,人们希望提高粮食总产量,而影响粮食总产量的因素是多方面的,有播种面积以及水利、化肥、土壤、种子、劳力、气候、耕作技术和政策环境等。为了实现少投入多产出,并取得良好的经济效益、社会效益和生态效益,就必须进行系统分析。

1.2 传统数理统计方法的不足之处

数理统计中的回归分析方差分析主成分分析等都是用来进行系统分析的方法。这些方法都有下述不足之处:

  • 要求有大量数据,数据量少就难以找出统计规律;
  • 要求样本服从某个典型的概率分布,要求各因素数据与系统特征数据之间呈线性关系且各因素之间彼此无关,这种要求往往难以满足;
  • 计算量大,一般要靠计算机帮助;
  • 可能出现量化结果与定性分析结果不符的现象,导致系统的关系和规律遭到歪曲和颠倒。

尤其是我国统计数据十分有限,而且现有数据灰度较大,再加上人为的原因,许多数据都出现几次大起大落,没有典型的分布规律。因此,采用数理统计方法往往难以奏效。
灰色关联分析方法弥补了采用数理统计方法作系统分析所导致的缺憾。它对样本量的多少和样本有无规律都同样适用,而且计算量小,十分方便,更不会出现量化结果与定性分析结果不符的情况。

注:数理逻辑方法才是主流,只不过本文介绍灰度关联。 

1.3 灰色关联分析基本思想

灰色关联分析的基本思想是根据序列曲线几何形状的相似程度来判断其联系是否紧密。曲线越接近,相应序列之间的关联度就越大,反之就越小。

1.4 系统分析

相当于找那个自变量x对y的影响最大。

对一个抽象的系统或现象进行分析,首先要选准反映系统行为特征的数据序列,称为找系统行为的映射量,用映射量来间接地表征系统行为。例如,用国民平均接受教育的年数来反映教育发达程度,用刑事案件的发案率来反映社会治安面貌和社会秩序,用医院挂号次数来反映国民的健康水平等。有了系统行为特征数据和相关因素的数据,即可作出各个序列的图形,从直观上进行分析。

--参考刘思峰. 灰⾊系统理论及其应⽤(第五版)

二、应用1:系统分析

例题:

下表为某地区国内生产总值的统计数据(以百万元计),问该地区从2000年到2005年之间哪一种产业对GDB总量印象最大。

年份国内生产总值第一产业第二产业第三产业
20001988386839763
20012061408846808
20022335422960953
2003275048212581010
2004335651115771268
2005380656118931352

2.1 画出统计图  

画图后得配上简单的分析 :

  • 四个变量均 呈上升 的趋势
  • 第⼆产业的增幅较为明显
  • 第⼆产业和第三产业的差距在后三年相差增大
  • 等等

2.2 确定分析数列

  • 母序列(又称参考数列 、母指标) : 能反映系统⾏为特征的数据序列 。类似于因变量 Y , 此处记为 X。
  • 子序列(又称⽐较数列、子指标) : 影响系统⾏为的因素组成的数据序列。类似于⾃变量X , 此处记为  。

在本例中国内⽣产总值就是母序列(  ) , 第一二三产业就是子序列(  )。

2.3 对变量进⾏预处理

两个目的:

  • 去量纲
  • 缩⼩变量范围简化计算 

对母序列和子序列中的每个指标进行预处理 :

  • 先求出每个指标的均值。
  • 再用该指标中的每个元素都除以其均值 。

预处理后:

年份国内生产总值第一产业第二产业第三产业
20000.73200.83610.68280.7439
20010.75880.88380.68850.7878
20020.85970.91410.78120.9292
20031.10251.04401.02370.9847
20041.23561.10691.28331.2363
20051.40131.21521.54051.3182

2.4 计算子序列中各个指标与母序列的关联系数

计算两极差:  

0.10410.04910.0119
0.12490.07030.0289
0.05430.07840.0694
0.03150.01120.0277
0.12870.04760.0006
0.18610.13910.0831
  • 两极最小差:
  • 两极最大差: 

其中向量(或矩阵)x0为母序列,x123为子序列,则有: b = 0.1861, a = 0.0006,即上三列中最大的数b和最小的数a。

定义:

其中  为分辨系数(一般取0.5),i=1,2,...,m ,k=1,2,...,n

则有:

0.47510.65860.8922
0.42980.57320.7679
0.63550.54610.5766
0.75200.89840.775
0.42230.66561.0000
0.33550.40350.5317

2.5 计算灰色关联度

定义:

也就是对上表每列求平均

灰色关联度结果为:[0.5084, 0.6242, 0.7572]   分别对应1 2 3 三个指标。

2.6 比较三个子序列和母序列的关联度得到结论

该地区在 2000年⾄ 2005年 间的国内⽣产总值受到第三产业影响最大 。 (其灰色关联度最大)

惊讶了,从图上来看应该是第二产业影响最大才对:

实际上,我们最开始提到过:灰色关联分析的基本思想是根据序列曲线几何形状的相似程度来判断其联系是否紧密。曲线越接近,相应序列之间的关联度就越大,反之就越小。我们计算的结果就可以看作是在计算相似程度。

2.7 思考

1. 什么时候用标准化回归 , 什么时候用灰色关联分析 ?

当样本个数较大时, ⼀般使用标准化回归 ; 当样本个数较少时, 才使用灰⾊关联分析 。

2 . 如果母序列中有多个指标, 应该怎么分析 ?

如   是母序列,是子序列,那么我们先计算 和  的灰度分析,在计算

 和  的灰度分析。

三、用于综合评价问题 

老面孔,我们上一章TOPSIS法做的题: 

题目:评价下表中20条河流的水质情况。

注:含氧量越高越好;PH值越接近7越好;细菌总数越少越好;植物性营养物量介于10‐20之间最佳,超过20或低于10均不好。

 X(n*m)  n=20个评价对象,m=4个评价指标。

3.1 正向化指标

之前TOPSIS所讲

含氧量越高越好;PH值越接近7越好;细菌总数越少越好;植物性营养物量介于10‐20之间最佳,超 过20或低于10均不好。

3.2 对正向化后的矩阵进行预处理

每一列除以这一列的均值,目的是去除量纲缩小计算范围。

3.3 将预处理后的矩阵每行取出最大值构成母序列(虚构的)

虚构出一个Y来作为母序列,其中Y为每行各个指标的最大值。

3.4 计算各个指标与母序列的灰色关联度

计算方法同上方案例:系统分析,得到

3.5 计算各个指标的权重

3.6 第k个评价对象的得分

3.7 对得分进行归一化

3.8 代码

import numpy as np
import pandas as pd

data = pd.read_excel('20条河流的水质情况数据.xlsx')
matrix = data.loc[:, '含氧量(ppm)':].values

# matrix第一列是极大型指标 我们对第二三四列进行正向化
# 注:正向化的公式不唯一,大家也可以结合自己的数据进行适当的修改。

# 正向化类,这里返回拷贝后的result,也可以直接在原矩阵上进行修改。
class Index_calculation:
    def __init__(self, array):
        # 初始化指标序列
        self.array = array

    # 极小型 --> 极大型
    def samll_to_big(self):
        max_num = max(self.array)
        result = max_num - self.array
        # result = 1/self.array
        return result

    # 中间型 --> 极大型
    def middle_to_big(self, best):
        M = max(abs(self.array - best))
        result = 1 - abs(self.array - best) / M
        return result

    # 区间型 --> 极大型
    def interval_to_big(self, a, b):
        M = max([a - min(self.array), max(self.array) - b])
        result = self.array.copy()
        result[result < a] = 1 - (a - result[result < a]) / M
        result[(a < result) & (result < b) | (result == a) | (result == b)] = 1
        result[result > b] = 1 - (result[result > b] - b) / M
        return result
    
if __name__ == '__main__':
    n,m = matrix.shape

    # PH值越接近7越好
    col_2 = matrix[:, 1]
    # 细菌总数越少越好
    col_3 = matrix[:, 2]
    # 植物性营养物量介于10‐20之间最佳,超过20或低于10均不好。
    col_4 = matrix[:, 3]

    # 正向化
    matrix[:, 1] = Index_calculation(col_2).middle_to_big(7)
    matrix[:, 2] = Index_calculation(col_3).samll_to_big()
    matrix[:, 3] = Index_calculation(col_4).interval_to_big(10, 20)    
    
    # 预处理
    x = matrix/ (np.sum(matrix,axis=0)/n)

    # 把预处理后的每行最大值构成母序列(虚构的)
    y = np.max(x,axis=1)
    
    # 极差矩阵
    array = y.reshape(n,1)-x # 其实都是非负的不用求绝对值

    # 关联系数
    a = np.min(array)
    b = np.max(array)

    # 灰色关联度
    grey_d = np.mean((a+0.5*b)/(array + 0.5*b),axis=0)
    
    # 权重
    weights = grey_d/np.sum(grey_d)
    
    # 归一化前的得分
    s = np.sum(x*weights,axis=1)
    
    # 归一化后的得分
    fin_s = s/np.sum(s)

3.9 与熵权法修正的TOPSIS比较

有关【数学模型】灰色关联分析的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  3. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  4. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  5. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  6. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  7. ruby-on-rails - 如何将验证与模型分开 - 2

    我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:

  8. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  9. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  10. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

随机推荐