基于熵权TOPSIS与Logistic回归的火灾报警多源信息融合建模
2026/9/21 13:40:56 网站建设 项目流程

1. 项目概述:从一道赛题到一套完整的解决方案

去年备赛的时候,我翻看了不少往年的优秀论文,2022年“五一杯”数学建模竞赛的C题“火灾报警系统问题”给我留下了很深的印象。这道题出得相当“接地气”,它没有悬浮在半空中的理论,而是把一个真实的、复杂的工程决策问题,直接抛给了参赛者。题目核心是让你扮演一个系统设计或评估专家,面对一个大型商场中多种火灾报警器(感烟、感温、火焰等)传回的海量、多源、可能互相矛盾的报警信号,去构建一套数学模型,来判断“到底有没有真的发生火灾”,以及“如果发生了,火源大概在哪里”。这本质上是一个多源信息融合不确定决策问题。

很多刚接触数学建模的同学看到这种题目可能会发懵,感觉涉及传感器、误报、漏报、信号处理,是不是需要特别深的控制理论或者消防工程背景?其实不然。这道题的魅力就在于,它允许你从纯粹的数学和数据角度切入,用我们熟悉的算法工具去构建逻辑框架。最终,大家提交的论文里,TOPSIS(优劣解距离法)、Logistic回归、熵权法这些关键词高频出现,恰恰说明了这一点——用合适的数学工具,去结构化地解决一个开放性的工程问题

这篇文章,我就以这道赛题为引子,结合我自己的理解和常见的求解思路,拆解一下从题目分析到模型构建,再到编程实现的全过程。无论你是正在备战数学建模比赛的学生,还是对数据分析、决策算法感兴趣的开发者,相信这个从实际问题到数学模型再到代码落地的完整链条,都能给你带来一些启发。我们不止步于“论文写了什么”,更要深挖“为什么用这个方法”以及“具体怎么实现”。

2. 问题核心拆解:把现实问题翻译成数学语言

拿到题目,第一步不是急着找算法套用,而是要把题目那一段段的描述性文字,翻译成我们可以处理的数学对象和明确的任务。这是建模成功与否最关键的一步,也是最体现功力的地方。

2.1 问题场景与关键挑战

题目设定在一个大型商场,内部安装了多种类型的火灾探测器(假设有N个),持续监测环境。每个探测器在某个时间点会输出一个报警信号,这个信号可能是一个数值(如烟雾浓度、温度值),也可能是一个状态(如“正常/报警”)。题目通常会提供一段时间的模拟数据或描述数据特征。

核心挑战非常明确:

  1. 不确定性:探测器有误报(没火报警)和漏报(有火不报警)的可能。误报率高会导致“狼来了”效应,造成资源浪费和恐慌;漏报率高则直接威胁安全。
  2. 矛盾性:不同位置的同类型探测器、同一区域的不同类型探测器,它们的报警信号可能不一致。比如,一个感烟探测器报警了,但附近的感温探测器却没反应。
  3. 时空关联性:真实的火灾有发展过程,会随时间蔓延,并且火源点附近的探测器应该反应更强烈。孤立地看单个时间点、单个探测器的信号是没有意义的。
  4. 决策目标:最终要输出两个明确的判断:(A) 是否发生真实火灾?(B) 如果发生,估计火源位置。

2.2 数学建模的任务定义

基于以上挑战,我们可以将问题分解为两个层次的任务:

任务一:火灾发生与否的综合判别(0-1决策问题)输入:在时间t,所有N个探测器的报警状态或量化数据。 输出:一个综合的火灾发生概率P_fire(t),或一个二分类结果(是/否)。 这需要融合多源信息,并处理信号的不确定性。

任务二:火源位置的估计(连续或离散空间中的定位问题)输入:在判定为火灾的时间段内,各探测器的报警强度、类型和已知的物理位置坐标。 输出:火源点的估计坐标(x, y, z)或所在区域。 这需要利用报警信号的空间分布特征与火灾物理模型(如信号衰减)进行反推。

2.3 核心思路:分层融合与综合评价

