2024年大数据最全【数学模型】层次分析_数学建模层次分析法例题及答案(5),为什么大数据开发能最好地改变大数据开发

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

4c6dc5c85be54ae08bdf4b4df3c64b45.png

从上图我们可以发现,当a=4也就是上方刚开始介绍的一致矩阵,此时最大特征值最小,为3=n也就是矩阵的阶数。若a不为4,或a离4越来越远,不一致现象越明显,则其特征值也递增。

1.2.1 一致性检验的步骤
  1. 计算一致性指标CI

gif.latex?%5Cdpi%7B100%7D%20CI%3D%5Cfrac%7B%5Clambda%20_%7Bmax%7D-n%7D%7Bn-1%7D

  1. 查下表找对应的平均随机一致性指标RI
n123456789101112131415
R000.520.891.121.261.361.411.461.491.521.541.561.581.59

注:在实际运用中,n很少超过10,如果指标的个数大于10,则可考虑建立 二级指标体系,或使用我们以后要学习的模糊综合评价模型。

  1. 计算一致性比例CR

gif.latex?%5Cdpi%7B100%7D%20CR%3D%5Cfrac%7BCI%7D%7BRI%7D

如果CR < 0.1,  则可认为判断矩阵的一致性可以接受;

否则需要对判断矩阵进行修正。

1.3 根据一致性正互反矩阵计算权重

以下表为例,虽然不是一致矩阵,但它的CR<0.1,我们选择接受不做调整。

(CR>0.1如何调整在后面)。

景色城市A城市B城市C
城市A125
城市B1/212
城市C1/51/21

我们取出第一列,做归一化处理(城市ABC对于城市A的重要性是1、1/2、1/4)。

  • 城市A = 1 /(1+0.5+0.2) = 0.5882
  • 城市B = 0.5/(1+0.5+0.2) = 0.2941
  • 城市C = 0.2/(1+0.5+0.2) =  0.1177

之后我们拿出二三列重复上面操作:

  • 城市A = 2 /(2+1+0.5) =  0.5714

  • 城市B = 1/(2+1+0.5) =  0.2857

  • 城市C = 0.5/(2+1+0.5) =  =  0.1429

  • 城市A = 5 /(5+2+1) = 0.625

  • 城市B = 2/(5+2+1) =  0.25

  • 城市C = 1/(5+2+1) =   0.125

这样我们得到三组权重:

法1:算术平均求权重:

  1. 第一步:将判断矩阵按照列归一化 (每一个元素除以其所在列的和)
  2. 第二步:将归一化的各列相加(按行求和)
  3. 第三步:将相加后得到的向量中每个元素除以n即可得到权重向量
  • 城市A = (0.5882+0.5714+0.625)/3=0.5949
  • 城市B = (0.2941+0.2857+0.25)/3=0.2766
  • 城市C = (0.1177+0.1429+0.125)/3=0.1285

法2:几何平均法求权重

  1. 第一步:将A的元素按照行相乘得到一个新的列向量
  2. 第二步:将新的向量的每个分量开n次方
  3. 第三步:对该列向量进行归一化即可得到权重向量
  • 城市A = 0.5954
  • 城市B = 0.2764
  • 城市C = 0.1283

法3:特征值法求权重

假如我们的判断矩阵一致性可以接受,那么我们可以仿照一致矩阵权重的求法。

一致矩阵有一个特征值为n,其余特征值均为0。

  1. 第一步:求出矩阵A的最大特征值以及其对应的特征向量
  2. 第二步:对求出的特征向量进行归一化即可得到我们的权重
景色城市A城市B城市C
城市A125
城市B1/212
城市C1/51/21

该表最大特征值为3.0055,一致性比例CR=0.0053,对应的特征向量:[-0.8902,-0.4132,-0.1918],对其进行归一化:[0.5954,0.2764,0.1283]

算术平均法几何平均法特征值法
城市A0.59490.59540.5954
城市B0.27660.27640.2764
城市C0.12850.12830.1283

我们大多数情况下使用特征值法,将其带入初始要填的表:

权重城市A城市B城市C
景色0.59540.27640.1283
花费
居住
饮食
交通

同理这些空着的地方都可以使用同样的方式。

此时,我们终于得到了这个判断矩阵:

权重城市A城市B城市C
景色0.26360.59540.27640.1283
花费0.47580.08190.23630.6817
居住0.05380.42860.42860.1429
饮食0.09810.63370.19190.1744
交通0.10870.16670.16670.6667

城市A最终得分:0.299

城市B最终得分:0.245

城市C最终得分:0.455

所以最后去城市C旅游。

二、层次分析法

层次分析法(The Analytic Hierarchy Process即 AHP)是由美国运筹学家、 匹兹堡大学教授T . L. Saaty于20世纪70年代创立的一种系统分析与决策的综合 评价方法,是在充分研究了人类思维过程的基础上提出来的,它较合理地解 决了定性问题定量化的处理过程。

AHP的主要特点是通过建立递阶层次结构,把人类的判断转化到若干因 素两两之间重要度的比较上,从而把难于量化的定性判断转化为可操作的重 要度的比较上面。在许多情况下,决策者可以直接使用AHP进行决策,极大 地提高了决策的有效性、可靠性和可行性,但其本质是一种思维方式,它把 复杂问题分解成多个组成因素,又将这些因素按支配关系分别形成递阶层次 结构,通过两两比较的方法确定决策方案相对重要度的总排序。整个过程体 现了人类决策思维的基本特征,即分解、判断、综合,克服了其他方法回避 决策者主观判断的缺点

步骤:

**1.**分析系统中各因素之间的关系,建立系统的递阶层次结构.

8dc2f3745a6f4acf82d0c61da65b60f2.png

5bc00cad19ba42169ace08821a913baa.png

注意:如果你用到了层次分析法,那么上面这个层次结构图要放在你的建模论文中哦。

**2.**对于同一层次的各元素关于上一层次中某一准则的重要 性进行两两比较,构造两两比较矩阵(判断矩阵)。

看看优秀论文的做法吧:

be2ef71f4f1842278e79280a5dc529dd.png

【2008年国赛B题一等奖】  关于高等教育学费标准的评价及建议

a63339e011e940d4a32be1192a325c79.png

【2016年国赛MATLAB创新奖B题】中国人民大学‐小区开放道路通行影响

4348e171c77b4f509aa8acf2413b874a.png

准则层—方案层的判断矩阵的数值要结合实际来填写,如果题目中有其他数据, 可以考虑利用这些数据进行计算。

例如:有一个指标是交通安全程度,现在要比较开放小区、半开放小区和封闭小区,而且 你收集到了这些小区车流量的数据,那么就可以根据这个数据进行换算作为你的判断矩阵。

3. 由判断矩阵计算被比较元素对于该准则的相对权重, 并进行一致性检验(检验通过权重才能用)

CR<0.1通过后,三种3方法计算权重:算术平均、几何平均、特征值法。

建议大家在比赛时三种方法都使用

以往的论文利用层次分析法解决实际问题时,都是采用其中某一种方法求权重,而不同的计算方法可能会导致结果有所偏差。为了保证结果的稳健性,本文采用了三种方法分别求出了权重后计算平均值,再根据得 到的权重矩阵计算各方案的得分,并进行排序和综合分析,这样避免了 采用单一方法所产生的偏差,得出的结论将更全面、更有效。

注:

  • 一致矩阵不需要进行一致性检验,只有非一致矩阵的判断矩阵才需要进 行一致性检验;
  • 在论文写作中,应该先进行一致性检验,通过检验后再计算 权重,视频中讲解的只是为了顺应计算过程

6d9b9ddbde5d421b872c3827b316d02c.png

当CR>0.1时如何修正?

指标X城市A城市B城市C
城市A121
城市B1/212
城市C11/21

答:往一致矩阵上调整,一致矩阵的行列成倍数关系

1b7c3a324ef94f039ac3a8244a0222f7.png

所以:

指标X城市A城市B城市C
城市A124
城市B1/212
城市C1/41/21
  1. 根据权重矩阵计算最终得分,并进行排序。

三、层次分析法的一些局限性

  1. 评价的决策层不能太多,太多的话n会很大,判断矩阵和 一致矩阵差异 可能会很大。

我们上面提到过的RI指标也只到了15:

n123456789101112131415
R000.520.891.121.261.361.411.461.491.521.541.561.581.59
  1. 如果决策层中指标的数据是已知的,那么我们如何利用这些数据来使得评价的更加准确呢?

