《超效率DEA》在数学建模中实际应用
目录
超效率DEA简述
一、为什么要用超效率 DEA?(传统模型的痛点)
传统 CCR-DEA 模型的问题:
- 评价结果中,往往多个 DMU 同时效率值 θ=1(都 DEA 有效)
- 这些 "有效单元" 之间无法进一步排序和比较
- 论文里就出现了:吉林、北京、上海、广东、陕西、安徽 6 个城市 θ 都等于 1,分不出谁更好
超效率 DEA 就是为了解决这个问题 —— 让有效的单元也能排出高低。
二、超效率 DEA 的核心思想
评价第 k 个 DMU 时,把它自己排除在外,用其他所有 DMU 的投入产出线性组合来构建前沿面。
对于原本就 DEA 有效的单元:
- 它可以按比例增加投入,而仍然保持在有效前沿上
- 这个 "投入增加的比例" 就是超效率值 θ
- θ 越大 → 说明该 DMU 效率越高,"领先优势" 越大
对于原本 DEA 无效的单元:
- 超效率值和传统 CCR 结果一样(θ < 1)
- 因为它本来就不在前沿上,排不排除自己没区别
三、超效率 DEA 的数学模型
传统 CCR 模型(对比用)

超效率 DEA 模型(论文公式 10)

关键区别只有一个:求和时,即排除被评价单元自身。
论文复现:
一、摘要
论文摘要讲述:节能减排是一个多投入、多输出的系统效率评价问题。故而建立起DEA模型

又指出:发现DEA模型无法对同时有效的决策单元做出进一步的评价和比较(也即是传统DEA的取缺点,上文提到:无非对有效的决策单元进行内部排名),作者提出将DEA模型改进为超效率DEA模型
二、符号说明

符号 名称 通俗解释 论文里的具体含义 DMU 决策单元 就是你要评价的对象 吉林、北京、上海等 8 个省市,每个省市就是一个 DMU x DMU 输入 投入的资源 / 成本 能耗、COD 排放量、SO₂排放量、工业固废产生量(4 个投入指标) y DMU 输出 得到的产出 / 成果 GDP、COD 削减量、SO₂削减量、固废综合利用量(4 个产出指标) v 输入的权系数 每个投入指标的权重 DEA 的精髓:不是人定的,是模型自动算的—— 每个 DMU 可以选对自己最有利的权重,让自己效率看起来最高 u 输出的权系数 每个产出指标的权重 同上,自动计算,避免了主观赋权(比如 AHP)的偏见 θ 节能减排效率 核心评价结果,效率值 - 传统 DEA:0 ≤ θ ≤ 1,θ=1 就是有效- 超效率 DEA:θ 可以 > 1,越大效率越高 G 规模效益值 判断规模合不合理 G = Σλⱼ(所有 λ 加起来)G < 1:规模收益递增(投入还不够,加投入能赚更多)G = 1:规模收益不变(最优规模)G > 1:规模收益递减(投入太多了,再加不划算) S⁻ 输入松弛变量 投入里多余的部分 比如陕西 SO₂排放松弛变量很大,说明 SO₂排放太多了,是 "浪费" 的投入 S⁺ 输出松弛变量 产出里不足的部分 比如某省 GDP 的 S⁺=500,说明还能再增加 500 亿 GDP 才到最优水平 L 可节省投入量 总共能省多少投入 L = (1-θ) × 实际投入 + S⁻就是 "按比例缩减 + 砍掉冗余" 加起来的总节省量
三、模型的建立
DEA模型建立:
超效率DEA建立:

四、模型的求解
使用python中的线性规划求解器 = 一个函数,你告诉它"条件是什么、想最大化/最小化什么",它返回最优方案。你不需要自己推导怎么算,把方程写好丢进去就行。这就是为什么 DEA 代码的核心只有 60 行——复杂的数学计算全被 “linprog”包办了。求解器自动遍历所有可能(用数学技巧高效地找,不是真的一条条试),找到满足所有约束下目标最优的解。
1.核心计算代码
from scipy.optimize import linprog
result = linprog(c, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method='highs')
| 参数 | 给的值 | 含义 |
|---|---|---|
c | [1, 0, 0, ..., 0] | 目标:最小化第 1 个变量(θ),其他变量不用管 |
A_eq | (m+s) 行矩阵 | 等式约束:每行一个方程 |
b_eq | 等式右边的数值 | 产出约束=实际产出,投入约束=0 |
bounds | 全部 ≥ 0 | 所有变量不能为负 |
method='highs' | HiGHS 算法 | 一个开源的高性能求解引擎 |
2.求解器返回的结果:
| 结果 | 含义 |
|---|---|
result.x | 最优解向量——每个变量取什么值最好 |
result.x[0] | θ 的最优值(效率分) |
result.x[1:1+(n-1)] | 各 λ 的最优值(权重) |
result.success | 求解是否成功 |
3.想要的结果:θ和G(全部可以自动求出)
if result.success:
theta[k] = result.x[0] # 超效率值
lambda_vals = result.x[1 : 1 + (n-1)] # λ值
G[k] = np.sum(lambda_vals) # 规模效益 G = Σλ
4.完整代码:
import numpy as np
from scipy.optimize import linprog
def super_efficiency_dea(X, Y):
"""
超效率 CCR-DEA 模型(投入导向)
参数:
X: 投入矩阵, shape=(n, m), n个DMU, m个投入指标
Y: 产出矩阵, shape=(n, s), n个DMU, s个产出指标
返回:
theta: 超效率值数组, shape=(n,)
G: 规模效益值数组, shape=(n,)
"""
n, m = X.shape # n个DMU, m个投入
s = Y.shape[1] # s个产出
theta = np.zeros(n)
G = np.zeros(n)
# 对每个DMU分别求解
for k in range(n):
# 排除第k个DMU
idx = [i for i in range(n) if i != k]
X_other = X[idx] # (n-1, m)
Y_other = Y[idx] # (n-1, s)
# ===== 变量定义 =====
# x = [θ, λ_1, ..., λ_{n-1}, s⁻_1, ..., s⁻_m, s⁺_1, ..., s⁺_s]
# 共 1 + (n-1) + m + s 个变量
n_vars = 1 + (n - 1) + m + s
# ===== 目标函数: min θ =====
c = np.zeros(n_vars)
c[0] = 1 # 只最小化θ
# ===== 等式约束 =====
# 约束1: 投入约束 Σλⱼ xᵢⱼ + sᵢ⁻ - θ xᵢₖ = 0
# 约束2: 产出约束 Σλⱼ yᵣⱼ - sᵣ⁺ = yᵣₖ
A_eq = np.zeros((m + s, n_vars))
b_eq = np.zeros(m + s)
# 投入约束 (m个)
for i in range(m):
A_eq[i, 0] = -X[k, i] # -θ * x_ik
A_eq[i, 1 : 1 + (n-1)] = X_other[:, i] # λ_j * x_ij
A_eq[i, 1 + (n-1) + i] = 1 # s_i⁻
b_eq[i] = 0
# 产出约束 (s个)
for r in range(s):
row = m + r
A_eq[row, 1 : 1 + (n-1)] = Y_other[:, r] # λ_j * y_rj
A_eq[row, 1 + (n-1) + m + r] = -1 # -s_r⁺
b_eq[row] = Y[k, r]
# ===== 变量边界 =====
# θ ≥ 0, λ ≥ 0, s⁻ ≥ 0, s⁺ ≥ 0
bounds = [(0, None)] * n_vars
# ===== 求解 =====
result = linprog(c, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method='highs')
if result.success:
theta[k] = result.x[0] # 超效率值
lambda_vals = result.x[1 : 1 + (n-1)] # λ值
G[k] = np.sum(lambda_vals) # 规模效益 G = Σλ
else:
theta[k] = np.nan
G[k] = np.nan
return theta, G
# ============== 用论文中的数据测试 ==============
# 2006年8个省市的节能减排数据(论文表2)
# 投入指标: [能耗(万吨), COD(万吨), SO2(万吨), 固废(万吨)]
X = np.array([
[6801.786, 16.8, 33.6, 2802], # 吉林
[5981.4128, 0.9, 9.4, 1356], # 北京
[9049.841, 3.5, 37.4, 2063], # 上海
[20203.4763, 29.4, 124.7, 3057], # 广东
[6450.8532, 14.9, 84.6, 4794], # 陕西
[7200.1628, 14.2, 51.9, 5028], # 安徽
[6843.4776, 10.6, 45.6, 5972], # 云南
[5006.4633, 5.4, 46.3, 2591], # 甘肃
])
# 产出指标: [GDP(亿元), COD减少(万吨), SO2减少(万吨), 固废利用(万吨)]
Y = np.array([
[4275.12, 2.5, 0.7, 1781], # 吉林
[7870.28, 0.2, 1.1, 1095], # 北京
[10366.37, 0.2, 0.1, 1953], # 上海
[26204.47, -0.6, -0.4, 2878], # 广东
[4523.74, -0.2, 2.7, 1825], # 陕西
[6148.73, 0.1, -2.7, 4123], # 安徽
[4006.72, 0.0, -4.6, 2463], # 云南
[2276.7, 0.3, 0.2, 723], # 甘肃
])
provinces = ['吉林', '北京', '上海', '广东', '陕西', '安徽', '云南', '甘肃']
# 计算超效率
theta, G = super_efficiency_dea(X, Y)
# 输出结果
print("=" * 60)
print(f"{'省份':<6} {'超效率θ':<12} {'规模效益G':<12} {'规模收益':<10}")
print("=" * 60)
for i in range(len(provinces)):
if G[i] < 0.999:
scale = '递增'
elif G[i] > 1.001:
scale = '递减'
else:
scale = '不变'
print(f"{provinces[i]:<6} {theta[i]:<12.4f} {G[i]:<12.4f} {scale:<10}")
print("=" * 60)
五、模型的应用
对解出的核心概念的实际应用(落地)
1. θ值(节能减排效率)总体分析

文中说到:
- 八个省市的θ值在四年内的平均值大于1,表示这些地区的节能减排效率相对较高
- θ值较低的陕西,属于DEA弱有效,需要改进。
- θ值越高,表明该地区节能减排效率越好,工作做得越到位
2. G值(规模效率)总体分析

G = Σλⱼ(所有 λ 加起来)结论:
- G < 1:规模收益递增(投入还不够,加投入能赚更多)
- G = 1:规模收益不变(最优规模)
- G > 1:规模收益递减(投入太多了,再加不划算)
3. S⁻投入松弛变量

对S⁻分析,可以支持优化的方向:
简单来说:投入松弛变量(S⁻)就是“纯浪费”的数量。
分析它能直接告诉你两件最重要的事:
具体减多少:在产出不变的情况下,某项投入(比如资金、人力)还能再硬生生砍掉多少,这部分是纯冗余,砍掉不影响产出。
短板在哪里:哪个指标的 S⁻ 最大,哪个就是资源浪费最严重的环节,应该优先优化。

所以作者通过S⁻分析,进行调整数据,指明优化方向
六、模型的缺点
论文重现:
















DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)