如何在Matlab中实现模糊逻辑

554 阅读10分钟

在Matlab中实现模糊逻辑

模糊逻辑是对逻辑推理进行建模的一种方式,其中一个语句的真值不能为真或假,但真度从0到1不等,其中0是绝对的假,而1是真的。

这种模糊逻辑是为模糊推理系统建模的,该系统使用人类可理解的规则而不是提取数学,将输入映射到一组输出。

这些类型的应用的主要用途是在控制系统中;在那里你输入参考和输入,同时在模糊逻辑上产生基于规则的执行信号。

一般来说,模糊逻辑不是一个控制系统,但你可以在任何一套需要决策的应用中使用它。

例如,在银行系统中,借出贷款的风险是基于个人和财务信息。

它还可以用来检测图像中的边缘,通过计算一个像素属于均匀强度区域与边缘区域的程度。

本文将研究如何在Matlab中使用模糊逻辑工具箱来应用这个方法。

前提条件

要继续学习本教程,你需要具备以下条件。

  • 安装了[MATLAB]。
  • 对[MATLAB]基础知识的正确理解。
  • 模糊逻辑的[概述]
  • [模糊逻辑的操作]

模糊逻辑的概述

开发一个模糊逻辑系统不需要一个复杂的模型。对于一个基础机制不完全清楚的复杂系统,它的效果很好。

只要你对系统有一定的经验和直觉,你就可以创建规则并实现它们。

模糊推理系统是人工智能的一种形式,允许计算机模仿人类解决问题的方式。

例如,一个人可能会说 "我挺饿的,但快到晚饭时间了"。在这句话中,"很饿 "和 "快到晚餐时间 "是两个模糊的概念。

什么叫 "相当饿 "和 "快到晚餐时间"?他还有多长时间可以吃晚饭?

一个人通过这些陈述,等待晚餐是不会有问题的。这都是基于对此类语句的经验而做出的决定。

另一方面,用计算机来决定这个人是应该吃饭还是等待吃饭;根据 "相当饿 "和 "快到吃饭时间 "的陈述,这将是一个挑战。

模糊逻辑和最终的模糊推理系统给了我们一种方法,以计算机理解的方式对基于经验的知识进行编码。

为了理解我们在这里的意思,让我们探讨一个银行家可能做出的评估贷款风险的决策过程。

银行家可能会使用在规则中发现的现有知识和经验来解决这个问题。

例如,这些数值可能是,如果一个人有良好的信用,那么申请人就被认为是低风险,如果他们的信用是中性的,那么他们就有中等风险,最后,如果信用不好,那么他们就有高风险。

这样一来,你就根据经验逐渐形成了规则,而数据为预测编码了知识。

假设你想想出一个可以自动访问风险的函数。

在这种情况下,根据现有的知识来决定将是有意义的,而不是对像人类金融这样复杂的东西开发一个数学模型。

但是,这其中存在着困难。这是因为我们的经验被编码为一种模糊的语言。

例如,好的信用评分是什么意思?任何高于750 是好的,而任何低于750 是坏的。

我们可以建立一个方程式,将信用值与750 ,如下图所示。

%This is not a real code but just to make you understand
if credit >= 750
return "credit is good"
else
return "credit is medium"

上面的陈述是一个逻辑性的陈述。这意味着它要么完全是真的,要么是假的。

我们设置的方程使这个问题容易解决。然而,问题是我们描述事物程度的语言术语是模糊的,即语言是不精确的。

使这种语言变得精确,我们就失去了一些意图。

在不同的银行家眼里,750 的分数可能被认为是好的,非常好的,或者是中性的。

因此,如果我们想对银行业的知识进行编码,我们需要考虑模糊性,这就是模糊逻辑的作用。

fuzzy concept

图1.0 模糊逻辑的流程图

如上图所示,你根据某些规则将输入转换成模糊输出。这个过程被称为模糊化。

你将模糊逻辑规则应用于模糊变量,以创造一个新的模糊数字。

最后,你把模糊数转回为一个清晰的。具体的输出被称为模糊化。

模糊逻辑方法

假设我们对100名银行家进行调查,要求他们分配从坏信用到中性信用的转变,以及从中性到好的转变。

在这种情况下,会有一个不同的值。

让我们假设每个银行家都认为750 及以上是好的信用,但只有一半认为700 是好的,没有人认为650 是好的。观点和想法是不同的!

这一切都描画出良好信用的特定成员函数。我们可以为中性信用和不良信用做同样的事情。

在这里,我们最终会有三个重叠的成员函数。

fuzzy logic

图2.0 基本的模糊概念

我们可以看到,语句的真值并不属于一个单一的集合,而是根据真值的程度,可以属于多个集合。

在Matlab中实现模糊逻辑