层次分析法中,实际情况下没有坤坤帮我们回答,层次分析法中这张表是交给‘专家’ 填的。(谁比谁重要啊,重要程度是几呀… ),其实我们自己凭感觉填(两两比较的结果)。

该方法仍具有较强的主观性,判断/比较矩阵的构造在一定程度上是凭感觉决定的,一致性检验只是检验 感觉 有没有自相矛盾得太离谱。

四、模型拓展

1. 多个准则层:

与之前做法一样,不过是多算几组表格。

5eafe9c280e64c44aeb523276061ea43.png

2. 准则不对应全部方案:

可以把另一个方案的权重设为0

2062ada1c96e4a9ba9271699d94ef7a1.png

*3. 一个准则只对应自己的方案

98880c1f3fe34b88b44086e3c7ce9cdd.png

我们只要生成这样的表即可:

d93ad6b397324f4ca2463bcff62fff88.png

先成大的部分的判断矩阵,再分别处理小的。

感觉这个模型还是很简单的。如果有不理解的地方可以联系帅气的博主。

五、代码展示

你要购买一台笔记本电脑,要考虑其:颜值、性能、口碑、重量、保险情况,这5个方面,最终筛选出了3种品牌的电脑。

第一步:

确定了目标层、准则层、方案层后,我们要做的就是填下表:

权重电脑A电脑B电脑C
颜值
性能
口碑
重量
保险情况

第二步:

我们先处理第一列(权重),其判断矩阵如下。

颜值性能口碑重量保险情况
颜值11/2433
性能21755
口碑1/41/711/21/3
重量1/31/5211
保险情况1/31/5311

matrix = np.array([[1, 1 / 2, 4, 3, 3], [2, 1, 7, 5, 5], [1 / 4, 1 / 7, 1, 1 / 2, 1 / 3], [1 / 3, 1 / 5, 2, 1, 1],
                       [1 / 3, 1 / 5, 3, 1, 1]])

下面我就以上面这个判断矩阵为例子,定义权重类:

代码1:

  • 只定义了权重求解类,初始化时要传入一个判断矩阵。
  • 往往我们层次分析问题要求解多个判断矩阵,可以自己在这基础之上定义一个AHP类,初始化时把全部判断矩阵都放进去,直接内部计算输出选择方案。
import numpy as np

# 计算权重类
# 首先初始化判断矩阵,检验其CR是否<0.1,如果小于则计算权重,否则提示调整矩阵内数值。
class Calculate_weights:

    # 初始化判断矩阵
    def __init__(self, array):
        self.array = array
        # n为矩阵维度
        self.n = array.shape[0]
        # 矩阵的特征值和特征向量
        self.eig_val, self.eig_vector = np.linalg.eig(self.array)
        # 矩阵的最大特征值
        self.max_eig_val = np.max(self.eig_val)
        # 矩阵最大特征值对应的特征向量
        self.max_eig_vector = self.eig_vector[:, np.argmax(self.eig_val)].real

        # 矩阵的一致性指标CI
        self.CI_value = (self.max_eig_val - self.n) / (self.n - 1)
        # 平均随机一致性指标RI值列表,用于一致性检验。
        self.RI_list = [0, 0, 0.52, 0.89, 1.12, 1.26, 1.36, 1.41, 1.46, 1.49, 1.52, 1.54, 1.56, 1.58,
                        1.59]
        # 矩阵的一致性比例CR
        self.CR_value = self.CI_value / (self.RI_list[self.n - 1])

    # 一致性判断 返回布尔类型
    def test_consist(self):
        # 打印矩阵的一致性指标CI和一致性比例CR
        # 进行一致性检验判断
        if self.n == 2 or self.CR_value < 0.1:  # 二阶矩阵或CR值小于0.1,可以通过一致性检验。
            return True
        else:  # CR值大于0.1, 一致性检验不通过。
            print("判断矩阵的CR值为:" + str(self.CR_value) + ",未通过一致性检验。")
            return False

    # 算术平均法求权重
    def cal_weight_by_arithmetic_method(self):
        # 求矩阵的每列的和
        col_sum = np.sum(self.array, axis=0)
        # 将判断矩阵按照列归一化
        array_normed = self.array / col_sum
        # 计算权重向量
        array_weight = np.sum(array_normed, axis=1) / self.n
        # 打印权重向量
        print("算术平均法计算得到的权重为:\n", array_weight)
        # 返回权重向量的值
        return array_weight

    # 几何平均法求权重
    def cal_weight_by_geometric_method(self):
        # 求矩阵的每列的积
        col_product = np.product(self.array, axis=1)
        # 将得到的积向量的每个分量进行开n次方
        array_power = np.power(col_product, 1 / self.n)
        # 将列向量归一化
        array_weight = array_power / np.sum(array_power)
        # 打印权重向量
        print("几何平均法计算得到的权重为:\n", array_weight)
        # 返回权重向量的值
        return array_weight

    # 特征值法求权重
    def cal_weight_by_eigenvalue_method(self):
        # 将矩阵最大特征值对应的特征向量进行归一化处理就得到了权重
        array_weight = self.max_eig_vector / np.sum(self.max_eig_vector)
        # 打印权重向量
        print("特征值法计算得到的权重为:\n", array_weight)
        # 返回权重向量的值
        return array_weight