一个非常自然且有效的思路是采用分层融合策略

  1. 第一层:数据层/特征层预处理。对原始报警信号进行标准化、归一化,或许可以计算一些衍生特征,如某个探测器连续报警的时长、某个区域内报警探测器的密度等。
  2. 第二层:局部证据合成。例如,先将同一物理区域(如一个店铺内)的几个探测器看成一个“传感器组”,用某种方法(如D-S证据理论、加权平均)合成一个该区域的“局部火灾置信度”。
  3. 第三层:全局综合决策。将所有区域的局部置信度,或者所有探测器的处理后的信号,作为特征,输入到一个全局决策模型中,最终判断是否火灾,并估计位置。

TOPSIS和熵权法在这里主要作用于第三层,用于对多个评价指标(来自不同探测器或区域的特征)进行综合,得到一个全局的“火灾风险评分”。Logistic回归则可以作为一个强大的分类器,直接学习从特征到“是否火灾”的映射关系。

3. 模型构建详解:TOPSIS-熵权法与Logistic回归如何联动

很多人论文里会把TOPSIS和熵权法写在一起,把Logistic回归单独写,但模型之间缺乏联动。其实它们可以有机组合,形成更强大的解决方案。

3.1 熵权法:客观确定“谁说话更有分量”

在综合评判前,我们首先要确定各个评价指标的权重。题目中不同探测器的可靠性不同,不同特征的重要性也不同。熵权法是一种客观赋权法,它根据数据本身的离散程度来确定权重。离散程度越大(即熵越小),说明该指标在不同样本间差异大,携带的信息多,权重就应该大。

实操步骤:

  1. 构建初始矩阵:假设有m个时间样本(行),n个评价指标(列,如:探测器1报警强度、区域A置信度、整体报警占比等),形成矩阵 ( X = (x_{ij})_{m \times n} )。
  2. 数据标准化:将指标正向化(越大越好)并归一化。对于报警强度这类指标,本身就是正向指标。计算 ( p_{ij} = x_{ij} / \sum_{i=1}^{m} x_{ij} )。
  3. 计算信息熵:对于第j个指标,其信息熵 ( e_j = -k \sum_{i=1}^{m} p_{ij} \ln(p_{ij}) ),其中 ( k = 1/\ln(m) ) 保证 ( 0 \le e_j \le 1 )。
  4. 计算差异系数与权重:差异系数 ( g_j = 1 - e_j )。权重 ( w_j = g_j / \sum_{j=1}^{n} g_j )。
  5. 输出权重向量:( W = [w_1, w_2, ..., w_n] )。

注意:熵权法完全依赖输入数据。如果数据质量差或样本量少,求出的权重可能不稳定。在实际建模中,可以结合题目给出的探测器可靠性先验知识(主观赋权,如AHP层次分析法)与熵权法结果进行组合赋权,这样既尊重数据,又融入领域知识,模型会更稳健。

3.2 TOPSIS法:计算每个时刻的“火灾风险评分”

有了权重,我们就可以对每一个时间点(即一个样本)进行综合评价。TOPSIS的核心思想是:找出理想中最优解(正理想解)和最劣解(负理想解),然后计算每个样本与这两个解的距离,离正理想解越近、离负理想解越远,则综合评分越高。

实操步骤(接续熵权法之后):

  1. 构造加权规范矩阵:将标准化后的矩阵 ( Z )(元素为 ( z_{ij} ) )的每一列乘以对应权重 ( w_j ),得到 ( V = (v_{ij}) ),其中 ( v_{ij} = w_j \times z_{ij} )。
  2. 确定正负理想解
    • 正理想解 ( V^+ = (v_1^+, v_2^+, ..., v_n^+) ),其中 ( v_j^+ = \max(v_{ij}) )。
    • 负理想解 ( V^- = (v_1^-, v_2^-, ..., v_n^-) ),其中 ( v_j^- = \min(v_{ij}) )。
  3. 计算距离
    • 样本i到正理想解的距离 ( S_i^+ = \sqrt{\sum_{j=1}^{n} (v_{ij} - v_j^+)^2 } )。
    • 样本i到负理想解的距离 ( S_i^- = \sqrt{\sum_{j=1}^{n} (v_{ij} - v_j^-)^2 } )。
  4. 计算相对贴近度:( C_i = S_i^- / (S_i^+ + S_i^-) )。显然,( 0 \le C_i \le 1 )。( C_i ) 越大,说明该样本(时间点)的综合状况越好。在我们的问题中,可以将其解释为“火灾风险评分”,( C_i ) 越高表示火灾风险越低?这里需要小心!因为我们选取的指标(如报警强度、报警占比)都是正向指标(值越大越可能着火),所以计算出的 ( C_i ) 实际上是“与最优情况(无火)的贴近度”,( C_i ) 越小才表示火灾风险越高。因此,通常定义火灾风险指数 ( R_i = 1 - C_i )。这样,( R_i ) 越接近1,风险越高。

