Python模糊控制

news2024/12/24 10:06:50

Python模糊控制

概念和术语

模糊逻辑(Fuzzy Logic)是一种方法论,其基础是可以在连续统一体上表达某物的“真实性”。这就是说某事不是真或假,而是部分正确或部分错误。

模糊变量(fuzzy variable)具有明确的值(crisp value),该值在预定义的域(在模糊逻辑术语中,称为宇宙(universe))上取一些数字。明确的值是我们如何使用普通数学来思考变量。例如,如果我的模糊变量是给某人多少小费,它的范围将是 0 到 25%,并且它可能采用 15% 的清晰值。

模糊变量也有几个用于描述变量的术语。这些项合在一起就是模糊集(fuzzy set),可以用来描述模糊变量的“模糊值”。这些术语通常是形容词,如“差”、“平庸”和“好”。每个术语都有一个隶属函数(membership function),它定义了一个明确的值如何在 0 到 1 的范围内映射到该术语。本质上,它描述了某物“有多好”。
所以,回到小费的例子,一个“好小费”可能有一个成员函数,它有一个介于 15% 和 25% 之间的非零值,其中 25% 是一个“完全好的小费”(即,它的成员资格是 1.0)并且15% 是一个“勉强好的小费”(即它的成员是 0.1)。

模糊控制系统使用一组规则链接模糊变量。这些规则只是描述一个或多个模糊变量如何与另一个相关的映射。这些是用 IF-THEN 语句表示的; IF 部分称为前件(antecedent ),THEN 部分称为后件(consequent)。在小费示例中,一条规则可能是“如果服务好,那么小费也不错”。与如何使用规则根据前提值计算结果值相关的精确数学超出了本入门指南的范围。

小费问题

“小费问题”通常用于说明模糊逻辑原理从一组紧凑、直观的专家规则中生成复杂行为的能力。

以小费为例,如果我们要创建一个控制器来估计我们应该在餐厅给的小费,我们可以这样构建它:

  • 前导网络(输入)[Antecednets (Inputs)]

    • 服务
      • Universe(即明确的值范围):女服务员的服务有多好,从 1 到 10 打分?[service Universe (ie, crisp value range): How good was the service of the waitress, on a scale of 1 to 10?]
      • 模糊集(即模糊值范围):差、可接受、惊人[Fuzzy set (ie, fuzzy value range): poor, acceptable, amazing]
    • 食物
      • Universe:从 1 到 10 打分,食物有多好吃?[food quality Universe: How tasty was the food, on a scale of 1 to 10? ]
      • 模糊集:坏的,体面的,伟大的 [Fuzzy set: bad, decent, great ]
  • 结果(输出)[Consequents (Outputs) ]

    • Universe:我们应该给多少小费,从 0% 到 25% [ tip Universe: How much should we tip, on a scale of 0% to 25%]
    • 模糊集:低、中、高 [Fuzzy set: low, medium, high]
  • Rules

    • 如果服务好或食品质量好,那么小费就会很高。[IF the service was good or the food quality was good, THEN the tip will be high. ]
    • 如果服务是平均的,那么小费将是中等的。[IF the service was average, THEN the tip will be medium.]
    • 如果服务很差而且食物质量很差,那么小费就会很低。[IF the service was poor and the food quality was poor THEN the tip will be low. ]
  • Usage

    • If I tell this controller that I rated: 如果我告诉这个控制器我评价了:
      • the service as 9.8, and 服务为 9.8,和
      • the quality as 6.5, 质量为6.5,
    • it would recommend I leave: 它会建议我给出的小费参考:
      • a 20.2% tip. 20.2% 的小费。

代码实战

1.选择输入输出模糊集
2.定义输入输出隶属度函数(不同的隶属度函数,会导致不同的控制特性)
3.建立模糊控制表
4.建立模糊控制规则
5.模糊推理
6.反模糊化
7.输出结果绘制结果3D图
例子:输入为服务(service)和质量(quality)两个参数,输出为得到的小费(tip)

输入变量

关于用餐时给多少小费的决定有许多变量。考虑其中两个:

  • quality :食物的质量
  • service :服务质量

输出变量

输出变量只是小费金额,以百分比表示:

  • tip : 添加为小费的账单百分比

代码逻辑

出于讨论的目的,假设我们需要输入变量和输出变量的“高”、“中”和“低”隶属函数。这些在 scikit-fuzzy 中定义如下

import numpy as np
import skfuzzy as fuzz
import matplotlib.pyplot as plt

# Generate universe variables
#   * Quality and service on subjective ranges [0, 10]
#   * Tip has a range of [0, 25] in units of percentage points
x_qual = np.arange(0, 11, 1)
x_serv = np.arange(0, 11, 1)
x_tip  = np.arange(0, 26, 1)