if __name__ == "__main__":
    # 给出判断矩阵
    matrix = np.array([[1, 1 / 2, 4, 3, 3], [2, 1, 7, 5, 5], [1 / 4, 1 / 7, 1, 1 / 2, 1 / 3], [1 / 3, 1 / 5, 2, 1, 1],
                       [1 / 3, 1 / 5, 3, 1, 1]])
    # 权重对象
    weights_obj = Calculate_weights(matrix)
    if weights_obj.test_consist():
        # 算术平均法求权重
        weight1 = weights_obj.cal_weight_by_arithmetic_method()
        # 几何平均法求权重
        weight2 = weights_obj.cal_weight_by_geometric_method()
        # 特征值法求权重
        weight3 = weights_obj.cal_weight_by_eigenvalue_method()
算术平均法计算得到的权重为:
 [0.26228108 0.47439499 0.0544921  0.09853357 0.11029827]
几何平均法计算得到的权重为:
 [0.2636328  0.47726387 0.05307416 0.09883999 0.10718918]
特征值法计算得到的权重为:
 [0.26360349 0.47583538 0.0538146  0.09806829 0.10867824]

很明显,性能要更重要一些:

8d8b4337aaa947f0bc8ad0fa83db9b23.png

因此我们填完了表的第一列:

权重电脑A电脑B电脑C
颜值0.2636
性能0.4758
口碑0.0538
重量0.0980
保险情况0.1086

其它列同理。

代码2:

  • AHP类,初始化时把全部判断矩阵都放进去,直接内部计算输出选择方案。

总之要学会变通。

import numpy as np


# 计算权重类
# 首先初始化判断矩阵,检验其CR是否<0.1,如果小于则计算权重,否则提示调整矩阵内数值。
class Calculate_weights:

    # 初始化判断矩阵
    def __init__(self, array):
        self.array = array
        # n为矩阵维度
        self.n = array.shape[0]
        # 矩阵的特征值和特征向量
        self.eig_val, self.eig_vector = np.linalg.eig(self.array)
        # 矩阵的最大特征值
        self.max_eig_val = np.max(self.eig_val)
        # 矩阵最大特征值对应的特征向量
        self.max_eig_vector = self.eig_vector[:, np.argmax(self.eig_val)].real

        # 矩阵的一致性指标CI
        self.CI_value = (self.max_eig_val - self.n) / (self.n - 1)
        # 平均随机一致性指标RI值列表,用于一致性检验。
        self.RI_list = [0, 0, 0.52, 0.89, 1.12, 1.26, 1.36, 1.41, 1.46, 1.49, 1.52, 1.54, 1.56, 1.58,
                        1.59]
        # 矩阵的一致性比例CR
        self.CR_value = self.CI_value / (self.RI_list[self.n - 1])

    # 一致性判断 返回布尔类型
    def test_consist(self):
        # 打印矩阵的一致性指标CI和一致性比例CR
        # 进行一致性检验判断
        if self.n == 2 or self.CR_value < 0.1:  # 二阶矩阵或CR值小于0.1,可以通过一致性检验。
            return True
        else:  # CR值大于0.1, 一致性检验不通过。
            print("判断矩阵的CR值为:" + str(self.CR_value) + ",未通过一致性检验。")
            return False

    # 算术平均法求权重
    def cal_weight_by_arithmetic_method(self):
        # 求矩阵的每列的和
        col_sum = np.sum(self.array, axis=0)
        # 将判断矩阵按照列归一化
        array_normed = self.array / col_sum
        # 计算权重向量
        array_weight = np.sum(array_normed, axis=1) / self.n
        # 打印权重向量
        #print("算术平均法计算得到的权重为:\n", array_weight)
        # 返回权重向量的值
        return array_weight

    # 几何平均法求权重
    def cal_weight_by_geometric_method(self):
        # 求矩阵的每列的积
        col_product = np.product(self.array, axis=1)
        # 将得到的积向量的每个分量进行开n次方
        array_power = np.power(col_product, 1 / self.n)
        # 将列向量归一化
        array_weight = array_power / np.sum(array_power)
        # 打印权重向量
        #print("几何平均法计算得到的权重为:\n", array_weight)
        # 返回权重向量的值
        return array_weight

    # 特征值法求权重
    def cal_weight_by_eigenvalue_method(self):
        # 将矩阵最大特征值对应的特征向量进行归一化处理就得到了权重
        array_weight = self.max_eig_vector / np.sum(self.max_eig_vector)
        # 打印权重向量
        #print("特征值法计算得到的权重为:\n", array_weight)
        # 返回权重向量的值
        return array_weight


