# 模糊逻辑：灰度认知，灰度决策，黑白执行

![](https://piccdn3.umiwi.com/img/201904/02/201904022301348737967277.jpg)

这一讲咱们说一个技术性的话题。你可能听说过一个名词叫“模糊逻辑” —— 国内也经常称之为“模糊数学”，我记得以前曾经一度是个流行话题。如果你从事自动控制之类的专业，你想必已经对模糊逻辑有所了解。而以我之见，这个思想也值得外行知道：这其实是一个把人的思维，量化成机械化操作的方法。

系统学习模糊逻辑有专门的教科书和课程，最好自己动手编程，实战操作一个项目。但是如果说其中最基本的原理和思想，我尽量十二分钟给你说明白。

＊

我们考虑这么一个问题 [1]。比如你在路上开车，你的正前方有一辆车停下来了，你要踩刹车。那这个刹车应该怎么踩呢？

这显然跟你距离前车的距离，和你当前的车速有关。我们假设刹车有四种踩法，分别是猛踩、中踩、轻踩、不踩。有充分驾驶经验的你，知道应该用下面这一系列规则去踩刹车 ——

我这么一说你完全能明白。那请问，如果我们要设计一个机械化的自动刹车系统，应该怎么让它执行这些规则呢？

机器不懂人类语言中的快慢远近是什么意思。机器只知道实际数值是多少。解决这个问题有两个思路。

一个思路是干脆不要管那套人类的规则。刹车无非就是距离和速度这两个变量的函数，我们弄一个数学模型，随时根据距离和速度计算刹车值不就行了吗？是可以，但有时候那个函数不好弄。比如现在就请你写一个刹车作为距离和速度的函数，我估计你很难写。

另一个思路是把人类那套规则给量化。比如什么叫距离近？你可以规定，50米以内叫“近”。这个定义简单粗暴，但是在工程上有个可行性问题。

比如我们要做一个自动的空调开关。如果你规定20摄氏度是理想温度，室温高于20度就开空调，低于20度就关，你猜会怎样？你的空调会在20.001度开启。空调一开启，室温马上降下来，而室温一到19.999度，空调又关上。然后温度就会上升，然后空调再开。你的空调会开关个不停！

当然空调还好办，毕竟只有一个参数，你可以设定一个比如说从19度到21度的温度范围，只在这个范围之外开关。可是像刹车系统至少要考虑距离和速度两个参数，这个设定范围的方法就不好办了。这就是“模糊逻辑（fuzzy logic）”登场的时刻。

＊

“模糊逻辑”是加州大学伯克利分校的数学家罗特夫·扎德（Lotfi Zadeh）在1965年提出的理论。他其实是要用数学语言去描写人类的形容词。

下面这张图定义了“冷”、“暖”、“热”三种温度 [2] —— 

![](https://piccdn3.umiwi.com/img/201904/02/201904022119298852523039.png)

如果温度非常低，那就是绝对的“冷”，温度在华氏70度附近是绝对的“暖”，在很高的地方是绝对的“热”。而在中间那些斜线地带，则是模糊的定义。

比如图中黑色竖线所在的位置，就即可以说是冷，也可以说是暖。根据竖线和两条斜线的交点，我们说那个温度既是“0.6的冷”，也是“0.5的暖”。

这就是模糊逻辑。传统逻辑 —— 我们这里称之为明确逻辑（crisp logic）—— 的逻辑数值只有0或者1：真就是1，假就是0。而模糊逻辑允许“半真半假”存在。这个温度冷不冷？0.6的冷。那暖吗？0.5的暖。

有了这个定义，你就可以平滑地描写一个温度的变化了，也更符合人的思维习惯。“现在很冷 —— 现在只是有点冷，也有点暖 —— 现在比较暖”，这个说法就完全可以翻译成数学。模糊逻辑把人类语言翻译成机器语言，也把人类设想的控制规则翻译成机器运算。

具体的做法，咱们还是用一个例子 [3] 说明。

＊

下面这个例子稍微有点烧脑，必须结合图形才能看懂。如果你不愿意费工夫的话，看看大概的思路就行。

我们设想这么一个情景。你把一支铅笔竖在手掌中心，铅笔会向一侧倒，而你要通过手掌在水平方向上的移动来控制它，让它始终不倒，搞一个动态平衡。简单起见，我们设想铅笔和你的手掌都只能往左、右两个方向移动，你移动速度的大小要由铅笔和手掌之间的角度，和那个角度变化的速度（简称角速度）决定。

用人的语言来说，你的操作规则应该是下面这样 ——

用模糊逻辑处理这个问题，分为三步：模糊化、规则计算、去模糊化。

## 1.模糊化

我们要把两个输入变量（铅笔的角度和角速度）和一个输出变量（手移动的速度）都用模糊逻辑描写。

比如说，铅笔的角度总共分为五档：负高、负低、零、正高、正低。这是人的语言，换成机器语言，多高算高，多低算低呢？我们使用下面这个图形把它模糊化（Fuzzification） —— 

![](https://piccdn3.umiwi.com/img/201904/02/201904022125394152502181.gif)

这种三角形的函数是模糊逻辑算法所常用的。这五个代表“负高、负低、零、正高、正低”的函数称为“隶属度函数（membershipt functions）”。

那我们设想现在机器读取了当前精确的角度值，就是图中黑色竖线所在的角度。变成模糊逻辑，现在角度的输入就是0.75的“零”（红色），也是0.25的“正低”（蓝色）。

类似地，把角速度也模糊化，就是下面这张图 —— 

![](https://piccdn3.umiwi.com/img/201904/02/201904022126150341897425.gif)

当前输入的这个角速度是0.4的“零”，也是0.6的“负低”。

## 2.规则运算

在模糊逻辑中，“如果……那么……”这个规则，是需要一条条运算出来的。通常的算法是“如果 A and B”的话，“那么……”后面的赋值是 A 和 B 二者中的最小值。

前面说了，角度有0.75的“零”，角速度有0.4的“零”，那么“如果铅笔角度是0，角速度也是0，那么手掌移动速度就是0”这条规则的计算结果，就取0.75和0.4的最小值，也就是0.4 —— 这就是这条规则对移动速度的赋值：移动速度有0.4的“零”。如下图 —— 

![](https://piccdn3.umiwi.com/img/201904/02/201904022127121277039577.gif)

但是角度和角速度还分别有“正低”和“负低”的逻辑值，所以下面这些逻辑规则也都要做相关的计算 ——

这三条规则又给速度计算出三个新的逻辑值来 ——

![](https://piccdn3.umiwi.com/img/201904/02/201904022128088730563177.gif)

![](https://piccdn3.umiwi.com/img/201904/02/201904022128292178525705.gif)

![](https://piccdn3.umiwi.com/img/201904/02/201904022128460428773817.gif)

加上前面那个，我们把速度的所有四个逻辑值计算结果叠加在一起，是下面这样的 ——

![](https://piccdn3.umiwi.com/img/201904/02/201904022129151061628526.gif)

这是一个模糊逻辑下的速度分布图。那速度输出到底应该是多少呢？这就需要“去模糊化（Defuzzification）”

## 3.去模糊化

如果一个速度是0.6的负低，0.4的零，0.25的零和0.25的正低，那这个速度到底是多少呢？去模糊化的方法有很多种，常用的一种是把它们叠加在一起，然后取图形的“重心”所在的位置，如下图 —— 

![](https://piccdn3.umiwi.com/img/201904/02/201904022130111840076365.gif)

图中那个红点的位置，就是我们这个模糊逻辑控制系统最终的输出。

总而言之，机器读取的输入是精确数值，角度和角速度是多少就是多少。可人的思考是模糊的，我们只知道高、低、左、右、零这些判断。所以我们必须先把精确值变成模糊值。然后根据人凭直觉想到的处理规则，对模糊值直接操作，得到一个输出结果 —— 也就是手掌移动速度 —— 的模糊值。可是具体操作又不能模糊，所以必须再把输出值给去模糊化。

可以说，这一波操作是灰度认知、灰度决策、黑白执行。

＊

你看这个操作是不是非常符合人的思维习惯。主教练说，“如果对方后卫逼的比较紧，你们就多传球多跑动；如果他们搞区域防守，你们就可以自己带带球……”那你说什么叫“紧”、什么叫“多”呢？这就是操作方法。

那些隶属度函数的具体数值，由工程师在实践中总结。

这个方法的一个好处是它的控制非常平滑，不会一惊一乍做突然的动作。更重要的是，它把人类的模糊思维翻译成了精确的机器语言。这在人工智能时代就非常可贵了，我们可以先按照人的思路搭建好模糊计算规则，然后用训练的方法得到哪些参数，这就是所谓“模糊专家系统”。模糊专家系统的稳健性特别好。

上世纪八十年代，很多日本公司在家电、火车控制等等的领域使用了模糊逻辑的控制方法，模糊逻辑的第一个正式应用就是仙台市的地铁系统。美国公司倒是用的不多。

![](https://piccdn3.umiwi.com/img/201904/02/201904022131124436829704.jpg)

那为啥模糊逻辑后来不流行了呢？那当然是因为计算机更强大了。回到我们一开始说的那第一个思路，直接用神经网络机器学习的方法判断输出，对现在的计算能力来说非常简单。

但模糊逻辑仍然有个最大的优势：它“理解”它在做什么，因为它本身就是人类命令的翻译。而对比之下，神经网络完全是个黑盒子 [4]。模糊专家系统，将来也许大有可为。

可我调研中发现一个非常奇怪的现象，有些人认为模糊逻辑是“伪科学” [5]：因为它的计算结果不是唯一的！可这不是完全合理的吗？我们在模糊化和去模糊化的过程中的确可以选择不同类型的函数和方法，但工程上的东西本来就是这样是灵活的，而且我们人类自己控制什么东西不也有自由度吗？如果模糊数学是伪科学，那神经网络算法简直就是神秘主义！

![](https://piccdn.umiwi.com/uploader/image/ddarticle/2022082516/1783931729225003620/082516.jpeg)

