[数学建模从入门到入土] 评价模型

数学建模从入门到入土 评价模型

个人导航

知乎:https://www.zhihu.com/people/byzh_rc

CSDN:https://blog.csdn.net/qq_54636039

注:本文仅对所述内容做了框架性引导,具体细节可查询其余相关资料or源码

参考文章:各方资料

文章目录

评价类问题

针对多个候选对象(方案, 产品, 项目, 政策, 指标集)或多个维度的表现(性能, 成本, 风险, 收益)进行综合比较和衡量, 从而得到合理的等级划分排序

  1. 标准化
  2. 确定权重

标准化

重要性:

  1. 消除量纲影响
  2. 统一取值范围
1. min-max normalization

缩放到0-1区间

对于越大越好的:
x ′ = x − x min ⁡ x max ⁡ − x min ⁡ x' = \frac{x - x_{\min}}{x_{\max} - x_{\min}} x′=xmax−xminx−xmin

对于越小越好的:
x ′ = x max ⁡ − x x max ⁡ − x min ⁡ x' = \frac{x_{\max} - x}{x_{\max} - x_{\min}} x′=xmax−xminxmax−x

  • 优点: 简单直观
  • 缺点: 异常值敏感
2. mean normalization

缩放到-1-1区间, 均值为0
x ′ = x − μ x max ⁡ − x min ⁡ x' = \frac{x - \mu}{x_{\max} - x_{\min}} x′=xmax−xminx−μ

  • 优点: 简单直观, 保留数据中心化
  • 缺点: 异常值敏感
3. z-score normalization

均值为0, 方差为1的标准正态分布 (适用于消除异常值影响)
x ′ = x − μ σ x' = \frac{x - \mu}{\sigma} x′=σx−μ

  • 优点: 适用于正态分布的数据
  • 缺点: 不适用于正态分布的数据; 异常值敏感
4. vector normalization

适用于欧几里得空间中的多维数据 (x除以其模长)
x ′ = x ∑ i = 1 n x i 2 x' = \frac{x}{\sqrt{\sum_{i=1}^n x_i^2}} x′=∑i=1nxi2 x

  • 优点: 适用于计算欧几里得距离(文本分类, 图像处理)
  • 缺点: 不适用于需要保留数据间原有比例关系的场景
5. score normalization

缩放, 用于评分系统
x ′ = x ∑ i = 1 n x i x' = \frac{x}{\sum_{i=1}^n x_i} x′=∑i=1nxix

  • 优点: 直观, 用于评分
  • 缺点: 不适用于需要保留数据绝对值的场景; 极端值敏感
6. log

适用于数据分布高度偏斜 (+1避免对数零的情况)
x ′ = log ⁡ ( x + 1 ) x' = \log(x+1) x′=log(x+1)

  • 优点: 适用于高度偏斜的数据
  • 缺点: 对非正值无效

确定权重

1.主观赋权

专家经验

  • 层次分析AHP
  • 模拟层次分析
  • 德尔菲法
2.客观赋权

数据本身

  • 熵权法EWM
  • 因子分析
  • 变异系数法

3.组合赋权

  • 加权平均法
  • 乘法融合法
  • 优化模型
层次分析AHP
  • 建立递阶层次结构模型

  • 构造出各层次中的所有判断矩阵

    ( a i j a_{ij} aij: 第i个指标相对第j个指标的重要程度)

  • 一致性检验

  • 求权重后进行评价

    (各指标乘以其对应的权重, 加和得到总分)

例子:

熵权法EWM

对于某个指标, 可以用熵值来判断某个指标的离散程度

信息熵值越小, 指标的离散程度就越大, 该指标的影响/权重就越大

(如果某项指标的值都相等, 则该指标不起作用)

(依据的原理: 指标的变异程度越小, 其反映的信息量越少, 对应的权重越低)

  1. 数据标准化
    z i j = x i j ∑ i = 1 n x i j 2 z_{ij}=\frac{x_{ij}}{\sqrt{\sum_{i=1}^n}x_{ij}^2} zij=∑i=1n xij2xij

  2. 计算第j个指标下, 第i个样本所占的比重
    p i j = z i j ~ ∑ i = 1 n z i j ~ p_{ij}=\frac{\widetilde{z_{ij}}}{\sqrt{\sum_{i=1}^n}\widetilde{z_{ij}}} pij=∑i=1n zij zij

  3. 计算熵权
    e j = − 1 ln ⁡ n ∑ i = 1 n p i j ln ⁡ ( p i j ) ( j = 1 , 2 , . . . , m ) d j = 1 − e j W j = d j ∑ j = 1 m d j e_j = -\frac{1}{\ln n}\sum_{i=1}^n p_{ij} \ln(p_{ij}) \quad (j = 1,2,...,m) \\ d_j = 1 - e_j \\ W_j = \frac{d_j}{\sum_{j=1}^m d_j} ej=−lnn1i=1∑npijln(pij)(j=1,2,...,m)dj=1−ejWj=∑j=1mdjdj