至此,我们通过熵权TOPSIS,将每个时间点上的多维度报警信息,综合成了一个单一的、可比较的火灾风险指数 ( R_i )。这个指数可以作为后续判断的一个重要输入特征。

3.3 Logistic回归:从风险指数到概率判决

TOPSIS给出了一个风险评分,但它本身不是一个分类器。我们如何设定一个阈值来判断“着火”还是“没着火”呢?拍脑袋定0.5吗?这不科学。Logistic回归在这里可以完美登场。

我们可以把问题转化为:基于一系列特征(包括TOPSIS计算出的风险指数 ( R ),以及其他特征如:最大报警强度、报警探测器数量、报警持续时间等),预测该时间点发生火灾的概率 ( P(y=1 | X) )。

模型形式: [ P = \frac{1}{1 + e^{-(\beta_0 + \beta_1 R + \beta_2 F_2 + ... + \beta_k F_k)}} ] 其中,( F_2, ..., F_k ) 是其他特征。

为什么用Logistic回归?

  1. 输出直观:直接输出概率值 ( P \in (0, 1) ),我们可以通过设定概率阈值(如0.7)来做出决策,这个阈值可以通过在验证集上最大化F1分数等指标来确定,比直接对风险指数设阈值更有依据。
  2. 可解释性:系数 ( \beta ) 的大小和正负,可以告诉我们每个特征对“着火”概率的贡献方向和程度。例如,如果 ( \beta_1 ) 很大且为正,说明TOPSIS风险指数 ( R ) 是一个强预测因子。
  3. 处理非线性:虽然本身是线性分类器,但我们可以引入特征交叉项(如 ( R \times ) 报警密度)或多项式特征来捕捉非线性关系。

实操流程

  1. 特征工程:利用原始数据构造特征数据集。每个样本(时间点)的特征包括:熵权TOPSIS风险指数 ( R )、各类探测器报警计数、空间报警密度、时间序列特征(如过去3个时间窗内的平均报警数)等。
  2. 数据准备:这需要模拟数据历史标注数据。对于比赛,题目可能会提供一部分带标签(着火/未着火)的数据用于训练,另一部分用于测试。如果没有,则需要根据题目描述,合理设定规则生成模拟训练数据,这是建模的关键一步。
  3. 模型训练:使用训练集数据拟合Logistic回归模型,得到系数 ( \beta )。
  4. 决策与评估:在测试集上,模型会输出每个样本的着火概率 ( P )。设定阈值 ( T )(例如0.65),若 ( P > T ) 则判为着火。然后使用准确率、精确率、召回率、F1分数等指标评估模型性能。特别注意:在火灾报警场景中,召回率(漏报率)通常比精确率(误报率)更重要,宁可误报,不可漏报。因此调整阈值或优化模型时,应优先保证高召回率。

4. 编程实现核心环节与代码解析

理论说得再多,不如一行代码。这里我用Python展示几个最核心环节的实现。假设我们已经有了一个DataFramedf,其中每一行是一个时间点的数据,列包括各种探测器信号和特征。

4.1 熵权法计算权重

import numpy as np import pandas as pd def entropy_weight(data): """ 计算熵权法权重 data: DataFrame, 行为样本,列为评价指标。所有指标需为正向指标。 """ # 1. 数据标准化 (归一化) data_normalized = data / data.sum(axis=0) # 2. 计算信息熵 # 避免log(0),用一个极小值替换0 data_normalized = data_normalized.replace(0, 1e-10) k = 1 / np.log(data.shape[0]) entropy = -k * (data_normalized * np.log(data_normalized)).sum(axis=0) # 3. 计算差异系数和权重 diversity = 1 - entropy weight = diversity / diversity.sum() return weight.values # 示例:假设我们有4个评价指标的特征 feature_columns = ['smoke_intensity_avg', 'temp_rise_rate', 'alarm_density', 'continuous_alarm_time'] X = df[feature_columns] weights = entropy_weight(X) print("熵权法计算得到的指标权重:", dict(zip(feature_columns, weights)))