# Generate fuzzy membership functions
qual_lo = fuzz.trimf(x_qual, [0, 0, 5])
qual_md = fuzz.trimf(x_qual, [0, 5, 10])
qual_hi = fuzz.trimf(x_qual, [5, 10, 10])
serv_lo = fuzz.trimf(x_serv, [0, 0, 5])
serv_md = fuzz.trimf(x_serv, [0, 5, 10])
serv_hi = fuzz.trimf(x_serv, [5, 10, 10])
tip_lo = fuzz.trimf(x_tip, [0, 0, 13])
tip_md = fuzz.trimf(x_tip, [0, 13, 25])
tip_hi = fuzz.trimf(x_tip, [13, 25, 25])

# Visualize these universes and membership functions
fig, (ax0, ax1, ax2) = plt.subplots(nrows=3, figsize=(8, 9))

ax0.plot(x_qual, qual_lo, 'b', linewidth=1.5, label='Bad')
ax0.plot(x_qual, qual_md, 'g', linewidth=1.5, label='Decent')
ax0.plot(x_qual, qual_hi, 'r', linewidth=1.5, label='Great')
ax0.set_title('Food quality')
ax0.legend()

ax1.plot(x_serv, serv_lo, 'b', linewidth=1.5, label='Poor')
ax1.plot(x_serv, serv_md, 'g', linewidth=1.5, label='Acceptable')
ax1.plot(x_serv, serv_hi, 'r', linewidth=1.5, label='Amazing')
ax1.set_title('Service quality')
ax1.legend()

ax2.plot(x_tip, tip_lo, 'b', linewidth=1.5, label='Low')
ax2.plot(x_tip, tip_md, 'g', linewidth=1.5, label='Medium')
ax2.plot(x_tip, tip_hi, 'r', linewidth=1.5, label='High')
ax2.set_title('Tip amount')
ax2.legend()

# Turn off top/right axes
for ax in (ax0, ax1, ax2):
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.get_xaxis().tick_bottom()
    ax.get_yaxis().tick_left()

plt.tight_layout()
plt.show()

在这里插入图片描述

模糊规则

现在,为了使这些三角形有用,我们定义了输入和输出变量之间的模糊关系。出于我们示例的目的,请考虑三个简单的规则:

  1. 如果食物不好或服务很差,那么小费会很低
  2. 如果服务可以接受,那么小费将是中等
  3. 如果食物很棒或服务很棒,那么小费就会很高。
服务质量\小费\食品质量BadDecentGreat
PoorLowLowMedium
AcceptableLowMediumHigh
AmazingMediumHighHigh

大多数人会同意这些规则,但规则很模糊。将不精确的规则映射到明确的、可操作的提示中是一项挑战。这是模糊逻辑擅长的任务。

规则应用

在以下情况下提示是什么:

  • 食品质量为 6.5
  • 服务质量是9.8

在这里插入图片描述

# We need the activation of our fuzzy membership functions at these values.
# The exact values 6.5 and 9.8 do not exist on our universes...
# This is what fuzz.interp_membership exists for!
qual_level_lo = fuzz.interp_membership(x_qual, qual_lo, 6.5)
qual_level_md = fuzz.interp_membership(x_qual, qual_md, 6.5)
qual_level_hi = fuzz.interp_membership(x_qual, qual_hi, 6.5)

serv_level_lo = fuzz.interp_membership(x_serv, serv_lo, 9.8)
serv_level_md = fuzz.interp_membership(x_serv, serv_md, 9.8)
serv_level_hi = fuzz.interp_membership(x_serv, serv_hi, 9.8)

# Now we take our rules and apply them. Rule 1 concerns bad food OR service.
# The OR operator means we take the maximum of these two.
active_rule1 = np.fmax(qual_level_lo, serv_level_lo)

# Now we apply this by clipping the top off the corresponding output
# membership function with `np.fmin`
tip_activation_lo = np.fmin(active_rule1, tip_lo)  # removed entirely to 0

# For rule 2 we connect acceptable service to medium tipping
tip_activation_md = np.fmin(serv_level_md, tip_md)

# For rule 3 we connect high service OR high food with high tipping
active_rule3 = np.fmax(qual_level_hi, serv_level_hi)
tip_activation_hi = np.fmin(active_rule3, tip_hi)
tip0 = np.zeros_like(x_tip)

# Visualize this
fig, ax0 = plt.subplots(figsize=(8, 3))

