通常,我们让系统判断一件事时,回答大多应该是:是或者否,也就对应计算机中的1或者0,就好像我问你来了吗,你应该回答的来了或者没来,但是前段时间看视频,里面教授说了个很有意思的词,“如来”,来了吗,如来。就是好像来了,又好像没来,给人一种很模糊的感觉,其实模糊系统也是如此。
第一个应用模糊系统的产品是日本松下的洗衣机,那可能就有人好奇了,能用来干什么,听完娓娓道来:如果洗衣机要实现自动加水放水的功能,有时就需要一个阈值,又或者根据衣服上的泥污和油污来判断要洗衣服的时长,但这种事情要给出一个准确的数无疑是太难了,可是为什么你爸妈知道大概要洗多久呢,因为他们有经验,能根据经验判断大概放多少洗衣粉,洗多久,那想要把这种经验应用到机器上,就需要用到模糊系统了,通过我们建立规则,慢慢让系统明白,衣服比较脏的时候,就要多洗会儿,干净的就少洗会儿。
好了,俗话说完了,下面该说点专业上的分析了。
传统的控制结构系统是这样的:
你可以通过调节控制信号u,来使得输出信号达到要求。
那模糊系统其实也不复杂:
用模糊控制器FC代替传统控制器。
有人又要问了:不是,他凭什么就把传统的代替了,他高级在哪啊?
一般你要控制个东西,是不是要建立个精确的数学模型,但人只需要通过经验就可以控制的大差不差,我衣服太脏我就多洗一会,没必要精确到水要放多少毫升,大差不差就行,对于完全不了解底层逻辑的复杂系统而言,模糊真的太棒了!
①确定问题:首先,确定你要解决的深度学习问题,并确定哪些方面可能存在模糊或不确定性。
②收集数据:收集与问题相关的数据,并进行预处理,以便于模糊化处理。
③模糊化:将输入数据模糊化,将其转换为模糊集合,以表示不确定性程度。可以使用模糊化方法,如隶属函数或模糊集合。
④构建模糊规则:基于问题的特点和领域知识,设计一组模糊规则,用于推断模糊输出。
⑤推断:使用模糊规则和模糊化的输入数据,推断出模糊输出。
⑥解模糊化:将模糊输出转换为具体的结果,以解决深度学习问题。
整个流程的核心就是模糊控制器FC,而控制器的核心是知识库构成
当我们输入污泥和油脂的含量后,就可以得到洗涤时间这个输出结果。
下面我会通过洗衣机的例子一个个解释:
这个例子的问题就是:通过 确定污泥和油脂的含量后,系统会自动输出洗涤时间,完成自动控制。
该例子的数据我们可以根据情况进行设置,如果有题目给出,需要先对数据进行预处理,再进行下一步的操作。
我们将清晰的输入输出值通过隶属函数映射到模糊子集上,(下面会解释隶属函数)
模糊子集是什么呢,简单来说,我们可以把污泥的含量大致分为三类:污泥少(SD)、污泥中(MD)、污泥多(LD)。这三者组成了污泥的模糊子集。
那我想问个问题,当污泥含量为60%,他属于上面模糊子集的哪一类。这就需要隶属函数给出一个隶属值了,由此引出隶属函数。
隶属函数有很多种,我先一种以便于认识概念,三角形隶属函数:
通过这个隶属函数,我们不难看出,污泥含量60%时,有污泥中的隶属值有0.8,而污泥高的隶属值有0.2。(所谓隶属,这名字起的就很好,你更属于谁,就好像有三个帮派,你越有钱越可以去好的帮派,现在你有60大洋,那你就有0.8属于中间帮派,0.2属于大帮派了,要注意,这两个值加起来不一定要等于1,这不完全是概率的问题,隶属值是可以自己主观调整的。)
当然还有很多隶属函数,下篇文章我会仔细讲解隶属函数的分类。
如果污泥含量被我们分为三类的话,那油污含量也可以分为三类,由此我们就可以根据经验制定规则。
一共应该有3*3=9条规则,
根据上面的模糊规则,就能推断出输出,比如当油脂为MG,污泥为MD时,时间就应该是M(5)。当油污含量为60%,油脂含量为70%,那么根据隶属函数的图,我们可以得到:
污泥有两种情况,油脂也有两种,由此得到时间的四种结果,然后我们在时间的函数上寻找他们的交集就可以得到最终的总输出。之后最交集的图进行解模糊化就可以得到最终结果啦。(红色为交集后的结果)
当然我们还能进行列矩阵进行计算,这里我放一个例子,感兴趣可以结合着看:模糊控制的基本原理
解模糊化的方法有很多,常见的有三类解模糊器:重心解模糊器、中心平均解模糊器和最大值解模糊器。中心法是最好的方法了。下图是用的在最大值的平均值法。
后续会更新如何在MATLAB中使用模糊逻辑工具箱。
clear;
close all;
%模糊控制器设计
a=newfis('fuzzy'); %创建新的模糊推理系统
%输入1
a=addvar(a,'input','e',[-3,3]);
%添加e的模糊语言变量
a=addmf(a,'input',1,'N','trimf',[-3,-3,0]);
%隶属度函数为三角形函数
a=addmf(a,'input',1,'Z','trimf',[-3,0,3]);
a=addmf(a,'input',1,'P','trimf',[0,3,3]);
%图1
figure(1);
plotmf(a,'input',1);
%输入2
a=addvar(a,'input','de',[-3,3]);
%添加de的模糊语言变量
a=addmf(a,'input',2,'N','trimf',[-3,-3,0]);
%隶属度函数为三角形函数
a=addmf(a,'input',2,'Z','trimf',[-3,0,3]);
a=addmf(a,'input',2,'P','trimf',[0,3,3]);
%图2
figure(2);
plotmf(a,'input',2);
%输出
a=addvar(a,'output','u',[-4,4]);
%添加u的模糊语言变量
a=addmf(a,'output',1,'NB','zmf',[-4,-1]);
%隶属度函数为Z函数
a=addmf(a,'output',1,'NS','trimf',[-4,-2,1]);
a=addmf(a,'output',1,'ZE','trimf',[-2,0,2]);
a=addmf(a,'output',1,'PS','trimf',[-1,2,4]);
a=addmf(a,'output',1,'PB','smf',[1,4]); %隶属度函数为S函数
%图3
figure(3);
plotmf(a,'output',1);
%设置规则库
rulelist=[1 1 5 1 1;
1 2 4 1 1;
1 3 3 1 1;
2 1 3 1 1;
2 2 3 1 1;
2 3 2 1 1;
3 1 2 1 1;
3 2 2 1 1;
3 3 1 1 1];
a=addRule(a,rulelist); %添加模糊规则函数
showrule(a) %显示模糊规则函数
a1=setfis(a,'DefuzzMethod','mom'); %模糊化方法为平均最大隶属度函数法mom
writefis(a1,'fuzzy'); %保存模糊控制系统
a2=readfis('fuzzy'); %从磁盘读出保存的模糊系统
disp('fuzzy Controller table:e=[-3,+3],de=[-3,+3]'); %显示矩阵和数组内容
%上面代码的这些设置和规则我们可以自己在控制器中设置,而且更为简单,后面我会讲解
%推理
Ulist=zeros(7,7); %创立一个7×7的全零矩阵
for i=1:7
for j=1:7
e(i)=-4+i;
de(j)=-4+j;
Ulist(i,j)=evalfis([e(i),de(j)],a2); %完成模糊推理计算
end
end
Ulist=ceil(Ulist) %取整(向大数取)
%图4
figure(4);
plotfis(a2);