4.2 TOPSIS计算综合评分

def topsis(data, weight): """ TOPSIS综合评价 data: DataFrame, 行为样本,列为评价指标。 weight: array-like, 各指标权重,长度等于data列数。 """ # 1. 数据标准化 (向量归一化) data_normalized = data / np.sqrt((data**2).sum(axis=0)) # 2. 计算加权规范矩阵 weighted_matrix = data_normalized * weight # 3. 确定正负理想解 positive_ideal = weighted_matrix.max(axis=0) negative_ideal = weighted_matrix.min(axis=0) # 4. 计算距离 dist_to_positive = np.sqrt(((weighted_matrix - positive_ideal) ** 2).sum(axis=1)) dist_to_negative = np.sqrt(((weighted_matrix - negative_ideal) ** 2).sum(axis=1)) # 5. 计算相对贴近度 closeness = dist_to_negative / (dist_to_positive + dist_to_negative + 1e-10) # 防止除零 # 6. 转换为风险指数 (假设指标均为正向,值越大风险越高) risk_index = 1 - closeness return risk_index # 计算每个时间点的TOPSIS风险指数 df['topsis_risk_index'] = topsis(X, weights)

4.3 Logistic回归模型训练与预测

from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.metrics import classification_report, confusion_matrix # 假设df中已有特征和标签列 # 特征:包括topsis_risk_index和其他构造的特征 feature_cols = ['topsis_risk_index', 'alarm_count', 'max_smoke_value', 'area_coverage_ratio'] # 标签:'fire_label',1表示着火,0表示未着火 label_col = 'fire_label' X = df[feature_cols] y = df[label_col] # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y) # 标准化特征 (对Logistic回归很重要) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # 创建并训练Logistic回归模型 # 注意:由于火灾数据通常极不平衡(着火样本极少),需要调整class_weight model = LogisticRegression(class_weight='balanced', random_state=42, max_iter=1000) model.fit(X_train_scaled, y_train) # 预测概率 y_pred_proba = model.predict_proba(X_test_scaled)[:, 1] # 着火类的概率 # 根据业务需求调整阈值 threshold = 0.3 # 为了降低漏报率,可以设定较低的阈值 y_pred = (y_pred_proba >= threshold).astype(int) # 评估模型 print("混淆矩阵:\n", confusion_matrix(y_test, y_pred)) print("\n分类报告:\n", classification_report(y_test, y_pred)) # 查看特征重要性(系数) coef_dict = dict(zip(feature_cols, model.coef_[0])) print("特征系数(重要性):", coef_dict)

实操心得:在真实比赛或应用中,数据往往是高度不平衡的(着火样本极少)。class_weight='balanced'参数至关重要,它让模型更关注少数类。此外,最终用于决策的概率阈值threshold不应固定为0.5,而应通过P-R曲线ROC曲线,结合对误报和漏报的成本权衡来选取。例如,若漏报成本极高,则选择召回率接近1的阈值点,即使精确率会降低。

5. 火源定位模型的补充思路

