Python:熟悉简单的skfuzzy构建接近生活事件的模糊控制器”(附带详细注释说明)+ 测试结果
参考资料:https: // blog.csdn.net / shelgi / article / details / 126908418
————通过下面这个例子,终于能理解一点模糊理论的应用了,感谢原作。
熟悉简单的skfuzzy构建接近生活事件的模糊控制器
假设下面这样的场景, 我们希望构建一套模糊控制系统, 通过室外温度和风的大小来判断穿几件衣服
室外温度的范围设置为0 - 40度, 虽然今年夏天超过40度在我们这边很平常, 但是我们这里还是以40度为最高界限
风的大小范围0 - 10, 这里不是风的级数, 而是我自己构建的大小.模糊理论奥妙就在于不需要精确的逻辑值,
可以模糊描述.比如小风我设置为1 - 3, 然后有点大的风等等, 都是比较抽象的描述, 但是经过隶属函数可以看出, 往往某个值是在多个状态叠加.
衣服的件数我设置为1 - 6(不能一件衣服不穿), 如果按照本人自己的爱好, 我最多也只穿三件.不过考虑到实际还是设一个大点的范围
常见模糊隶属度函数
import matplotlib.pyplot as plt
import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl
import matplotlib.pyplot as plt"""scikit-fuzzy模块,它可以实现模糊控制系统1.选择输入输出模糊集2.定义输入输出隶属度函数(不同的隶属度函数,会导致不同的控制特性)3.建立模糊控制表4.建立模糊控制规则5.模糊推理6.反模糊化7.输出结果绘制结果3D图
"""""" 方式一: 调用库函数 """
if 0:temp = ctrl.Antecedent(np.arange(0, 41, 1), 'temp')wind = ctrl.Antecedent(np.arange(0, 11, 1), 'wind')clothes = ctrl.Consequent(np.arange(1, 7, 1), 'clothes')# 自动找成员函数,分为三类temp.automf(3)wind.automf(3)# 设置目标的模糊规则clothes['low'] = fuzz.trimf(clothes.universe, [1, 1, 3])clothes['medium'] = fuzz.trimf(clothes.universe, [1, 3, 6])clothes['high'] = fuzz.trimf(clothes.universe, [3, 6, 6])rule1 = ctrl.Rule(temp['good'] | wind['poor'], clothes['low'])rule2 = ctrl.Rule(temp['average'], clothes['medium'])rule3 = ctrl.Rule(temp['poor'] | wind['good'], clothes['high'])rule1.view()rule2.view()rule3.view()# 创建控制系统,应用编写好的规则cloth_ctrl = ctrl.ControlSystem([rule1, rule2, rule3])# 创建控制仿真器cloth_num = ctrl.ControlSystemSimulation(cloth_ctrl)# 输入测试数据cloth_num.input['temp'] = 20cloth_num.input['wind'] = 2# 设置去模糊方法clothes.defuzzify_method = 'mom'# 计算结果cloth_num.compute()cloth_num_res = cloth_num.output['clothes']print(f"The result of clothes: {cloth_num_res}")# 可视化clothes.view(sim=cloth_num)plt.show()else:""" 方式二: 手动实现模糊规则 """plt.rcParams['font.family'] = 'simhei'x_temp = np.arange(0, 41, 1)x_wind = np.arange(0, 11, 1)x_clothes = np.arange(1, 7, 1)# 将三角隶属度函数对各个量进行隶属度映射temp_cold = fuzz.trimf(x_temp, [0, 0, 15])temp_warm = fuzz.trimf(x_temp, [5, 25, 35])temp_hot = fuzz.trimf(x_temp, [25, 40, 40])plt.figure()plt.title("Temperature")plt.plot(x_temp, temp_cold, 'b', label='cold')plt.plot(x_temp, temp_warm, 'y', label='warm')plt.plot(x_temp, temp_hot, 'r', label='hot')plt.legend()# plt.show()wind_low = fuzz.trimf(x_wind, [0, 0, 5])wind_medium = fuzz.trimf(x_wind, [0, 5, 10])wind_high = fuzz.trimf(x_wind, [5, 10, 10])plt.figure()plt.title("Wind")plt.plot(x_wind, wind_low, 'b', label='low')plt.plot(x_wind, wind_medium, 'y', label='medium')plt.plot(x_wind, wind_high, 'r', label='high')plt.legend()# plt.show()cloth_low = fuzz.trimf(x_clothes, [1, 1, 3])cloth_medium = fuzz.trimf(x_clothes, [1, 3, 6])cloth_high = fuzz.trimf(x_clothes, [3, 6, 6])plt.figure()plt.title("clothes")plt.plot(x_clothes, cloth_low, 'b', label='low')plt.plot(x_clothes, cloth_medium, 'y', label='medium')plt.plot(x_clothes, cloth_high, 'r', label='high')plt.legend()# plt.show()temp_test = 30wind_test = 5temp_level_cold = fuzz.interp_membership(x_temp, temp_cold, temp_test)temp_level_warm = fuzz.interp_membership(x_temp, temp_warm, temp_test)temp_level_hot = fuzz.interp_membership(x_temp, temp_hot, temp_test)wind_level_low = fuzz.interp_membership(x_wind, wind_low, wind_test)wind_level_medium = fuzz.interp_membership(x_wind, wind_medium, wind_test)wind_level_high = fuzz.interp_membership(x_wind, wind_high, wind_test)# 模糊规则# 当风小或者温度高的时候我们穿很少的衣服# 当温度中等, 比较温暖的时候我们穿得稍微多点# 当温度很低或者风很大的时候, 那我们就需要穿很多衣服了rule1 = np.fmax(temp_level_hot, wind_level_low)cloth_res_low = np.fmin(rule1, cloth_low)cloth_res_medium = np.fmin(temp_level_warm, cloth_medium)rule2 = np.fmax(temp_level_cold, wind_level_high)cloth_res_high = np.fmin(rule2, cloth_high)clothes = np.zeros_like(x_clothes)# visplt.figure(figsize=(8, 3))plt.title("结果")plt.plot(x_clothes, cloth_low, 'b')plt.fill_between(x_clothes, 0, cloth_res_low)plt.plot(x_clothes, cloth_medium, 'g')plt.fill_between(x_clothes, 0, cloth_res_medium)plt.plot(x_clothes, cloth_high, 'r')plt.fill_between(x_clothes, 0, cloth_res_high)# plt.show()# 去模糊aggregated = np.fmax(cloth_res_low, np.fmax(cloth_res_medium, cloth_res_high))# 去模糊方法:# 反模糊化方法有很多# centroid面积重心法# bisector面积等分法# mom最大隶属度平均法# som最大隶属度取最小法# lom最大隶属度取最大法cloth = fuzz.defuzz(x_clothes, aggregated, 'mom')cloth_res = fuzz.interp_membership(x_clothes, aggregated, cloth)plt.figure(figsize=(8, 3))plt.title(f"去模糊化结果cloth:{cloth}")plt.plot(x_clothes, cloth_low, 'b')plt.plot(x_clothes, cloth_medium, 'g')plt.plot(x_clothes, cloth_high, 'r')plt.fill_between(x_clothes, 0, aggregated, facecolor='orange')plt.plot([cloth, cloth], [0, cloth_res], 'k')plt.show()
- 测试温度:temp_test = 30;测试风速:wind_test = 5
- 测试温度:temp_test = 10;测试风速:wind_test = 8
- 测试温度:temp_test = 40;测试风速:wind_test = 2
相关文章:
Python:熟悉简单的skfuzzy构建接近生活事件的模糊控制器”(附带详细注释说明)+ 测试结果
参考资料:https: // blog.csdn.net / shelgi / article / details / 126908418 ————通过下面这个例子,终于能理解一点模糊理论的应用了,感谢原作。 熟悉简单的skfuzzy构建接近生活事件的模糊控制器 假设下面这样的场景, 我们希望构建一套…...
opencv函数使用查找
opencv官方文档地址:https://docs.opencv.org/4.x/index.html 先选对应的版本opencv-python 以这个函数为例子 model cv2.face.LBPHFaceRecognizer.create() 点开后找face类的LBP里面就有create函数的用法...
使用 pypdf 快速切分 PDF 文件
categories: [Python] tags: Python MacOS 写在前面 最近有小伙伴问我怎么把 PDF 文档切分成两个大小相近的 PDF文档, 要是在 mac 上, 直接无脑预览就行了, 但是这样不够跨平台, 之后我也尝试过 pymupdf, 但是奈何不支持 arm 架构, 后来还是用 Python 原生的 pypdf 了. 有 AI…...
Avalonia(11.0.2)+.NET6 打包运行到银河麒麟V10桌面系统
操作系统配置 项目结构 .net版本 这次我们是在银河麒麟V10系统上打包运行Avalonia(11.0.2)+.NET6.0的程序 开始打包 准备Linux下的桌面快捷方式以及图标 调整AvaloniaApplication2.Desktop.csproj的配置项,重点看下图红色线圈出来的部分,里面涉及到了LinuxPath的设置。完整的配…...
Mac nvm install failed python: not found
报错 $>./configure --prefix/Users/xxx/.nvm/versions/node/v12.22.12 < ./configure: line 3: exec: python: not found nvm: install v12.22.12 failed!解决方法 到 App 文件夹,并且打开 cd /System/Applications/Utilities/ open .记得改完 Rosetta 之…...
C语言基础知识复习(考研)
(1)C语言文件操作 1 什么是文件 文件有不同的类型,在程序设计中,主要用到两种文件: (1)程序文件。包括源程序文件(后缀为.c)、目标文件(后缀为.obj)、可执行这种文件的内容是程序代码。 (2)数据文件。文件的内容不是…...
Prometheus Grafana 配置仪表板
#grafana# 其实grafana提供了丰富的Prometheus数据源的仪表板,基本上主流的都有,通过下面官方地址可查阅 Dashboards | Grafana Labs 这里举例说明,配置node_exporter仪表板 首先,在上面的网站搜索 node 可以查到蛮多的仪表板…...
docker 哲学 - 网络桥接器、容器网络接口 、容器间的通信方式
1、解释 docker0 veth eth 2、vethXX 和 ethXX 是肯定一一对应吗 比如 eth1 对应 veth1 3、如果 A容器使用 默认创建方式 。定义他内部网络为 eth0,容器B使用 --network 连上 已创建的网络 172.89.2.1 。此时假设 B的 ip是 172.89.2.2 ,容器网络接口是 e…...
Python 将HTML转为PDF、图片、XML、XPS格式
网页内容是信息传播的主要形式之一。在Web开发中,有时候我们需要将HTML文件以不同的格式保存或分享,比如PDF、图片(如PNG或JPEG)、XML或XPS等。这些格式各有优势,适合不同的用途。在这篇文章中,我们将介绍如…...
排序算法记录(冒泡+快排+归并)
文章目录 前言冒泡排序快速排序归并排序 前言 冒泡 快排 归并,这三种排序算法太过经典,但又很容易忘了。虽然一开始接触雀氏这些算法雀氏有些头大,但时间长了也还好。主要是回忆这些算法干了啥很耗时间。 如果在笔试时要写一个o(nlogn)的…...
简单聊聊如何更优雅地初始化对象:构造函数、Builder模式和静态工厂方法比较
大家好,我是G探险者。 在平时的java编程中,你肯定会有过对一些实体对象进行初始化的set操作,有的对象的属性较少可能还好点,当一个对象拥有许多属性时,通常的初始化方式可能显得笨拙而不直观,代码写的很不…...
跳过mysql权限验证来修改密码-GPT纯享版
建议重新配置一遍,弄成功好多次了,每次都出bug,又要重新弄,不是过期就是又登不进去了,我服了 电脑配置MySQL环境(详细)这个哥们的10min配完,轻轻松松, 旧方法ÿ…...
Vue3快速上手(十七)Vue3之状态管理Pinia
一、简介 Pinia官网:https://pinia.vuejs.org/zh/ 从官网截图里可以直接看到,pinia是一个vuejs的状态(数据)管理工具。功能性同vuex。logo是小菠萝。它是一个集中式状态管理工具。就是将多个组件共用的数据管理起来,重复利用。有点类似缓存的意思。 二、Pinia环境搭建 …...
时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测
时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测 目录 时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现BiTCN-GRU双向时间卷积神经网络结…...
学习笔记Day14:Linux下软件安装
软件安装 Anaconda 所有语言的包(package)、依赖(dependency)和环境(environment)管理器,类似应用商店 Conda < Miniconda < Anaconda(有交互界面) Linux下Miniconda即可 安装Miniconda 搜索北外/清华miniconda镜像网站ÿ…...
【CXL协议-事务层之CXL.io(3)】
3.1 CXL.io CXL.io 为 I/O 设备提供非一致的加载/存储接口。 图 14 显示了 CXL.io 事务层在 Flex Bus 分层结构中的位置。 交易类型、交易数据包格式、基于信用的流量控制、虚拟通道管理和交易排序规则遵循PCIe定义; 请参阅 有关详细信息,请参阅 PCI Ex…...
如何自己构建 Ollama 模型
如何自己构建 Ollama 模型 0. 引言1. 下载原始模型2. 创建 Modelfile 文件3. 构建 Ollama 模型4. 运行自构建的 Ollama 模型 0. 引言 针对模型新出的大模型,可能 Ollama Models Library 不提供,或者会在今后的某个时点提供。还有可能 Ollama Models Lib…...
5.84 BCC工具之tcpretrans.py解读
一,工具简介 tcpretrans工具追踪内核TCP重传函数,以显示这些重传的详细信息。 它专门用于追踪TCP重传事件。在网络通信中,重传是由于数据包丢失、损坏或延迟到达而需要重新发送的情况。tcpretrans通过利用Linux内核中的BPF(Berkeley Packet Filter)机制,能够实时捕获和…...
从0到1实现RPC | 03 重载方法和参数类型转换
一、存在的问题 1.重载方法在当前的实现中还不支持,调用了会报错。 2.类型转换也还存在问题。 假设定义的接口如下,参数是float类型。 在Provider端接受到的是一个Double类型,这是因为web应用接收的请求后处理的类型。 在反射调用的时候就会…...
Matlab之已知2点绘制长度可定义的射线
目的:在笛卡尔坐标系中,已知两个点的位置,绘制过这两点的射线。同时射线的长度可以自定义。 一、函数的参数说明 输入参数: PointA:射线的起点; PointB:射线过的零一点; Length&…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...


