当前位置: 首页 > news >正文

用Python的SciPy库5分钟搞定超效率SBM模型(含非期望产出处理)

5分钟实战:用Python的SciPy库处理含非期望产出的超效率SBM模型

当你的研究数据中同时包含常规产出和污染排放等非期望产出时,传统DEA模型往往难以给出准确效率评估。本文将带你用Python的SciPy库快速实现一个考虑非期望产出的超效率SBM模型,从数据准备到结果解读一气呵成。

1. 环境准备与数据预处理

在开始建模前,我们需要确保环境配置正确并准备好标准化的数据格式。这个步骤往往被许多教程忽略,但却是保证后续分析可靠性的关键。

首先安装必要的库(如果尚未安装):

pip install numpy scipy pandas

典型的投入产出数据应包含三类指标:

  • 投入指标:如劳动力、资本、能源消耗等
  • 期望产出:如GDP、产品产量等
  • 非期望产出:如CO2排放、废水排放等

建议使用pandas的DataFrame来组织数据,以下是一个标准化的数据结构示例:

import pandas as pd data = { 'DMU': ['A', 'B', 'C', 'D'], 'Labor': [10, 15, 12, 18], # 投入1:劳动力 'Capital': [200, 300, 250, 400], # 投入2:资本 'GDP': [500, 600, 550, 700], # 期望产出 'CO2': [80, 120, 100, 150] # 非期望产出 } df = pd.DataFrame(data).set_index('DMU')

关键预处理步骤

  1. 数据标准化(特别是当不同指标量纲差异大时)
  2. 非期望产出指标取负值(因其与效率负相关)
  3. 检查数据完整性,处理缺失值

注意:非期望产出指标在建模时需要特殊处理,通常采用方向距离函数或将其视为"负产出"。

2. 超效率SBM模型核心实现

超效率SBM模型的核心是求解一系列线性规划问题。我们利用SciPy的linprog函数来实现这一过程,相比传统DEA模型,它能处理松弛变量并允许效率值超过1。

以下是完整的模型实现代码:

import numpy as np from scipy.optimize import linprog def super_sbm(inputs, good_outputs, bad_outputs, crs=True): """ 考虑非期望产出的超效率SBM模型 :param inputs: 投入指标矩阵 (n_dmu × n_inputs) :param good_outputs: 期望产出矩阵 (n_dmu × n_good_outputs) :param bad_outputs: 非期望产出矩阵 (n_dmu × n_bad_outputs) :param crs: 规模报酬不变假设 (True/False) :return: 各DMU的效率值 """ n_dmu = inputs.shape[0] efficiencies = np.zeros(n_dmu) # 将非期望产出视为负产出 outputs = np.hstack([good_outputs, -bad_outputs]) for k in range(n_dmu): # 目标函数系数 c = np.zeros(n_dmu + 1) c[-1] = 1 # 效率值的倒数 # 约束条件 A_ub = np.vstack([ np.hstack([outputs, -outputs[k].reshape(1, -1)]), # 产出约束 np.hstack([-inputs, inputs[k].reshape(1, -1)]), # 投入约束 ]) b_ub = np.zeros(A_ub.shape[0]) if crs: # 规模报酬不变约束 A_ub = np.vstack([A_ub, np.hstack([np.ones(n_dmu), 0])]) b_ub = np.hstack([b_ub, 1]) # 变量边界 bounds = [(0, None)] * n_dmu + [(None, None)] # 求解线性规划 res = linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=bounds, method='highs') if res.success: efficiencies[k] = 1 / res.x[-1] else: efficiencies[k] = np.nan return efficiencies

关键参数说明

  • crs:决定是否采用规模报酬不变假设
  • method='highs':使用高性能线性规划求解器
  • bounds:确保权重非负,但允许效率值超过1

3. 实战案例:区域碳排放效率评估

让我们用一个实际案例演示如何使用上述函数。假设我们有四个地区的投入产出数据:

# 投入指标:劳动力(万人), 资本(亿元), 能源(万吨标准煤) inputs = np.array([ [10, 200, 50], [15, 300, 70], [12, 250, 60], [18, 400, 90] ]) # 期望产出:GDP(亿元) good_outputs = np.array([ [500], [600], [550], [700] ]) # 非期望产出:CO2排放(万吨) bad_outputs = np.array([ [80], [120], [100], [150] ]) # 计算效率 eff_crs = super_sbm(inputs, good_outputs, bad_outputs, crs=True) eff_vrs = super_sbm(inputs, good_outputs, bad_outputs, crs=False) print("CRS假设下的效率值:", eff_crs) print("VRS假设下的效率值:", eff_vrs)

典型输出结果可能如下:

CRS假设下的效率值: [1.25 0.85 1.10 0.75] VRS假设下的效率值: [1.30 0.90 1.15 0.80]

结果解读要点

  1. 效率值>1表示该DMU处于生产前沿面上方(超高效)
  2. 效率值<1表示存在改进空间
  3. CRS与VRS结果的差异反映规模效率影响

4. 高级应用与常见问题处理

在实际应用中,我们经常会遇到各种特殊情况。以下是几个常见问题的解决方案:

4.1 处理零值或负值数据

当数据中存在零或负值时,传统DEA模型可能失效。解决方法包括:

  • 对数据进行平移变换
  • 使用特殊的距离函数
  • 采用非径向的SBM模型
# 数据平移示例(当存在负值时) shift = np.abs(np.min(inputs)) + 1 shifted_inputs = inputs + shift

4.2 模型选择指南

不同场景下的模型选择策略:

场景特征推荐模型优势
有非期望产出非期望产出SBM准确处理负向指标
需要区分高效DMU超效率SBM允许效率值>1
规模效应显著VRS模型考虑规模报酬可变
面板数据窗口分析或Malmquist分析效率动态变化

4.3 结果可视化技巧

使用matplotlib可以直观展示效率分布:

import matplotlib.pyplot as plt plt.figure(figsize=(10, 5)) plt.bar(range(len(eff_crs)), eff_crs, alpha=0.7, label='CRS') plt.bar(range(len(eff_vrs)), eff_vrs, alpha=0.7, label='VRS') plt.axhline(1, color='red', linestyle='--') plt.xlabel('DMU') plt.ylabel('Efficiency Score') plt.title('Efficiency Comparison (CRS vs VRS)') plt.legend() plt.show()

4.4 性能优化建议

当处理大量DMU时,可采取以下优化措施:

  • 使用稀疏矩阵存储约束条件
  • 并行化计算各DMU的效率
  • 采用更高效的求解器如Gurobi或CPLEX
from multiprocessing import Pool def parallel_sbm(args): """并行计算单个DMU的效率""" k, inputs, outputs = args # ... (省略具体实现) return efficiency # 使用多进程并行计算 with Pool() as p: results = p.map(parallel_sbm, [(k, inputs, outputs) for k in range(n_dmu)])

在实际项目中,我发现数据质量往往比模型选择更重要。一个常见误区是过度关注模型复杂度,而忽视了基础数据的清洗和验证工作。特别是在处理非期望产出指标时,确保指标方向和数据范围的一致性至关重要。

http://www.jsqmd.com/news/995067/

相关文章:

  • 别再死记硬背了!用Python实战SQL注入POC,手把手教你从BurpSuite手工到自动化脚本
  • 6/11
  • 终极免费音乐解决方案:3步解锁LXMusic全网音源完整指南
  • 2026年不锈钢水箱厂家推荐榜:消防/保温/承压水箱,304材质与方形圆形水箱深度评测与口碑优选 - 品牌发掘
  • OpenStudio完全指南:从零开始掌握建筑能源模拟的5大核心技能
  • ETS2LA完整指南:5步开启《欧洲卡车模拟2》自动驾驶体验
  • 2026从化区知识产权机构深度测评|北部生态产业甄选指南:专利申请、商标注册、软著登记、高新专精特新申报,适配美妆日化/温泉文旅/绿色农业/生态制造/康养产业企业避坑攻略 - 资讯纵览
  • 单点登录的基石:OAuth 2.1 与 OpenID Connect 如何编织安全可信的身份网络
  • 如何快速上手YimMenu:GTA V终极安全增强菜单完全指南
  • 小论文写作什么AI好用?精选5款工具,快速完成课程作业 - 掌桥科研-AI论文写作
  • 2026年 重庆化工原料最新推荐榜单:氯化铵/硫酸铵/氯化钾/硫化碱/硫磺/硫酸铜/甲醇/甲醛/甲缩醛/大孔树脂厂家精选与实力解析 - 品牌发掘
  • 从HDLBits到真实项目:手把手教你搞定Verilog时序逻辑中的同步/异步复位(附代码避坑)
  • 如何快速掌握AI字幕生成:开源工具的终极实战指南
  • 掌握AI教材写作技巧!低查重AI工具,让教材编写高效又省心!
  • Spring Boot项目集成国密SM2加解密,从生成密钥到接口调用的保姆级教程
  • MySQL索引底层为什么是B+树?
  • 2026 西安代办公司注销机构实力排行 本土靠谱注销代办认准森木财税 - 资讯纵览
  • 成都海归求职辅导:高效路径清晰呈现 - 虚拟星辰
  • ATmega328驱动的8×8全彩LED点阵硬件设计包(KiCad源文件+Gerber生产文件)
  • P87LPC764单片机UART串口与看门狗配置实战指南
  • 2026年成人教育GEO优化公司哪家好?趋势洞察报告 - GEO优化
  • PDF表格数据解放神器:Tabula 终极使用指南
  • 武汉配眼镜适合自己去哪,避开这些常见雷区 - 配眼镜新资讯
  • 保姆级教程:用双公头USB线给辽宁移动数码Q5盒子刷机(S905M芯片,EMMC存储)
  • 做海外移动市场分析,除了Sensor Tower,还有哪些实用广告情报工具? - 短商
  • 从One-Hot到Embedding:解锁NLP向量化的前世今生
  • 2026.6月成都名酒礼品回收市场亲身调研:从乱象到正规渠道的对比分析 - 资讯纵览
  • 抗菌母粒哪个公司好?专业选型认准天诗蓝盾 - 资讯纵览
  • Balena Etcher终极指南:3分钟掌握安全高效的镜像烧录技术
  • 告别图形界面:用ADB Shell命令行搞定Android WiFi状态查询与开关(附完整命令清单)