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

TOPSIS算法实战:用Python给河流水质排个名,附完整代码与避坑指南

TOPSIS算法实战用Python给河流水质排个名附完整代码与避坑指南当环保部门拿到一份包含含氧量、PH值、细菌数、水草量等指标的河流水质数据时如何科学评估各条河流的健康状况传统的主观评分方法往往存在偏差而TOPSIS算法提供了一种客观量化的解决方案。本文将手把手带你用Python实现这一过程特别针对PH值等特殊指标的处理给出详细避坑指南。1. 理解TOPSIS算法的核心思想TOPSISTechnique for Order Preference by Similarity to Ideal Solution是一种多准则决策分析方法。它的核心思想很直观理想解假设存在一个所有指标都达到最优值的虚拟方案负理想解假设存在一个所有指标都是最差值的虚拟方案评分原理评估每个实际方案与这两个极端方案的距离距离理想解越近且距离负理想解越远的方案得分越高具体到河流水质评估场景# 伪代码示意 def topsis_score(data): ideal [max(含氧量), 7, min(细菌数), 介于500-1000的水草量] worst [min(含氧量), 偏离7最远的值, max(细菌数), 偏离500-1000最远的水草量] # 计算每个河流与理想解和负理想解的距离 dist_to_ideal 计算距离(河流数据, ideal) dist_to_worst 计算距离(河流数据, worst) return dist_to_worst / (dist_to_ideal dist_to_worst)2. 数据准备与指标类型分析假设我们有以下河流水质数据示例河流含氧量(%)PH值细菌数(个/ml)水草量(株)A河856.81200480B河927.2800750C河787.01500620指标类型分析极大型指标含氧量越大越好中间型指标PH值越接近7越好极小型指标细菌数越小越好区间型指标水草量500-1000为最佳注意在实际应用中指标类型的判断直接影响后续的正向化处理这是最容易出错的第一步。3. 数据正向化处理实战不同类型指标需要不同的正向化方法3.1 极大型指标处理含氧量原始数据已经是极大型无需处理oxygen df[含氧量].values3.2 中间型指标处理PH值PH值的最优值为7使用中间型转换公式def mid_to_max(x, best): m np.max(np.abs(x - best)) return 1 - np.abs(x - best)/m ph df[PH值].values ph_score mid_to_max(ph, best7)3.3 极小型指标处理细菌数使用取反法转换def min_to_max(x): return np.max(x) - x bacteria df[细菌数].values bacteria_score min_to_max(bacteria)3.4 区间型指标处理水草量最佳区间为[500,1000]def interval_to_max(x, a, b): m max(a - np.min(x), np.max(x) - b) score np.zeros_like(x) for i in range(len(x)): if x[i] a: score[i] 1 - (a - x[i])/m elif x[i] b: score[i] 1 - (x[i] - b)/m else: score[i] 1 return score plants df[水草量].values plants_score interval_to_max(plants, 500, 1000)避坑提示区间型指标的正向化最容易出错特别是当数据超出区间范围时的处理逻辑。4. 数据标准化与权重分配4.1 标准化处理消除量纲影响使用向量归一化def normalize(data): return data / np.sqrt(np.sum(data**2)) # 合并所有正向化后的指标 all_scores np.vstack([oxygen, ph_score, bacteria_score, plants_score]).T normalized normalize(all_scores)4.2 权重分配方法可以使用熵权法自动计算权重也可以根据专家经验手动分配。这里展示熵权法实现def entropy_weight(data): p data / np.sum(data, axis0) entropy -np.sum(p * np.log(p 1e-10), axis0) / np.log(len(data)) return (1 - entropy) / np.sum(1 - entropy) weights entropy_weight(normalized)5. TOPSIS核心计算与结果分析5.1 计算理想解与负理想解# 加权后的数据 weighted normalized * weights # 理想解各指标最大值 ideal np.max(weighted, axis0) # 负理想解各指标最小值 worst np.min(weighted, axis0)5.2 计算距离与得分# 欧式距离计算 dist_ideal np.sqrt(np.sum((weighted - ideal)**2, axis1)) dist_worst np.sqrt(np.sum((weighted - worst)**2, axis1)) # 综合得分 score dist_worst / (dist_ideal dist_worst)5.3 结果展示将结果添加到原始数据中df[TOPSIS得分] score df[排名] df[TOPSIS得分].rank(ascendingFalse) print(df.sort_values(排名))典型输出结果示例河流含氧量PH值细菌数水草量TOPSIS得分排名B河927.28007500.6821C河787.015006200.5212A河856.812004800.49736. 完整代码实现与优化建议以下是整合后的完整Python实现基于pandas和numpyimport numpy as np import pandas as pd def topsis_evaluation(df): # 正向化处理 oxygen df[含氧量].values ph df[PH值].values ph_score 1 - np.abs(ph - 7) / np.max(np.abs(ph - 7)) bacteria df[细菌数].values bacteria_score np.max(bacteria) - bacteria plants df[水草量].values a, b 500, 1000 m max(a - np.min(plants), np.max(plants) - b) plants_score np.where(plants a, 1 - (a - plants)/m, np.where(plants b, 1 - (plants - b)/m, 1)) # 标准化 scores np.vstack([oxygen, ph_score, bacteria_score, plants_score]).T normalized scores / np.sqrt(np.sum(scores**2, axis0)) # 熵权法计算权重 p normalized / np.sum(normalized, axis0) entropy -np.sum(p * np.log(p 1e-10), axis0) / np.log(len(normalized)) weights (1 - entropy) / np.sum(1 - entropy) # 加权标准化矩阵 weighted normalized * weights # 理想解与负理想解 ideal np.max(weighted, axis0) worst np.min(weighted, axis0) # 距离计算 dist_ideal np.sqrt(np.sum((weighted - ideal)**2, axis1)) dist_worst np.sqrt(np.sum((weighted - worst)**2, axis1)) # 综合得分 score dist_worst / (dist_ideal dist_worst) # 结果处理 result df.copy() result[TOPSIS得分] score result[排名] result[TOPSIS得分].rank(ascendingFalse) return result.sort_values(排名) # 使用示例 data { 河流: [A河, B河, C河], 含氧量: [85, 92, 78], PH值: [6.8, 7.2, 7.0], 细菌数: [1200, 800, 1500], 水草量: [480, 750, 620] } df pd.DataFrame(data) result topsis_evaluation(df) print(result)优化建议对于大型数据集可以使用numba加速距离计算添加数据有效性检查确保输入数据没有缺失值考虑实现可视化功能直观展示各河流得分情况可以扩展支持自定义权重而不仅限于熵权法7. 常见问题与解决方案在实际应用中我们可能会遇到以下典型问题问题1PH值正好为7时得分不是最高解决方案检查中间型指标的正向化公式实现确保最优值确实映射到最高分1。问题2所有河流得分非常接近难以区分优劣可能原因指标权重分配不合理或者数据本身区分度不大。解决方案重新考虑权重分配方法增加更多评价指标检查数据是否存在异常值问题3区间型指标边界值处理异常示例场景当水草量正好等于500或1000时得分异常。解决方案在区间边界条件判断时使用闭区间plants_score np.where(plants a, 1 - (a - plants)/m, np.where(plants b, 1 - (plants - b)/m, 1))问题4熵权法给出的权重不符合实际认知示例可能计算出细菌数的权重远高于其他指标。解决方案检查数据标准化是否正确考虑使用层次分析法等主观赋权法替代可以设置权重上下限在实际项目中TOPSIS算法往往需要与其他方法结合使用。例如可以先使用熵权法计算客观权重再结合专家打分确定最终权重这样既能反映数据特性又能融入领域知识。