让我们考虑一个非常简单的例子。

我们需要通过改变输入电压来控制一个电机的速度,其中定义了一个阈值(设定点)。如果电机由于某种原因运行得很快,我们需要通过降低输入电压使其减速。

反之,如果电机的速度低于阈值(设定点),则必须提高输入电压,使电机达到设定点。

下面是对定义规则的输入的描述。

  • Too slow 将用于第一条曲线的描述
  • Just right 为第二条曲线
  • Too fast 为第三条输入曲线。

对于这些输入,第一条曲线的输出将是Less voltage (slow down) ,第二条曲线是no change ,第三条曲线是More voltage (speed up)

我们将看到如何将输入和输出的语句结合起来形成规则。

规则的基础是。

  • 如果电机运行得太慢,那么就增加电压。
  • 如果电机速度合适,那么就不改变。
  • 如果电机速度过快,那么电压就会减少。

我们将在一个模糊系统中定义所有这些,并为此创建一个文件。第一步是打开模糊逻辑工具箱。

要做到这一点,执行fuzzy 命令,显示一个新的窗口,如图所示。

fuzzy toolbox

图3.0 这就是模糊工具箱

在这里,我们有三个区块:输入、Mamdani和输出,进行各种处理。

在输入部分,我们接受用于模糊化过程的数据。输出部分显示输出结果;起到去模糊化的作用。

模糊化和去模糊化的含义仍与概述部分所解释的相同。

最后,Mamdani是为基于规则的块,帮助你在这个盒子里定义规则。

双击输入,打开一个窗口,如下图所示。

input window

图4.0 这是输入部分,用于输入你的变量

这里,我们有三个输入mf1mf2 ,和mf3

注意:你可以通过删除当前的名称,用适当的名称代替,并点击enter ,来重新命名这些变量。

例如,将我们的mf1 改为slow ,输出结果将是。

renaming

图5.0 重命名变量以使其合理化

你可以对其他输入和曲线做同样的事情。

现在让我们在范围框中定义我们的速度。

例如,假设我们的速度范围从0100 。我们将把[0 1] 矢量改为[0 100] ,如figure 1.0 所示。

我们可以为一个函数的n 成员有n 个规则。

为了简单起见,我们将把这个成员函数的数量看作是3

如果我们不断增加成员的频率,规则的数量也会不断增加。

因此,我们假设缓慢的范围是从050

点击该曲线,以及params 框,将现有的向量改为[0 0 50]

这同样适用于所有其他的输入。

第二个输入被重新命名为right ,意思是右速。速度的范围是在50100 之间。因此,right 的矢量将是[0 50 100]

最后一个输入应该被命名为high ,表示高速,范围应该在100 和以上。这个向量是[50 100 100]

[0 5] 作为范围。

  • mf1 改名为 ,范围从 到 ,给定为down 0 2.5 [0 0 2.5]
  • mf2 改名为 ,范围从 到 ,给定为no change 2.5 5.0 [0 2.5 5.0]
  • mf3 重命名为 是 ,以上则为 。high 5 [2.5 5 5]

这意味着,如果输出电压在mf1 ,则速度低,应提高速度。

当电压在mf2 范围内时,速度是正确的,不需要采取任何行动,但如果它落在mf3 ,速度就高,必须放慢。

再次选择输入,将其从input1 改为speed ,将output1 改为voltage ,以避免任何混淆。

现在,让我们定义我们基于规则的双击Mamdani

好的是,所有的规则都已经排列好了,你需要做的就是选择相应的输出。

definning the rules

图6.0 定义电机的模糊规则

你需要点击输入和相应的输出来制定规则。

defined rules

图7.0 最后定义的规则

定义完规则后,关闭并保存你的文件。

要保存,在工具栏上点击文件,选择save 。这个文件被保存为.fis ,它代表了模糊推理系统。

我们想在Matlab中调用这个文件,以找到任何输入速度的输出电压。

例如,test 变量持有从文件中读取数据的readfis 函数的值。要做到这一点,你要执行下面所示的代码。

test = readfis('filename')

读取后,我们现在可以使用evalfis 函数进行评估。例如,如果我们有40个转数,输出电压将是多少?这个评价如下图所示。

evalfis(40, test)

这将得到一个等效的输出2.5526 ,如下图所示。

output from evaluation

图8.0 最终输出

我们还可以看到电压与速度的变化。你用surfview 函数来做这件事,其变化如下图所示。

variation of voltage

图9.0 测试我们模型的功能

总结

模糊逻辑基本上是用于制作可以像人一样行动的模型。模糊逻辑的好处是,你不需要复杂的数学知识来创建你的模型。你应该以现有的规则为基础。

正如我们所看到的,这个工具箱没有那么复杂,因为你只需要把你的输入和期望的相应输出。