前四章主要解决了“是否着火”的判别问题。对于“火源在哪里”,这属于定位或估计问题,思路有所不同。这里简要补充几种常见方法:

  1. 加权质心法:最简单直观。将每个报警的探测器视为一个“质点”,其报警强度(或经过处理的置信度)作为该质点的“权重”,火源位置估计为所有报警探测器位置的加权质心。 [ (\hat{x}, \hat{y}) = \frac{\sum_{i=1}^{M} w_i (x_i, y_i)}{\sum_{i=1}^{M} w_i} ] 其中,( M ) 是报警探测器数量,( w_i ) 是第i个探测器的报警权重(如归一化的温度增加值),( (x_i, y_i) ) 是其坐标。这种方法计算快,但精度一般,假设了火源在报警探测器包围圈内。

  2. 基于信号衰减的优化模型:假设火灾产生的物理信号(如温度、烟雾浓度)随距离增加而衰减。建立信号强度与距离的数学模型(如指数衰减)。那么,对于观测到的各探测器信号强度 ( S_i ),可以反推一个火源位置 ( (x, y) ),使得该位置预测出的信号强度 ( \hat{S}_i(x, y) ) 与实际观测值 ( S_i ) 的总体误差最小。这转化为一个非线性最小二乘优化问题,可以用SciPy的least_squares求解。

    from scipy.optimize import least_squares def residual(params, detector_positions, observed_signals): x0, y0 = params predicted_signals = signal_model(detector_positions, x0, y0) # 需要自定义信号衰减模型 return predicted_signals - observed_signals initial_guess = [weighted_centroid_x, weighted_centroid_y] # 用加权质心作为初值 result = least_squares(residual, initial_guess, args=(detector_positions, observed_signals)) estimated_source = result.x
  3. 基于网格搜索的概率法:将商场区域离散化为细密的网格。对于每一个网格点,假设它为火源,根据信号衰减模型计算各探测器“应该”观测到的信号强度,并与实际观测值比较,计算一个似然概率。似然概率最高的网格点即为估计火源。这种方法计算量大,但更直观,易于理解。

6. 常见问题与避坑指南

在实现上述流程时,一定会遇到各种坑。这里把我总结的几个关键点列出来:

Q1:熵权法算出的权重,某个指标特别小甚至接近0,怎么办?A:这说明该指标在所有样本间数值差异极小,信息量很少。检查数据是否预处理不当(例如,该指标所有值都相同或在一个极小区间)。如果数据本身如此,那么这个指标可能确实不重要。但也要警惕,如果是因为量纲或数值范围问题导致差异被掩盖,应先进行合理的标准化(如Min-Max归一化)后再用熵权法。

Q2:TOPSIS计算出的风险指数,大部分样本都集中在0.5附近,区分度不高。A:这通常是因为选取的指标间相关性很强,或者正负理想解距离所有样本都差不多。可以尝试:1) 进行指标筛选,剔除高度相关的指标;2) 使用其他标准化方法(如极差标准化);3) 考虑换用其他综合评价方法,如灰色关联分析,它对数据分布要求较低。

Q3:Logistic回归训练时,即使加了class_weight,模型还是把所有样本预测为多数类(无火)。A:这是极端不平衡数据下的常见问题。可以尝试:1) 使用过采样(如SMOTE)或欠采样技术人工调整训练集分布;2) 尝试更复杂的模型,如随机森林、XGBoost,它们对不平衡数据通常更鲁棒;3) 进一步构造更有区分度的特征。最重要的是检查你的特征是否真的与“着火”标签相关。如果特征本身没有预测能力,任何模型都无能为力。

Q4:如何验证火源定位模型的精度?A:对于比赛,题目可能会给出若干次模拟火灾的火源真实坐标。你可以计算估计坐标与真实坐标之间的欧氏距离作为误差。对于没有真实坐标的情况,可以设计仿真实验:随机在商场平面图上假设多个火源点,用你设定的信号衰减模型生成各探测器的“模拟观测值”,再用你的定位算法去估计,计算平均误差和误差分布。

Q5:整个流程看起来很复杂,比赛时时间紧张,如何取舍?A:数学建模比赛讲究“快、好、亮”。首先保证有一个完整、逻辑自洽的模型框架(快)。在这个框架下,优先实现核心部分(如熵权TOPSIS+Logistic判别),并给出详细的分析和结果(好)。对于火源定位,如果时间不够,可以优先实现并详细分析加权质心法,因为它简单、可解释性强,并且能快速出结果。在论文中,可以简要提及更复杂的优化方法作为模型改进方向,这能体现思考的深度(亮)。

最后,我想强调的是,解决这类问题没有“标准答案”。TOPSIS、熵权法、Logistic回归只是工具,真正的核心在于你如何理解问题,如何将物理世界的不确定性和关联性,通过特征工程和模型设计,转化为数学世界可计算、可优化的对象。这道“火灾报警系统”题目的价值,正在于它提供了一个绝佳的沙盘,让我们演练从问题分析、模型构建、算法实现到结果评估的全过程。多练几次这样的完整流程,再遇到新的建模赛题,你心里自然就有了一张清晰的路线图。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询