数学建模——评价决策类算法(熵权法、模糊综合评价)

一、熵权法(求解权重)

概念原理

代码

python 复制代码
import numpy as np  # 导入numpy库,并简称为np

# 定义一个自定义的对数函数mylog,用于处理输入数组中的零元素
def mylog(p):
    n = len(p)  # 获取输入向量p的长度
    lnp = np.zeros(n)  # 创建一个长度为n,元素都为0的新数组lnp
    for i in range(n):  # 对向量p的每一个元素进行循环
        if p[i] == 0:  # 如果当前元素的值为0
            lnp[i] = 0  # 则在lnp中对应位置也设置为0,因为log(0)是未定义的,这里我们规定为0
        else:
            lnp[i] = np.log(p[i])  # 如果p[i]不为0,则计算其自然对数并赋值给lnp的对应位置
    return lnp  # 返回计算后的对数数组

# 定义一个指标矩阵X
X = np.array([[9, 0, 0, 0], [8, 3, 0.9, 0.5], [6, 7, 0.2, 1]])

# 对矩阵X进行标准化处理,得到标准化矩阵Z
Z = X / np.sqrt(np.sum(X*X, axis=0))

print("标准化矩阵 Z = ")
print(Z)  # 打印标准化矩阵Z

# 计算熵权所需的变量和矩阵初始化
n, m = Z.shape  # 获取标准化矩阵Z的行数和列数
D = np.zeros(m)  # 初始化一个长度为m的数组D,用于保存每个指标的信息效用值

# 计算每个指标的信息效用值
for i in range(m):  # 遍历Z的每一列
    x = Z[:, i]  # 获取Z的第i列,即第i个指标的所有数据
    p = x / np.sum(x)  # 对第i个指标的数据进行归一化处理,得到概率分布p
    # 使用自定义的mylog函数计算p的对数。需要注意的是,如果p中含有0,直接使用np.log会得到-inf,这里使用自定义函数避免这个问题
    e = -np.sum(p * mylog(p)) / np.log(n)  # 根据熵的定义计算第i个指标的信息熵e
    D[i] = 1 - e  # 根据信息效用值的定义计算D[i]

# 根据信息效用值计算各指标的权重
W = D / np.sum(D)  # 将信息效用值D归一化,得到各指标的权重W

print("权重 W = ")
print(W)  # 打印得到的权重数组W

二、模糊综合评价

原理概念

现实中的许多现象及关系比较模糊。如高与矮, 长与短,大与小,多与少,穷与富,好与差, 年轻与年老等。这类现象不满足"非此即彼"的排中律,而具有"亦此亦彼"的模糊性。 需要指出的是,模糊不确定不同于随机不确定。 随机不确定是因果律破损造成的不确定,而模糊不确定是由于排中律破损造成的不确定。

传统集合是指具有相同属性的事物的集体,如正整数集合,具有如下性质:

互异性:集合中任意两个元素都是不同的对象,如{ 1 1 2}和{1 2}这两个集合是等价的

逻辑性:每一个对象都能确定是不是某一集合的元素,这个性质主要用于判断一个集合是否能形成集合

独立性:集合的基数、集合本身的个数必须为自然数

无序性:{a b c}和{c b a}是同一个集合

纯粹性:所谓集合的纯粹性,用个例子来表示,集合A={x|x<2},集合A 中所有的元素都要符合x<2

完备性:仍用上面的例子,所有符合x<2的数都在集合A中

传统集合的特征函数

模糊集合用来描述形容高矮胖瘦这种没有明确指标的模糊性问题。不具有传统集合的互异性, 而是"亦此亦彼"的。

模糊集合的隶属函数

模糊集合的表示方法

模糊集与特征函数的关系

F分布确定隶属函数

代码

python 复制代码
import numpy as np

# 1、一级模糊综合评判
# 影响运行费用的各因素的单因素评价矩阵为:
R23 = np.array([
     [0.18, 0.14, 0.18, 0.14, 0.13, 0.23],
     [0.15, 0.20, 0.15, 0.25, 0.10, 0.15],
     [0.25, 0.12, 0.13, 0.12, 0.18, 0.20],
     [0.16, 0.15, 0.21, 0.11, 0.20, 0.17],
     [0.23, 0.18, 0.17, 0.16, 0.15, 0.11],
     [0.19, 0.13, 0.12, 0.12, 0.11, 0.33],
     [0.17, 0.16, 0.15, 0.08, 0.25, 0.19]])