相关文章:

TOPSIS算法实战:用Python给河流水质排个名,附完整代码与避坑指南

TOPSIS算法实战:用Python给河流水质排个名,附完整代码与避坑指南 当环保部门拿到一份包含含氧量、PH值、细菌数、水草量等指标的河流水质数据时,如何科学评估各条河流的健康状况?传统的主观评分方法往往存在偏差,而TOP…...

fluent_edem流固耦合方面的教学或者代做或者代码二次开发,气液固三相耦合。 接口优化...

fluent_edem流固耦合方面的教学或者代做或者代码二次开发,气液固三相耦合。 接口优化,计算速率大大提升。 模拟散体和颗粒材料的离散元法多用途仿真软件,支持GPU加速,与颗粒流软件PFC相比,具有友好的图形用户界面、更快…...

SQL视图实战:5个真实业务场景下的数据视图应用案例(附代码)

SQL视图实战:5个真实业务场景下的数据视图应用案例(附代码) 在数据驱动的业务环境中,SQL视图(View)就像给数据库操作装上了"快捷方式"按钮。想象一下,当市场部门需要实时销售数据时&a…...

Rolify 项目部署指南:从开发环境到生产环境的完整迁移流程

Rolify 项目部署指南:从开发环境到生产环境的完整迁移流程 【免费下载链接】rolify Role management library with resource scoping 项目地址: https://gitcode.com/gh_mirrors/ro/rolify Rolify 是一款功能强大的角色管理库,支持资源范围的权限…...

PDF-Extract-Kit-1.0教育应用:教材习题自动识别与题库构建

PDF-Extract-Kit-1.0教育应用:教材习题自动识别与题库构建 1. 引言 老师们每天都要面对一大堆教材PDF,里面藏着无数宝贵的习题资源。但手动把这些题目一个个抄出来,整理成电子题库,简直是个噩梦——费时费力还容易出错。有没有什…...