ax0.fill_between(x_tip, tip0, tip_activation_lo, facecolor='b', alpha=0.7)
ax0.plot(x_tip, tip_lo, 'b', linewidth=0.5, linestyle='--', )
ax0.fill_between(x_tip, tip0, tip_activation_md, facecolor='g', alpha=0.7)
ax0.plot(x_tip, tip_md, 'g', linewidth=0.5, linestyle='--')
ax0.fill_between(x_tip, tip0, tip_activation_hi, facecolor='r', alpha=0.7)
ax0.plot(x_tip, tip_hi, 'r', linewidth=0.5, linestyle='--')
ax0.set_title('Output membership activity')

# Turn off top/right axes
for ax in (ax0,):
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.get_xaxis().tick_bottom()
    ax.get_yaxis().tick_left()

plt.tight_layout()

在这里插入图片描述

规则聚合

在已知每个输出隶属函数的活动的情况下,必须组合所有输出隶属函数。这通常是使用最大运算符完成的。此步骤也称为聚合。

去模糊化 (Defuzzification)

最后,为了得到真实世界的答案,我们从模糊隶属函数的世界回到清晰的逻辑。出于本示例的目的,将使用质心方法。

结果显示小费为20.22%

# Aggregate all three output membership functions together
aggregated = np.fmax(tip_activation_lo,
                     np.fmax(tip_activation_md, tip_activation_hi))

# Calculate defuzzified result
tip = fuzz.defuzz(x_tip, aggregated, 'centroid')
tip_activation = fuzz.interp_membership(x_tip, aggregated, tip)  # for plot

# Visualize this
fig, ax0 = plt.subplots(figsize=(8, 3))

ax0.plot(x_tip, tip_lo, 'b', linewidth=0.5, linestyle='--', )
ax0.plot(x_tip, tip_md, 'g', linewidth=0.5, linestyle='--')
ax0.plot(x_tip, tip_hi, 'r', linewidth=0.5, linestyle='--')
ax0.fill_between(x_tip, tip0, aggregated, facecolor='Orange', alpha=0.7)
ax0.plot([tip, tip], [0, tip_activation], 'k', linewidth=1.5, alpha=0.9)
ax0.set_title('Aggregated membership and result (line)')

# Turn off top/right axes
for ax in (ax0,):
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.get_xaxis().tick_bottom()
    ax.get_yaxis().tick_left()

plt.tight_layout()
plt.show()

在这里插入图片描述

最后的思考

模糊系统的强大功能是允许基于稀疏的规则系统以最小的开销进行复杂、直观的行为。请注意,我们的隶属函数域是粗略的,仅定义为整数,但 fuzz.interp_membership 允许有效分辨率按需增加。该系统可以响应输入中任意小的变化,并且处理负担最小。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

联想笔记本电脑可以开机但是无法进入到桌面怎么办?

联想笔记本电脑可以开机但是无法进入到桌面怎么办?有用户使用的联想笔记本电脑出现了一些问题,电脑启动的时候屏幕是可以亮的,但是却出现错误代码,无法进入到系统操作界面中。那么这个情况是怎么回事呢?来看看以下的解…

AI根据图片自动建模

暂时放弃了,没显卡,直接装不了 用的是一个git上的老项目3年前的,最近更新6个月,由facebook开发 GitHub - facebookresearch/pifuhd: High-Resolution 3D Human Digitization from A Single Image. 他需要的环境有 Python 3PyTo…

微信xr-frame官方案例基础能力之渲染目标

前言:什么是渲染目标?(详见:RenderTarget-渲染目标) 在3D计算机图形领域,渲染目标是现代图形处理单元(GPU)的一个特征,它允许将3D场景渲染到中间存储缓冲区或渲染目标纹理…

视频压缩存储可以给油田带来什么好处?

航天安网监控视频压缩存储解决方案可以在不改变帧率、不改变视频分辨率、不改变时长、不损失特征点、不影响后续AI智能分析等条件下实现高清视频平均10倍以上无损压缩,压缩后视频文件大小平均为原文件大小的1/10,针对动态场景较少的环境,例如…

【Python】Python高校图书馆书籍管理系统(登录、注册、功能源码设计)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、…

ipa如何安装到iphone

这里以目前很火的奥普appuploader为例,先打开 appuploader,把 iPhone 用原装数据线连接,点击左侧的 appuploader一栏,会在右窗格中看到机器的相关信息,可以看到是否越狱一栏显示“是”。 接下来请点击左侧的“程序库”…

《汇编语言》- 读书笔记 - 实验1 查看 CPU 和内存,用机器指令和汇编指令编程