# 权重分配为
A23 = np.array([0.20, 0.15, 0.10, 0.10, 0.20, 0.15, 0.10])
# 评价结果
# np.dot是Numpy库中的一个函数,用于计算两个数组的点积。对于一维数组,它计算的是这两个数组的内积。
# 对于二维数组(矩阵),它计算的是矩阵乘法。
B23 = np.dot(A23, R23)

# 2、二级模糊综合评判
# 产品情况的二级评判如下:
R1 = np.array([
    [0.12, 0.18, 0.17, 0.23, 0.13, 0.17],
    [0.15, 0.13, 0.18, 0.25, 0.12, 0.17],
    [0.14, 0.13, 0.16, 0.18, 0.20, 0.19],
    [0.12, 0.14, 0.15, 0.17, 0.19, 0.23],
    [0.16, 0.12, 0.13, 0.25, 0.18, 0.16]])
A1 = np.array([0.15, 0.40, 0.25, 0.10, 0.10])
B1 = np.dot(A1, R1)
# 销售能力二级评判如下:
R2 = np.array([
    [0.13, 0.15, 0.14, 0.18, 0.16, 0.25],
    [0.12, 0.16, 0.13, 0.17, 0.19, 0.23],
    B23,
    [0.14, 0.13, 0.15, 0.16, 0.18, 0.24],
    [0.16, 0.15, 0.15, 0.17, 0.18, 0.19]])
A2 = np.array([0.2, 0.15, 0.25, 0.25, 0.15])
B2 = np.dot(A2, R2)

# 市场需求的二级评判
R3 = np.array([
    [0.15, 0.14, 0.13, 0.18, 0.14, 0.26],
    [0.16, 0.15, 0.18, 0.14, 0.16, 0.21]])
A3 = np.array([0.55, 0.45])
B3 = np.dot(A3, R3)

# 3、三级模糊综合评判
R = np.array([B1, B2, B3])
A = np.array([0.4, 0.3, 0.3])
B = np.dot(A, R)

print(B)

例题

例题:某公司计划推出一款新产品,为了评估该产品的市场潜力,公司希望通过模糊综合评价算法对产品进行评价。评价指标包括:市场需求、技术成熟度、成本控制、用户体验。评价集分为:很高、较高、一般、较低、很低。

步骤1:建立评价指标集和评价集

评价指标集U: U = {市场需求,技术成熟度,成本控制,用户体验}

评价集V: V = {很高,较高,一般,较低,很低}

步骤2:确定各指标的权重

假设通过专家打分法,得到各指标的权重向量W: W = [0.3, 0.25, 0.2, 0.25]

步骤3:建立模糊评价矩阵

通过调查问卷或专家评分,得到各指标在不同评价等级上的隶属度,构建模糊评价矩阵R。

R = [[0.2, 0.5, 0.2, 0.1, 0],

[0.4, 0.4, 0.1, 0.1, 0],

[0.1, 0.3, 0.4, 0.2, 0],

[0.3, 0.4, 0.2, 0.1, 0]]

步骤4:进行模糊综合评价

使用模糊综合评价算法计算评价结果B。

B = W * R

步骤5:对评价结果进行解释

根据评价结果B,对新产品进行综合评价。

下面是Python代码实现:

python 复制代码
import numpy as np

# 指标权重
W = np.array([0.3, 0.25, 0.2, 0.25])

# 模糊评价矩阵
R = np.array([[0.2, 0.5, 0.2, 0.1, 0],
              [0.4, 0.4, 0.1, 0.1, 0],
              [0.1, 0.3, 0.4, 0.2, 0],
              [0.3, 0.4, 0.2, 0.1, 0]])

# 模糊综合评价
B = np.dot(W, R)

# 归一化评价结果
B_normalized = B / np.sum(B)

# 输出评价结果
print("新产品综合评价结果:")
print("很高:{:.2f}, 较高:{:.2f}, 一般:{:.2f}, 较低:{:.2f}, 很低:{:.2f}".format(*B_normalized))

运行上述代码,将输出新产品的综合评价结果,这个结果反映了新产品在各个评价等级上的综合表现。根据这个结果,公司可以决定是否推出新产品,或者对产品进行进一步的改进。

相关推荐
一点媛艺2 小时前
Kotlin函数由易到难
开发语言·python·kotlin
魔道不误砍柴功3 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
pianmian13 小时前
python数据结构基础(7)
数据结构·算法
_.Switch4 小时前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
测开小菜鸟5 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
好奇龙猫5 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
sp_fyf_20246 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘
萧鼎6 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
学地理的小胖砸6 小时前
【一些关于Python的信息和帮助】
开发语言·python
疯一样的码农6 小时前
Python 继承、多态、封装、抽象
开发语言·python