除以 ln ⁡ n \ln n lnn是为了使信息熵始终在0,1区间

由于信息熵 e j e_j ej越大, 其信息效用越小, 所以需要用1来减

-> 信息效用 d j d_j dj越大, 其权重 W j W_j Wj越大
例子:

组合赋权法
  • 线性加权平均法:

    设定参数 α , β α,β α,β 且 α + β = 1 α + β=1 α+β=1,则
    W ∗ = α W A H P + β W E W M W^* = αW_{AHP} + βW_{EWM} W∗=αWAHP+βWEWM

    可根据决策者对主客观判断的信任度调节 α , β α,β α,β

  • 乘法组合法:

    将对应指标的AHP和EWM权重相乘后归一化
    w i ∗ = w i A H P ⋅ w i E W M ∑ j w j A H P ⋅ w j E W M w_i^* = \frac{w_i^{AHP} \cdot w_i^{EWM}}{\sum_j w_j^{AHP} \cdot w_j^{EWM}} wi∗=∑jwjAHP⋅wjEWMwiAHP⋅wiEWM

    若两种方法对同一指标权重均高,则综合后该指标权重更突出

  1. 准备数据:已有指标数据并通过 AHP 求得 W A H P W_{AHP} WAHP,通过 EWM 求得 W E W M W_{EWM} WEWM
  2. 选择组合策略:根据需求选择加权平均法或乘法组合法
  3. 计算综合权重
  4. 归一化处理:若计算后 Σ w ≠ 1 \Sigma w≠1 Σw=1,则归一化使 Σ w ∗ = 1 \Sigma w^*=1 Σw∗=1
  5. 验证与分析:比较 w ∗ w^* w∗ 与 W A H P , W E W M W_{AHP},W_{EWM} WAHP,WEWM,分析组合后权重的变化特性

逼近理想解排序法TOPSIS

通过计算各方案与理想解和负理想解的距离, 对多个方案进行排序

核心思想: 最优方案应该同时最接近理想解和最原理负理想解

TOPSIS基于欧几里得距离

e.g. 供应商的选择, 投资策略, 资源分配

  1. 数据标准化(x->z)

  2. 加权处理(z->v)

  3. 确定理想解和负理想解

    (分别计算各指标的最优值和最劣值)
    理想解: A + = ( max ⁡ ( v i 1 ) , max ⁡ ( v i 2 ) , ... , max ⁡ ( v i n ) ) 负理想解: A − = ( min ⁡ ( v i 1 ) , min ⁡ ( v i 2 ) , ... , min ⁡ ( v i n ) ) \text{理想解:}\quad A^+ = \left(\max(v_{i1}), \max(v_{i2}), \dots, \max(v_{in})\right) \\ \text{负理想解:}\quad A^- = \left(\min(v_{i1}), \min(v_{i2}), \dots, \min(v_{in})\right) 理想解:A+=(max(vi1),max(vi2),...,max(vin))负理想解:A−=(min(vi1),min(vi2),...,min(vin))

  4. 计算距离
    D i + : 第i个方案与理想解的欧几里得距离 D i − : 第i个方案与负理想解的欧几里得距离 D_i^+: \text{第i个方案与理想解的欧几里得距离} \\ D_i^-: \text{第i个方案与负理想解的欧几里得距离} Di+:第i个方案与理想解的欧几里得距离Di−:第i个方案与负理想解的欧几里得距离

  5. 计算贴近度

    (贴近度越大, 方案越优)
    C i = D i − D i + + D i − C_i = \frac{D_i^-}{D_i^+ + D_i^-} Ci=Di++Di−Di−

例子:

py 复制代码
import numpy as np

def normalize_data(data, criteria_types):
    normalized_data = np.zeros_like(data, dtype=float)
    n, m = data.shape

    for j in range(m):
        column_data = data[:, j]
        if criteria_types[j] == 1:  # 正向指标
            normalized_data[:, j] = (
                (column_data - np.min(column_data)) / (np.max(column_data) - np.min(column_data))
            )
        else:  # 逆向指标
            normalized_data[:, j] = (
                (np.max(column_data) - column_data) / (np.max(column_data) - np.min(column_data))
            )
    return normalized_data