class AHP:

    def __init__(self, *args):
        self.col = args[0]
        self.row = args[1]
        self.array = args[2:]
        # 初始化最终矩阵
        self.finally_matrix = np.empty((len(self.row),len(self.col),))

    # 生成全部填好后的最终矩阵
    def f_matrix(self):
        # matrix 为每个判断矩阵,记得注意顺序,如权重在第一列。
        col = 0
        row = 0
        for matrix in self.array:
            weights_obj = Calculate_weights(matrix)
            if weights_obj.test_consist():
                # 特征值法求权重
                weight3 = weights_obj.cal_weight_by_eigenvalue_method()
                if col == 0: # 权重的权重放在列(竖着放在第一列)
                    self.finally_matrix[:, col] = weight3
                    col += 1
                else: # 剩下的都放在行(每行横着放)
                    self.finally_matrix[row, col:] = weight3
                    row += 1

        return self.finally_matrix

    def result(self):
        self.f_matrix()
        res = []
        for i in range(len(self.col)-1):
            tem_res = np.sum(self.finally_matrix[:,0]*self.finally_matrix[:,i+1])
            res.append(tem_res)
        return res



if __name__ == "__main__":
    # 给出判断矩阵

    col = ['权重', '电脑A', '电脑B', '电脑C']
    row = ['颜值', '性能', '口碑', '重量', '保险']

    weighting = np.array(
        [[1, 1 / 2, 4, 3, 3], [2, 1, 7, 5, 5], [1 / 4, 1 / 7, 1, 1 / 2, 1 / 3], [1 / 3, 1 / 5, 2, 1, 1],
         [1 / 3, 1 / 5, 3, 1, 1]])


![img](https://img-blog.csdnimg.cn/img_convert/f6b69232ceee624dd57ce2bcf2c1c82c.png)
![img](https://img-blog.csdnimg.cn/img_convert/c21dd728c20100fe4d40d8f2ff37ce07.png)
![img](https://img-blog.csdnimg.cn/img_convert/cb125c4989ba178839a7b63fb0d8a422.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

,0]*self.finally_matrix[:,i+1])
            res.append(tem_res)
        return res



if __name__ == "__main__":
    # 给出判断矩阵

    col = ['权重', '电脑A', '电脑B', '电脑C']
    row = ['颜值', '性能', '口碑', '重量', '保险']

    weighting = np.array(
        [[1, 1 / 2, 4, 3, 3], [2, 1, 7, 5, 5], [1 / 4, 1 / 7, 1, 1 / 2, 1 / 3], [1 / 3, 1 / 5, 2, 1, 1],
         [1 / 3, 1 / 5, 3, 1, 1]])


[外链图片转存中...(img-mMsrL7qm-1715598346889)]
[外链图片转存中...(img-VsyjvapT-1715598346890)]
[外链图片转存中...(img-iRHmayv7-1715598346890)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

  • 11
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值