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'] = 20
    cloth_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 = 30
    wind_test = 5

    temp_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)

    # vis
    plt.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()

  1. 测试温度:temp_test = 30;测试风速:wind_test = 5
    在这里插入图片描述
  1. 测试温度:temp_test = 10;测试风速:wind_test = 8
    在这里插入图片描述
  1. 测试温度:temp_test = 40;测试风速:wind_test = 2
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/480476.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

隐语笔记3 —— 隐语架构

隐语架构一览 隐语产品层 定位: 通过可视化产品,降低终端用户的体验和演示成本。通过模块化API降低技术集成商的研发成本。 人群画像: 隐私保护计算集成商,产品人员,隐私保护计算需求方,开发人员&#xff…

2024年全球生成人工智能全景图【中文】

2024年全球生成人工智能全景图【中文】 在过去的一年中,产生式人工智能(GenAI)无疑成为了全球各行各业的热门话题。特别是ChatGPT的发布,激发了公众对GenAI强烈的兴趣和激动,唤醒了我们对其变革潜力的认知。 虽然我们…

Redis中的缓存雪崩

缓存雪崩 🤔现象分析 缓存雪崩是指在同一时段大量的缓存key同时失效或者缓存服务(Redis等)宕机,导致大量请求到达数据库,带来巨大压力。 👊 解决方案 利用Redis集群提高服务的可用性,避免缓存服务宕机给缓存业务添…

软件架构和基于架构的软件开发方法知识总结

一、软件架构定义 软件架构为软件系统提供了一个结构、行为和属性的高级抽象 软件架构是一种表达,使软件工程师能够: (1)分析设计在满足所规定的需求方面的有效性 (2)在设计变更相对容易的阶段,…

当我想用ChatGPT-Next-Web来套壳Azure OpenAI Service时

使用Cloudflare worker来代理Azure OpenAI API, 并将其转换为兼容OpenAI的API 一直没能搞定OpenAI的订阅, 就因为没有搞定国外的信用卡, 所以就一直使用GPT-3.5来处理日常的文字生成工作, 例如写文档, 生成一些简单的脚…

python网络相册设计与实现flask-django-nodejs-php

此系统设计主要采用的是python语言来进行开发,采用django框架技术,框架分为三层,分别是控制层Controller,业务处理层Service,持久层dao,能够采用多层次管理开发,对于各个模块设计制作有一定的安…

前端学习笔记 | AJAX

一、axios 是什么:AJAX是异步的JavaScript和XML。它可以在不重新刷新页面的情况下与服务器通信,交换数据,或更新页面。 概念:AJAX是浏览器与服务器进行数据通信的技术。 1、使用axios库与服务器进行数据通信 (1&#x…

skywalking监听apisix

一、原理 Skywalking结合OpenTelemetry Collector Apisix的promethus插件实现对apisix metrics数据的收集。 二、数据流图 1. Apisix Promethus插件从Apisix收集指标数据。 2. OpenTelemetry Collector通过promethus receiver获取来自Apisix Promethus插件的指标数据&#…

Codeforces Round 498 (Div. 3)

目录 A. Adjacent Replacements B. Polycarps Practice C. Three Parts of the Array D. Two Strings Swaps E. Military Problem F. Xor-Paths A. Adjacent Replacements 简单思维题 每一个数都变成第一个小于等于自己的的奇数 void solve(){cin>>n;while(n--){…

现在阿里云云服务器租用多少钱?一张表,报价单

2024年阿里云服务器优惠价格表,一张表整理阿里云服务器最新报价,阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单,大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新的云服务器优惠券…

c++核心学习5

4.6继承 有些类与类之间存在特殊的关系,例如下图中: 我们发现,定义这些类时,下级别的成员除了拥有上一级的共性,还有自己的特性。这个时候我们就可以考虑利用继承的技术,减少重复代码 4.6.1继承的基本语法…

Nature:“量子龙卷风”首次模拟黑洞

科学家们在超流体氦气中首次创造出了一个巨大的“量子漩涡”(quantum vortex),用以模拟黑洞。这一成就不仅使他们能够更加细致地观察模拟黑洞的行为,还能探究其与周围环境的交互作用。 诺丁汉大学的研究团队与伦敦国王学院和纽卡斯…

酷开会员 |酷开科技通过酷开系统让内容和用户完成适配

互联网大屏电视的趋势早有,从智能电视发行时就已见苗头,不过随着各大厂商在技术上的不断革新、模式上的不断突进,OTT模式给电视机行业带来了新一轮的风口。不论是什么企业或者行业,想要提升整体的效益,从效益层面来讲&…

后端程序员入门react笔记(九)- react 插件使用

setState setState引起的react的状态是异步的。操作完毕setState之后如果直接取值,可能取不到最新的值,我们举个例子console.log(this.state.num)打印的值,总是上一次的值而不是最新的。 import React, {Component} from react; class Ap…

[linux][调度] 内核抢占入门 —— 线程调度次数与 CONFIG_PREEMPTION

在工作中,如果你正在做开发的工作,正在在写代码,这个时候测试同事在测试过程中测出了问题,需要你来定位解决,那么你就应该先暂停写代码的工作,转而来定位解决测试的问题;如果你正在定位测试的问…

瑞_23种设计模式_状态模式

文章目录 1 状态模式(State Pattern)1.1 介绍1.2 概述1.3 状态模式的结构1.4 状态模式的优缺点1.5 状态模式的使用场景 2 案例一2.1 需求2.2 代码实现(未使用状态模式)2.3 代码实现(状态模式) 3 案例二3.1 …

数据中台:如何构建企业核心竞争力_光点科技

在当今信息化快速发展的商业环境下,“数据中台”已经成为构建企业核心竞争力的关键步骤。数据中台不仅是数据集成与管理的平台,更是企业智能化转型的加速器。本文将深入探讨数据中台的定义、特点、构建方法及其在企业中的作用。 数据中台的定义 数据中台…

基于python+vue的stone音乐播放器的设计与实现flask-django-php-nodejs

随着我国经济的高速发展与人们生活水平的日益提高,人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下,人们更趋向于足不出户解决生活上的问题,stone音乐播放器展现了其蓬勃生命力和广阔的前景。与此同时,为解决用…

2024年通信工程专业-毕业论文

2024年毕业设计-通信专业VoLTE掉话分析资源-CSDN文库 毕业设计 ----移动通信中VoLTE信令流程分析 学生姓名 专业班级 学 号 指导教师 完成时间 …

人像抠图HumanSeg——基于大规模电话会议视频数据集的连接感知人像分割

前言 人像抠图将图像中的人物与背景进行像素级别的区分的技术。通过人像分割,可以实现诸如背景虚化、弹幕穿人等各种有趣的功能,为视频通话和影音观看提供更加优质和丰富的体验。由于广泛部署到Web、手机和边缘设备,肖像分割在兼顾分割精度的…