def weighted_normalization(normalized_data, weights):
    # todo
    normalized_data = np.asarray(normalized_data, dtype=float)
    weights = np.asarray(weights, dtype=float)

    if normalized_data.ndim != 2:
        raise ValueError("normalized_data 必须是二维矩阵 (n, m)")
    if weights.ndim != 1:
        raise ValueError("weights 必须是一维向量 (m,)")
    if normalized_data.shape[1] != weights.shape[0]:
        raise ValueError(f"维度不匹配: normalized_data.shape={normalized_data.shape}, weights.shape={weights.shape}")

    w_sum = weights.sum()
    if not np.isfinite(w_sum) or w_sum <= 0:
        raise ValueError("weights 之和必须为正且有限")
    # 如果你希望权重一定归一化,可以保留这句
    weights = weights / w_sum

    return normalized_data * weights
def calculate_ideal_solutions(weighted_data):
    ideal_solution = np.max(weighted_data, axis=0)
    negative_ideal_solution = np.min(weighted_data, axis=0)
    return ideal_solution, negative_ideal_solution

def calculate_distances(weighted_data, ideal_solution, negative_ideal_solution):
    n = weighted_data.shape[0]
    d_plus = np.zeros(n)
    d_minus = np.zeros(n)

    for i in range(n):
        d_plus[i] = np.sqrt(np.sum((weighted_data[i] - ideal_solution) ** 2))
        d_minus[i] = np.sqrt(np.sum((weighted_data[i] - negative_ideal_solution) ** 2))

    return d_plus, d_minus

def calculate_closeness(d_plus, d_minus):
    return d_minus / (d_plus + d_minus)

data = np.array([
    [100, 8, 10],
    [150, 7, 8],
    [120, 9, 12]
])

criteria_types = [-1, 1, -1]

weights = np.array([0.4, 0.3, 0.3])

normalized_data = normalize_data(data, criteria_types)
print("标准化后的数据:")
print(normalized_data)

weighted_data = weighted_normalization(normalized_data, weights)
print("\n加权标准化后的数据:")
print(weighted_data)

ideal_solution, negative_ideal_solution = calculate_ideal_solutions(weighted_data)
print("\n理想解:", ideal_solution)
print("负理想解:", negative_ideal_solution)

d_plus, d_minus = calculate_distances(weighted_data, ideal_solution, negative_ideal_solution)
print("\n与理想解的距离:", d_plus)
print("与负理想解的距离:", d_minus)

closeness = calculate_closeness(d_plus, d_minus)
print("\n各方案的贴近度:", closeness)


suppliers=["供应商A", "供应商B", "供应商C"]
ranking = sorted(zip(suppliers, closeness), key=lambda x: x[1], reverse=True)
print("\n推荐排序:")
for i, (supplier, score) in enumerate(ranking, 1):
    print(f"{i}. {supplier}: {score:.4f}")

补充-一致矩阵

对于正互反矩阵A: A ∈ R n × n A\in\mathbb{R}^{n\times n} A∈Rn×n
A = a 11 a 12 ... a 1 n a 21 a 22 ... a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 a n 2 ... a n n A = \begin{bmatrix} a_{11} & a_{12} & \dots & a_{1n} \\ a_{21} & a_{22} & \dots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n1} & a_{n2} & \dots & a_{nn} \end{bmatrix} A= a11a21⋮an1a12a22⋮an2......⋱...a1na2n⋮ann

a i j > 0 , a i i = 1 , a i j = 1 a j i a_{ij}>0,\quad a_{ii}=1,\quad a_{ij}=\frac{1}{a_{ji}} aij>0,aii=1,aij=aji1