《汇编语言》- 读书笔记 - 实验1 查看 CPU 和内存,用机器指令和汇编指令编程 实验 1 查看 CPU 和内存,用机器指令和汇编指令编程1. 预备知识: Debug 的使用r 修改或显示寄存器的值d 查看内存数据e 编辑内存中指定地址的内容u 显示代码t 单步执行一条指令…

oa系统是什么?oa系统怎么用?

阅读本文你将了解:1.oa系统是什么;2.oa系统怎么用(oa系统功能模块)3.oa系统作用(案例) 一、oa系统是什么 oa系统全称为Office Automation,即办公自动化系统。它是一种专门为企业和机构的日常办…

Redis和数据库数据不一致该怎么做?

Redis和数据库数据不一致该怎么做? 答: 情景:redis作为缓存,当我们修改数据库的数据的时候,会出现Mysql和redis的数据不一致的问题 如图,当修改更新MYSQL数据为9后,还没来得及取更新redis&am…

linux系列小知识-手把手教你SSH怎么链接

目录 项目场景: 问题描述 原因分析: 解决方案: 项目场景: 应用场景:在机器装机后,如果没有显示,有没有串口,通常很难区操作调试,本文总结一篇通过搭建SSH链接去为调试…

操作符讲解2---C语言

目录 前言: 1.赋值操作符 2.单目操作符 2.1取地址操作符 2.2sizeof操作符 2.3和-- 3.关系操作符 4.条件表达式和逗号表达式 4.1条件表达式 4.2逗号表达式 5.下标引用&函数调用&结构访问 6.表达式与语句的关系 ❤博主CSDN:啊苏要学习 ▶专栏分类…

跨境电商卖家,如何运营Facebook?

随着跨境电商的兴起,越来越多的卖家开始运营Facebook,以吸引更多的潜在客户和提高品牌知名度。那么,作为跨境电商卖家,我们可以在Facebook上做些什么呢? 首先,我们可以通过Facebook建立一个专业的品牌页面&…

测试岗人员转型已是必然选择:我的十年自动化测试经验分享

目录 做测试十多年,有不少人问过我下面问题: 第一阶段:初级测试工程师 第二阶段:中级测试工程师 第三阶段:高级测试工程师/测试组负责人 第四阶段: 测试专家/测试经理 升华阶段(老手后5年—10年) 提…

搞怪独特的520文案表情包分享来啦

1. 你宁愿做狗也不和我表白,这个仇我记下了。 2. 这个夏天我不再是单身狗,请叫我热狗。 3. 我以为520是什么日子呢,特意去查了下史书,520是农历的四月初六潘金莲毒死武大郎的日子。 4. 520 你跟她过吧,我没借到钱&…

经常说的数据仓库,是如何存储数据的

一、 什么是数据仓库? 数据仓库(Data Warehouse),简称DW。数据仓库顾名思义,是⼀个很⼤的数据存储集合,出于企业的分析性报告和决策⽀持⽬的⽽创建,对多样的业务数据进⾏筛选与整合。它能为企业提供⼀定的BI&#xff…

CVPR 2023 | EfficientViT:让ViT在多个部署场景实现实时推理

随着近两年来对视觉Transformer模型(ViT)的深入研究,ViT的表达能力不断提升,并已经在大部分视觉基础任务 (分类,检测,分割等) 上实现了大幅度的性能突破。 然而,很多实际应用场景对模型实时推理…

从零入门激光SLAM(十)——刚体位姿表达与优化

大家好呀,我是一个SLAM方向的在读博士,深知SLAM学习过程一路走来的坎坷,也十分感谢各位大佬的优质文章和源码。随着知识的越来越多,越来越细,我准备整理一个自己的激光SLAM学习笔记专栏,从0带大家快速上手激…

django ORM框架 第三章 关联表的数据创建与查询

一、背景: 创建一组一对多的表。 # 班级表 class Class(models.Model):class_id models.IntegerField(primary_keyTrue, verbose_name班级id, help_text班级id)class_name models.CharField(max_length20,verbose_name班级名称, help_text班级名称)# 学生信息表 …

Centos虚拟机与window共享文件夹

1.安装完centos系统后,查看是否安装好VMware tools 如果未安装,请参考此文章安装: CentOS安装VMwareTools_centos安装vmware tools_Sunqk5665的博客-CSDN博客 2.添加共享文件夹 3.使用vmware-hgfsclient查看共享文件夹。本例中为share 4. 挂…

5.1 标准IO介绍及缓冲区

目录 标准I/O介绍 文件的概念和类型 标准I/O-流(可理解为数据) 流的缓冲类型 标准I/O——stdin,stdout,stderr 标准I/O介绍 在寄存器中的输入输出标准,在任何系统上可运行,是一系列的接口,所以被称为标准IO lin…