微信小程序集成通义千问:打造悬浮窗智能对话助手

1. 为什么要在微信小程序里集成通义千问? 最近两年AI对话助手火得一塌糊涂,但大部分应用都是独立APP或者网页版。其实对于很多轻量级场景来说,直接在微信小程序里集成AI助手反而更实用。想象一下,当你在小程序里购物遇到问题时&am…...

终极指南:掌握Starlight文档导航自定义排序的7个高级技巧

终极指南:掌握Starlight文档导航自定义排序的7个高级技巧 【免费下载链接】starlight 🌟 Build beautiful, accessible, high-performance documentation websites with Astro 项目地址: https://gitcode.com/gh_mirrors/st/starlight Starlight是…...

Llama-3.2V-11B-cot一文详解:low_cpu_mem_usage对加载速度提升37%

Llama-3.2V-11B-cot一文详解:low_cpu_mem_usage对加载速度提升37% 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具,专为双卡RTX 4090环境深度优化。该工具通过一系列技术创新,显著提升…...

解锁Mac微信潜能:WeChatExtension全功能增强方案

解锁Mac微信潜能:WeChatExtension全功能增强方案 【免费下载链接】WeChatExtension-ForMac Mac微信功能拓展/微信插件/微信小助手(A plugin for Mac WeChat) 项目地址: https://gitcode.com/gh_mirrors/we/WeChatExtension-ForMac 挖掘核心价值:突…...

MySQL误删数据别慌!手把手教你用binlog2sql从ROW格式日志恢复(附常见报错解决方案)

MySQL数据恢复实战:从误删到完美还原的完整指南 凌晨三点,当大多数人都沉浸在梦乡时,数据库管理员小李却被一阵急促的电话铃声惊醒。生产环境的核心用户表被误操作清空,数百万条用户数据瞬间消失。这种场景对于任何DBA来说都是噩梦…...

华为防火墙NAT(Easy-IP)实战:多区域安全访问控制与地址转换

1. 华为防火墙NAT(Easy-IP)技术解析 华为防火墙的NAT(Easy-IP)功能是企业网络架构中实现安全访问和地址转换的核心技术。简单来说,它就像是一个智能门卫,不仅负责检查进出人员的身份(安全策略),还能帮内部员工隐藏真实…...

如何用AI提升视频画质?Video2X全攻略:从技术原理到实践应用

如何用AI提升视频画质?Video2X全攻略:从技术原理到实践应用 【免费下载链接】video2x A lossless video/GIF/image upscaler achieved with waifu2x, Anime4K, SRMD and RealSR. Started in Hack the Valley II, 2018. 项目地址: https://gitcode.com/…...

Open Interpreter连接LM Studio:双引擎部署实战教程

Open Interpreter连接LM Studio:双引擎部署实战教程 1. 开篇:为什么需要本地AI编程助手? 想象一下这样的场景:你手头有一个2GB的CSV数据文件需要分析处理,但云端AI工具有文件大小限制;或者你正在处理敏感…...

Vivado进阶指南:网表物理约束实战解析

1. 网表物理约束的核心价值 第一次接触Vivado的网表物理约束时,我和很多初学者一样困惑:明明RTL代码已经定义了所有功能,为什么还要多此一举?直到在某次高速ADC数据采集项目中,系统频繁出现时序违例,我才真…...

OptiScaler终极指南:打破DLSS垄断,让所有显卡都能享受AI超分辨率

OptiScaler终极指南:打破DLSS垄断,让所有显卡都能享受AI超分辨率 【免费下载链接】OptiScaler DLSS replacement for AMD/Intel/Nvidia cards with multiple upscalers (XeSS/FSR2/DLSS) 项目地址: https://gitcode.com/GitHub_Trending/op/OptiScaler…...

Fish Speech 1.5在医疗健康领域的语音辅助应用

Fish Speech 1.5在医疗健康领域的语音辅助应用 1. 引言 在医疗健康领域,清晰准确的语音交流至关重要。医生需要向患者解释病情,护士要按时提醒用药,患者可能因为视力问题无法阅读病历资料。传统的文字信息在这些场景中往往显得不够直观和便…...

掌握8个wxappUnpacker实战技巧:小程序解包与代码还原完全指南

掌握8个wxappUnpacker实战技巧:小程序解包与代码还原完全指南 【免费下载链接】wxappUnpacker 项目地址: https://gitcode.com/gh_mirrors/wxappu/wxappUnpacker 为什么90%的小程序开发者都需要解包工具? 在小程序开发过程中,开发者…...

TradingView策略优化:基于机器学习的智能交易系统设计与实现