其为一致矩阵的充要条件是:
{ a i j > 0 所有元素均大于 0 a 11 = a 22 = ⋯ = a n n = 1 对角线元素均为 1 a i 1 , a i 2 , ... , a i n = k i a 11 , a 12 , ... , a 1 n 矩阵每行成比例(r(A)=1) \begin{cases} a_{ij} > 0 & \text{所有元素均大于 0} \\ a_{11} = a_{22} = \dots = a_{nn} = 1 & \text{对角线元素均为 1} \\ \left a_{i1}, a_{i2}, \\dots, a_{in} \\right = k_i \left a_{11}, a_{12}, \\dots, a_{1n} \\right & \text{矩阵每行成比例(r(A)=1)} \end{cases} ⎩ ⎨ ⎧aij>0a11=a22=⋯=ann=1ai1,ai2,...,ain=kia11,a12,...,a1n所有元素均大于 0对角线元素均为 1矩阵每行成比例(r(A)=1)

故而, 一致矩阵只有一个特征值 n n n, 其余为0

特征值为n时, 其特征向量对应为:
k 1 a 11 1 a 12 ⋮ 1 a 1 n , k ≠ 0 k \begin{bmatrix} \frac{1}{a_{11}} \\ \frac{1}{a_{12}} \\ \vdots \\ \frac{1}{a_{1n}} \end{bmatrix}, \quad k \ne 0 k a111a121⋮a1n1 ,k=0

推论: n阶正互反矩阵A为一致矩阵 当且仅当 最大特征值 λ m a x = n \lambda_{max}=n λmax=n

若正互反矩阵A的最大特征值 λ m a x > n \lambda_{max}>n λmax>n, 则需要一致性检验(判断该矩阵的一致性是否在接受范围内)

补充-层次分析法若未通过一致性检验

1.算术平均法求权重
  1. 第一步:将判断矩阵按照列归一化(每一个元素除以其所在列的和)
  2. 第二步:将归一化的各列相加(按行求和)
  3. 第三步:将相加后得到的向量中每个元素除以n即可得到权重向量

假设判断矩阵:
A = a 11 ... a 1 n ⋮ ⋱ ⋮ a n 1 ... a n n A= \begin{bmatrix} a_{11} & \dots & a_{1n} \\ \vdots & \ddots & \vdots \\ a_{n1} & \dots & a_{nn} \end{bmatrix} A= a11⋮an1...⋱...a1n⋮ann

那么算术平均法求得的权重向量:
w i = 1 n ∑ j = 1 n a i j ∑ k = 1 n a k j ( i = 1 , 2 , 3 , . . . , n ) w_i = \frac{1}{n}\sum_{j=1}^n \frac{a_{ij}}{\sum_{k=1}^n a_{kj}} \quad (i = 1,2,3,...,n) wi=n1j=1∑n∑k=1nakjaij(i=1,2,3,...,n)

2.几何平均法求权重
  1. 第一步:将判断矩阵的各行元素相乘得到的值组成一个列向量
  2. 第二步:将得到的列向量的每个分量开n次方
  3. 第三步:对该列向量进行归一化即可得到权重向量

假设判断矩阵:
A = a 11 ... a 1 n ⋮ ⋱ ⋮ a n 1 ... a n n A= \begin{bmatrix} a_{11} & \dots & a_{1n} \\ \vdots & \ddots & \vdots \\ a_{n1} & \dots & a_{nn} \end{bmatrix} A= a11⋮an1...⋱...a1n⋮ann

那么几何平均法求得的权重向量:
w i = ( ∏ j = 1 n a i j ) 1 n ∑ k = 1 n ( ∏ j = 1 n a k j ) 1 n ( i = 1 , 2 , . . . , n ) w_i = \frac{\left(\prod_{j=1}^n a_{ij}\right)^{\frac{1}{n}}}{\sum_{k=1}^n \left(\prod_{j=1}^n a_{kj}\right)^{\frac{1}{n}}} \quad (i = 1,2,...,n) wi=∑k=1n(∏j=1nakj)n1(∏j=1naij)n1(i=1,2,...,n)

3.特征值法求权重

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

另外,我们很容易得到,特征值为 n n n时,对应的特征向量刚好为权重向量

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

  1. 第一步:求出矩阵 A A A的最大特征值 λ m a x \lambda_{max} λmax以及其对应的特征向量 x x x
  2. 第二步:对求出的特征向量进行归一化即可得到我们的权重

( A − λ m a x E ) x = 0 (A-\lambda_{max}E)x=0 (A−λmaxE)x=0

相关推荐
IT_陈寒1 小时前
Vue这个坑我跳了两次,原来问题出在这
前端·人工智能·后端
新新技术迷2 小时前
Node给AI接口做SSE代理与鉴权
人工智能
redreamSo3 小时前
大模型是不是到顶了?瓶颈到底在哪
人工智能·openai
Oo9203 小时前
Tool Use 背后的技术逻辑
人工智能
姗姗来迟了3 小时前
Vue3封装AI流式对话组件踩坑实录
人工智能
码上天下3 小时前
用Pinia管理AI多会话状态
人工智能
用户054324329704 小时前
Next.js接大模型流式SSE实操踩坑
人工智能
Assby4 小时前
从 Function Calling 到 MCP:理解 Agent 工具调用的底层通信机制
人工智能·后端
小星AI4 小时前
Claude Code 从入门到精通,一步到位
人工智能
后端小肥肠5 小时前
Codex + Obsidian 做人生副本视频:输入主题文案,直通剪映草稿
人工智能·aigc·agent