TradingView策略优化:基于机器学习的智能交易系统设计与实现 【免费下载链接】TradingView Start your trading journey with this projects advanced stop loss/take profit generator, enhancing your TradingView strategy. Utilize sklearns machine learning a…...

dry插件系统解析:如何扩展自定义Docker管理功能

dry插件系统解析:如何扩展自定义Docker管理功能 【免费下载链接】dry moncho/dry: dry(Docker Run Commands)是一款命令行工具,旨在简化对Docker容器的操作管理,提供了一种简洁的方式创建、启动、停止和删除Docker容器…...

实时数据处理实战:使用 Apache Flink 消费 Kafka 数据并进行窗口聚合

在大数据时代,实时处理流式数据已经成为企业级应用的标配。无论是用户行为分析、实时监控告警,还是金融风控系统,都离不开低延迟、高吞吐的流处理引擎。本文将带你从零开始,使用 Apache Flink 和 Kafka 构建一个完整的实时数据处理…...

告别模拟信号烦恼:手把手教你用51单片机驱动DAC0832输出正弦波(附Proteus仿真)

51单片机实战:用DAC0832打造完美正弦波发生器 在电子设计领域,能够精确生成模拟信号是一项基础却至关重要的技能。想象一下,当你亲手搭建的电路在示波器上显示出光滑的正弦波形时,那种成就感是无与伦比的。本文将带你从零开始&…...

Qwen3-TTS-VoiceDesign一文详解:speech_tokenizer作用机制与语音表征可视化

Qwen3-TTS-VoiceDesign一文详解:speech_tokenizer作用机制与语音表征可视化 1. 引言:从文字到声音的魔法转换 你有没有想过,为什么现在的AI语音合成听起来越来越像真人?为什么只需要用文字描述"温柔的成年女性声音"&a…...

Qwen3-ASR-1.7B问题解决:服务重启、音频格式兼容全攻略

Qwen3-ASR-1.7B问题解决:服务重启、音频格式兼容全攻略 1. 引言:语音识别服务的稳定性挑战 语音识别技术正在改变我们处理音频内容的方式,但在实际部署中,服务稳定性和格式兼容性常常成为绊脚石。Qwen3-ASR-1.7B作为阿里云通义千…...

Network Connection Class深度优化:10个提升网络检测精度的技巧

Network Connection Class深度优化:10个提升网络检测精度的技巧 【免费下载链接】network-connection-class Listen to current network traffic in the app and categorize the quality of the network. 项目地址: https://gitcode.com/gh_mirrors/ne/network-co…...

HiveSQL实战:巧用前后函数(lag/lead)解析用户行为序列

1. 窗口函数与用户行为分析的完美结合 做数据分析的朋友们应该都遇到过这样的场景:老板让你分析用户从浏览商品到最终下单的平均时间间隔,或者找出那些在关键页面停留时间过长的流失用户。这类问题本质上都是在分析用户行为序列,而HiveSQL中的…...

UniApp图片上传性能优化:从选图到上传的全流程提速方案

UniApp图片上传性能优化:从选图到上传的全流程提速方案 在移动应用开发中,图片上传功能几乎是社交、电商、内容创作类应用的标配功能。然而随着用户对体验要求的提高,简单的"选择-上传"模式已经难以满足性能敏感型场景的需求。特别…...

GUI智能体MAI-UI-8B API调用全攻略:从基础到进阶实战

GUI智能体MAI-UI-8B API调用全攻略:从基础到进阶实战 1. 认识MAI-UI-8B:你的GUI自动化助手 MAI-UI-8B是一款专为图形用户界面(GUI)操作设计的智能体,它能像人类一样"看"屏幕、"理解"界面元素并执行操作。想象一下&…...

dry容器管理实战:从创建、启动到停止删除的全流程操作

dry容器管理实战:从创建、启动到停止删除的全流程操作 【免费下载链接】dry moncho/dry: dry(Docker Run Commands)是一款命令行工具,旨在简化对Docker容器的操作管理,提供了一种简洁的方式创建、启动、停止和删除Dock…...

Photoshop AI绘画革命:3分钟学会Auto-Photoshop-StableDiffusion-Plugin终极指南

Photoshop AI绘画革命:3分钟学会Auto-Photoshop-StableDiffusion-Plugin终极指南 【免费下载链接】Auto-Photoshop-StableDiffusion-Plugin A user-friendly plug-in that makes it easy to generate stable diffusion images inside Photoshop using either Automa…...

VideoAgentTrek-ScreenFilter在CAD教学中的应用:自动筛选设计演示视频重点

VideoAgentTrek-ScreenFilter在CAD教学中的应用:自动筛选设计演示视频重点 每次上完CAD软件课,你是不是都有这样的感觉?老师演示了两个小时,鼠标点得飞快,步骤一个接一个。你录了屏,打算课后复习&#xff…...