简介:《山东大学人工智能导论概念汇总》是一份面向高校人工智能导论课程学习者的期末复习资料,围绕智能与知识、知识表示、确定性推理等核心内容梳理概念脉络,并对机器学习、搜索策略、推理方法与遗传算法等常见考点作重点归纳。资料为单个 PDF 文件,压缩包约 2.28MB,篇幅紧凑,便于按章节翻阅或打印后配合课堂笔记使用。内容按章节组织,涵盖绪论、知识表示与知识图谱、确定性推理方法等模块,对智能特征、知识特性、一阶谓词逻辑、产生式、框架与语义网络等基础概念作了条目化整理,并用标注提示重点与非重点,方便快速定位记忆。已有 434 人学习下载,适合需要建立知识框架、考前查漏补缺的学生使用。
1. 一份被删到只剩考点的概念汇总:它省掉的是哪 60% 的篇幅
期末前两周翻开教材,四百多页,考纲上要背的概念一百多个,真正在卷子上拉开分差的却只有两类题:把自然语言翻成谓词公式再归结出空子句,以及套 CF、Bel/Pl、模糊运算那几个公式。这份《人工智能导论概念汇总》V2 走的就是这条路——在原版基础上做了一遍删减,代码框里的内容被标成非重点,第一章绪论压成条目,第二章知识表示、第三章确定性推理、第四章不确定性推理按考点顺序排下来。它适合三类人:赶考试需要速查表的、概念能背但一算就断链的、想把「智能—知识表示—推理」这条主线一次性串起来的。下面按我拆这份笔记的顺序讲,重点放在公式怎么用、参数怎么代、哪一步最容易翻车。
2. 知识表示四条路线怎么选:谓词逻辑、产生式、框架与知识图谱的落地边界
知识表示这一章是整份笔记里信息密度最高的地方,因为它同时铺了四条路线,而考试最喜欢考「为什么这里用产生式不用谓词逻辑」。先记住一句总纲:知识表示的本质是把人类知识形式化或者模型化,而形式化的代价是丢失一部分表达能力。四条路线不是替代关系,是不同妥协方向的产物。选型时先问三个问题——要表达的知识是确定的还是带置信度的、结构是扁平的还是分层的、推理时需不需要保留变量和量词。答案不同,落点就不同。
2.1 一阶谓词逻辑:把自然语言句子翻译成可运算的公式
命题逻辑的死穴在笔记里写得很直白:它无法把所描述事物的结构及逻辑特征反映出来,也不能把不同事物间的共同特征表述出来。「A 是教师」和「B 是教师」在命题逻辑里是两个毫不相干的原子命题,没法共享「教师」这层语义。谓词逻辑把句子拆成谓词名加个体,Teacher(Zhang)这种一元谓词就出来了,再加上量词就能表达全称和存在。
翻译有四步,我一般按这个顺序走,不容易漏:
| 步骤 | 动作 | 常见失误 |
|---|---|---|
| 1 | 划定个体域,列出所有个体常量 | 把谓词名当成个体 |
| 2 | 为每个属性/关系定义谓词,写清元数 | 一元谓词和二元谓词混用 |
| 3 | 判断量词:全称配蕴含,存在配合取 | 全称后面直接接合取 |
| 4 | 检查量词辖域和变元约束 | 自由变元没被约束就收尾 |
第三步那条规则是最容易失分的地方,笔记里给的范式是(∀x)[ROBOT(x) → COLOR(x, GRAY)],全称量词后面接蕴含;如果写成合取,语义就变成「所有个体都是机器人且都是灰色」,直接把论域锁死了。存在量词反过来,配合取才对。
连接词的优先级从高到低是 ﹁、∧、∨、→、↔,这条必须背死。笔记里有个例子RUNS(Liuhua, faster) → WINS(Liuhua, champion),如果优先级记错,读法就完全变了。量词的辖域指位于量词后面的单个谓词或者用括弧括起来的谓词公式,辖域内被量词约束的叫约束变元,否则是自由变元。谓词公式的性质分永真性、永假性、可满足性、不可满足性、等价性、永真蕴含,后面归结原理能用上不可满足这一条。
这套表示法的优点是自然性、精确性、严密性、容易实现;局限也很明确——不能表示不确定的知识、组合爆炸、效率低。所以只要题目里出现「大约」「很可能」「置信度」这类词,就该换赛道了,别硬套谓词逻辑。
2.2 产生式与框架:规则库、综合数据库、控制系统三件套
产生式表示法解决的是「知识以规则形式存在」的场景。笔记给了四种形式,这四种是必背的对照:
| 知识类型 | 表示形式 | 说明 |
|---|---|---|
| 确定性规则 | P→Q | 前提成立则结论成立 |
| 确定性事实 | (对象,属性,值) | 三元组 |
| 不确定性规则 | P→Q(置信度) | 带可信度因子 |
| 不确定性事实 | (对象,属性,值,置信度) | 四元组 |
产生式和谓词逻辑里的蕴含式看着像,实际有两点区别:一是除逻辑蕴含外,产生式还包括各种操作、规则、变换、算子、函数;二是蕴含式只能表示精确知识,产生式既能表示精确知识也能表示不精确知识。这两条几乎每年都以简答形式出现,答题时按「范围更宽 + 容忍不确定」两句话写就够。
产生式系统的结构是三件套:规则库(描述相应领域内知识的产生式集合)、综合数据库(存放问题求解过程中各种当前信息的数据结构)、控制系统(一组程序,负责整个系统运行、实现对问题的求解)。控制系统里有个绕不开的动作叫冲突消解——匹配成功的规则可能不止一条,得按策略挑一条执行。笔记在第三章列了排序依据:按针对性、按已知事实的新鲜性、按匹配度、按条件个数。这四条既是产生式的冲突消解策略,也是后面推理章节的通用排序思路。
产生式的优点是自然性、模块性、有效性、清晰性;缺点直指效率不高、不能表达结构性知识。后半句就是框架表示法的入场理由。
框架是描述所论对象属性的数据结构,一个框架由若干槽组成,槽再由若干侧面描述。缺省值是框架的杀手锏——不填就继承默认。把具体信息填入槽或侧面后得到事例框架:
| 框架名 | 槽 | 值 |
|---|---|---|
| 〈教师〉 | 姓名 | 单位(姓、名) |
| 年龄 | 单位(岁) | |
| 性别 | 范围(男,女),缺省:男 | |
| 职称 | 范围(教授,副教授,讲师,助教),缺省:讲师 | |
| 部门 | 单位(系,教研室) | |
| 住址 | 〈住址框架〉 | |
| 工资 | 〈工资框架〉 |
槽值可以指向另一个框架名,这就是嵌套,也是继承性生效的地方:〈教师-1〉的住址填〈adr-1〉,工资填〈sal-1〉,改一个底层框架,所有引用它的实例都跟着变。框架的三个特点是结构性、继承性、自然性。答题时如果题目问「哪种表示法适合描述事物内部的层次结构」,答案就是框架,别写成知识图谱。
2.3 知识图谱的模式层与数据层:自顶向下还是自底向上
知识图谱被放在第二章末尾,位置很微妙——它既是一种表示法,也是前三种表示法在工程上的融合产物。定义是用各种不同的图形等可视化技术描述知识资源及其载体,挖掘、分析、构建、绘制和显示知识及它们之间的相互联系。也可以直接理解成一张图:节点表示实体或概念,边由属性或关系构成。
逻辑结构分两层,这层区分是考点:数据层由一系列事实组成,知识以事实为单位存储;模式层构建在数据层之上,是知识图谱的核心。用工程语言说,数据层是三元组仓库,模式层是本体和约束。
体系架构按数据形态收三种输入:结构化数据(知识定义和表示都比较完备)、半结构化数据(部分结构化,但存在大量结构化程度较低的数据)、非结构化数据(没有定义和规范约束的自由数据)。构建方式有两种,自顶向下是先定模式层再灌数据,自底向上是先抽实体关系再归纳模式。考场上问「哪种适合领域边界清晰的场景」,答自顶向下;问「开放域大规模数据」,答自底向上。
四种表示法我整理成一张选型对照,做题和做工程都用得上:
| 表示法 | 擅长表达 | 主要短板 | 典型触发词 |
|---|---|---|---|
| 一阶谓词逻辑 | 精确的、带量词的结构化命题 | 不确定知识、组合爆炸 | 「所有」「存在」「如果…则…」 |
| 产生式 | 经验规则、启发式知识 | 效率不高、结构性差 | 「规则」「若…则…置信度」 |
| 框架 | 层次化对象、默认属性 | 推理机制弱 | 「槽」「缺省」「继承」 |
| 知识图谱 | 实体关系网络、多源融合 | 构建成本高 | 「实体」「关系」「模式层」 |
顺手提一句:如果考纲里还有搜索策略和遗传算法,这份汇总只给了概念层面的条目,启发式函数怎么设计、遗传算法的编码与适应度怎么算,得自己补公式推导,别指望两页纸把状态空间搜索讲透。
3. 确定性推理手算流水线:子句集九步化简与归结反演的逐行核对
第三章是整份笔记最「硬」的部分,也是最能靠练习提分的部分。它先铺推理的分类,再落到自然演绎推理、子句集化简、鲁宾逊归结原理、归结反演、归结求解。学习路径很清楚:分类用来答简答,后三块用来答计算。别把这两类混着背,简答背关键词,计算必须动手写。
3.1 从谓词公式到子句集:九步里最容易错的三个动作
分类先过一遍,考选择题够用。推理是从已知事实出发,运用已掌握的知识找出其中蕴涵的事实或归纳出新的事实。按方向分演绎(一般到个别)和归纳(个别到一般),归纳再分完全归纳和不完全归纳;知识不完全时假设某些条件已具备,叫默认推理或缺省推理。按确定性分确定性推理和不确定性推理:前者知识与证据都确定,结论真值非真即假;后者不都确定,结论也不确定,这一条和第四章的区分要留意,笔记自己也注了「建议回答后者」。按单调性分单调推理和非单调推理,新知识加入后否定已有结论、退回前面某一步重来的就是非单调。按出发点分正向(事实驱动)、逆向(目标驱动)、混合(先正后逆或先逆后正)、双向(两头同时推、中途碰头)。带启发性知识的是启发式推理,启发式知识指与问题有关且能加快推理过程、提高搜索效率的知识。
然后进正题:谓词公式化为子句集。前置概念得先立住——原子谓词公式是不能再分解的命题,文字是原子谓词公式及其否定,子句是任何文字的析取式,空子句永假,子句集由子句构成。核心定理是:Q 为 P₁,P₂,…,Pₙ 的逻辑结论,当且仅当 (P₁∧P₂∧…∧Pₙ)∧¬Q 是不可满足的。
九步动作按顺序是:
- 消去
→和↔:P→Q ⇔ ﹁P∨Q,P↔Q ⇔ (P∧Q)∨(﹁P∧﹁Q) - 把否定符号 ﹁ 移到紧靠谓词的位置:双重否定律、德·摩根定律、量词转换律
- 变量标准化(去重名)
- 消去存在量词:不在全称量词辖域内就换个变量;在全称量词辖域内就 Skolem 化,用 Skolem 函数代替被存在量词量化的变量
- 化为前束形:前缀是全称量词串,母式是不含量词的谓词公式
- 化为 Skolem 标准形:
(∀x₁)(∀x₂)…(∀xₙ)M,M 为子句的合取式 - 略去全称量词
- 消去合取词
- 子句变量标准化
翻车集中在前三步和第四步。第一,否定内移时量词转换最容易漏:¬∀x P(x)要变成∃x ¬P(x),量词符号跟着翻,很多人只翻谓词不翻量词。第二,Skolem 函数必须把外层所有全称量词的变量都作为自变量带上,写成f(x₁,x₂,…)而不是常量a,一旦写成常量,后面合一就配不上。第三,变量标准化要在消去量词之后再做一次,否则不同子句里出现同名变量,归结时会误判为同一个变元。这三条我在批改别人手写过程时见得最多,几乎每次都有人栽在第二条。
3.2 归结反演的完整链路:招聘录取例题逐行推演
子句集准备好了才能上鲁宾逊归结原理。基本思想一句话:检查子句集 S 中是否包含空子句,包含则 S 不可满足;不包含就在 S 中选合适子句归结,一旦归结出空子句,就说明 S 不可满足。
命题逻辑层面,设 C₁ 与 C₂ 是子句集中的任意两个子句,如果 C₁ 中的文字 L₁ 与 C₂ 中的文字 L₂ 互补,那么从 C₁ 和 C₂ 中分别消去 L₁ 和 L₂,并将两个子句中余下的部分析取,构成新子句 C₁₂。归结式是其亲本子句的逻辑结论。谓词逻辑层面多一步:先求最一般合一,再做二元归结,因为两个子句里的变量名不同,得先找到让文字互补的替换。
归结反演的标准步骤是:把已知前提表示为谓词公式 F;把待证结论表示为 Q 并否定得 ﹁Q;把 {F, ﹁Q} 化为子句集 S;对 S 反复归结并把归结式并入 S;出现空子句即停止,此时 Q 为真。笔记给了一条实用建议:归结时按由长到短的子句顺序进行。这条不是玄学,短子句文字少、互补概率高,能更快收敛。
拿招聘例题走一遍。前提三条:三人中至少录取一人;如果录取 A 而不录取 B,则一定录取 C;如果录取 B,则一定录取 C。求证公司一定录取 C。定义P(x)表示录取 x。
- 前提 (1):
P(A)∨P(B)∨P(C) - 前提 (2):
P(A)∧¬P(B)→P(C),消去蕴含后是¬P(A)∨P(B)∨P(C),注意这里三项都要保留,括号别丢 - 前提 (3):
P(B)→P(C),即¬P(B)∨P(C) - 结论否定:
¬P(C)
子句集 S = {P(A)∨P(B)∨P(C), ¬P(A)∨P(B)∨P(C), ¬P(B)∨P(C), ¬P(C)},归结链条是:
P(A)∨P(B)∨P(C) 与 ¬P(A)∨P(B)∨P(C) ⇒ P(B)∨P(C) P(B)∨P(C) 与 ¬P(B)∨P(C) ⇒ P(C) P(C) 与 ¬P(C) ⇒ NIL三步出空子句,证明成立。这条链每步只消一个互补文字,别贪心一次消两个。
求解型题目比证明型多一个 ANSWER 谓词。步骤是:前提 F 化为子句集 S;待求解问题 Q 用谓词公式表示并否定,再与 ANSWER 构成析取式﹁Q∨ANSWER;把该式化为子句集并入 S 得 S′;对 S′ 归结;若得到归结式 ANSWER,答案就在 ANSWER 里。笔记里「小张的老师是谁」那道题就是范例:Teacher(Wang,Li)、Classmate(Li,Zhang)、¬Classmate(x,y)∨¬Teacher(z,x)∨Teacher(z,y),再加¬Teacher(A,Zhang)∨ANSWER(A),归结两步得ANSWER(Wang),答案是小王。这里最容易翻车的点是忘了把 ANSWER 一起并进去,只做纯否定,最后只能得到一个空子句,答案丢了。
3.3 用 30 行 Python 验证归结结果,免得手算翻车
手算归结最怕的不是不会,是算到一半分支选错,越推越长还以为自己没错。命题逻辑这一层完全可以写个小脚本兜底,把子句集喂进去,看能不能推出空子句。下面这段我平时用来对答案:
# 命题逻辑归结反演:判断子句集是否不可满足 from itertools import combinations def resolve(ci, cj): """对两个子句做一次归结,返回所有可能的归结式""" out = [] for lit in ci: if -lit in cj: # 找到一对互补文字 new = (ci - {lit}) | (cj - {-lit}) out.append(frozenset(new)) # 余下部分析取 return out def refute(clauses, max_round=20): """反复归结,出现空子句返回 True""" S = {frozenset(c) for c in clauses} for _ in range(max_round): new = set() for ci, cj in combinations(S, 2): for r in resolve(ci, cj): if len(r) == 0: # 空子句,等价于 NIL return True new.add(r) if new <= S: # 不再产生新子句,提前终止 return False S |= new return False # 招聘例题:整数编码命题变元,负数代表否定 # P(A)=1, P(B)=2, P(C)=3 S = [ [1, 2, 3], # P(A) ∨ P(B) ∨ P(C) [-1, 2, 3], # ¬P(A) ∨ P(B) ∨ P(C) [-2, 3], # ¬P(B) ∨ P(C) [-3], # ¬P(C),结论的否定 ] print(refute(S)) # True:推出空子句,P(C) 得证逻辑说明:resolve只处理「两个子句恰好存在一对互补文字」的情形,每次消掉一对,余下文字求并集,对应手算里的「消去 L₁ 和 L₂,余下部分析取」。refute用集合去重保存已产生的子句,每轮对所有子句两两组合归结,如果本轮没产生任何新子句就判定收敛、返回 False,这对应「没归结出空子句时既不能说 S 不可满足,也不能说 S 可满足」——脚本只能回答「在给定轮数内没找到证明」。参数max_round是安全阀,防止子句爆炸把内存吃满,实际手算对答案时给 10 就够,因为招聘例题三步就出空子句。
用的时候有两个前提:一是命题变元必须统一编号,同一个命题在不同子句里用同一个整数,符号靠正负区分;二是这段代码只覆盖命题层,谓词逻辑要先把变量合一、把最一般合一后的子句再映射成编号,否则P(x)和P(A)会被当成两个不相干的命题。谓词层的合一规则不复杂,但手动替换容易错,我一般手算完成合一步骤后,只用脚本验证命题骨架那一层。
4. 不确定性推理三套公式:可信度 CF、证据理论 Bel/Pl、模糊集合运算
第四章是整份笔记里公式最密的一章,三套方法各管一类场景:可信度方法处理「专家拍脑袋给的置信度」,证据理论处理「多个证据源对同一命题的支持如何合并」,模糊推理处理「边界不清的集合隶属」。这三套的数学工具完全不一样,千万别交叉套用——用 CF 的合成公式去算 Bel,或者拿隶属度去当概率,是典型的概念性错误。
4.1 可信度 CF 的传递与合成:min/max 与那条分段公式
不确定性推理的定义是:从不确定性的初始证据出发,通过运用不确定性的知识,最终推出具有一定程度的不确定性但却是合理或者近乎合理的结论的思维过程。可信度是根据经验对一个事物或现象为真的相信程度,知识不确定性表示为if P then Q (CF(Q,P)),CF(Q,P) 是可信度因子,反映前提条件与结论的联系强度,取值范围 [-1, 1]。取 0 表示证据出现与否与结论 H 无关。
证据本身的不确定性用 CF(E) 表示,三个锚点必背:CF(E)=1 能肯定它为真;CF(E)=0 未获得任何相关观察;CF(E)=-1 能肯定它为假。
组合证据的算法是取极值:多个单一证据的合取E = E₁ AND E₂ AND … AND Eₙ时,CF(E) = min{CF(Eᵢ)};析取E = E₁ OR E₂ OR … OR Eₙ时,CF(E) = max{CF(Eᵢ)}。
传递算法只有一条公式:CF(H) = CF(H,E) × max{0, CF(E)}。那个 max 是关键——当 CF(E) < 0 时,CF(H) 直接归 0,不乘负数,因为证据为假不能反过来支持结论。
合成算法处理「多条知识推出同一结论」:
(1) 分别求每条知识对 H 的影响: CF₁(H) = CF(H,E₁) × max{0, CF(E₁)} CF₂(H) = CF(H,E₂) × max{0, CF(E₂)} (2) 按符号分三种情况合成笔记里的例题数值我逐行核对过:CF(E₁) = 0.7 × max{0, min{0.5, max{0.6, 0.7}}} = 0.7 × 0.5 = 0.35;CF(E₂) = 0.9 × max{0, min{0.6, 0.9}} = 0.9 × 0.6 = 0.54。这一步的嵌套顺序要看清:先算内层 max 再算 min,最后乘外层系数。接着 CF₁(H) = 0.8 × 0.35 = 0.28,CF₂(H) = 0.6 × 0.8 = 0.48,CF₃(H) = -0.5 × 0.54 = -0.27。
合成两步:同号先合,CF₁,₂(H) = 0.28 + 0.48 − 0.28×0.48 ≈ 0.63;再与异号的 -0.27 合,(0.63 − 0.27) / (1 − min{0.63, 0.27}) = 0.36 / 0.73 ≈ 0.49。笔记里写 0.631 是四舍五入后的中间值,用 0.6256 算会得到 0.487,两者在答案允许误差内,考试写公式比写小数更重要。
4.2 证据理论的 Bel 与 Pl:概率分配函数不是概率
证据理论的第一道坎是把概率分配函数和概率区分开。概率分配函数作用在子集上,不是作用在元素上,这是它和普通概率最大的差别。设 D 为样本空间,函数 M 满足 M(∅)=0 且所有子集的 M 值求和为 1(不同教材对 M(∅) 的处理略有差异,笔记按 M(∅)=0 讲,答题时跟教材走)。
信任函数 Bel(A) 表示对 A 为真的总的信任程度:Bel(A) = Σ M(B),B 取遍 A 的所有子集。必背性质:Bel(∅) = M(∅) = 0。
似然函数 Pl(A) 又叫不可驳斥函数、上限函数,表示对 A 为非假的信任程度:Pl(A) = 1 − Bel(¬A)。
拿笔记的例题走一遍,D = {红,黄,蓝},M({红}) = 0.3,M({黄}) = 0,M({红,黄}) = 0.2。则Bel({红,黄}) = 0.3 + 0 + 0.2 = 0.5;Pl({蓝}) = 1 − Bel(¬{蓝}) = 1 − Bel({红,黄}) = 1 − 0.5 = 0.5。这一步的坑在于 ¬{蓝} 等于 {红,黄},得先把补集写对再查 Bel。
正交和用来合并两个证据源。若 K ≠ 0,正交和 M 也是一个概率分配函数;若 K = 0,则不存在正交和,说明 M₁ 与 M₂ 矛盾。基于证据理论的推理流程是三步:建立样本空间 D(由经验给出,或由随机性规则和事实的信度度量求得);计算所关心子集的信任函数值和似然函数值;由这两个值得出结论。答题时把 Bel 和 Pl 成对写出来,比只写一个更稳。
4.3 模糊集合运算与模糊决策:Zadeh 记法到加权平均
模糊逻辑给集合中每一个元素赋予一个介于 0 和 1 之间的实数,描述其属于一个集合的强度,所有元素的隶属度全体构成隶属函数。表示方法有三种:Zadeh 表示法、序偶表示法、向量表示法。Zadeh 记法写成A = 0.2/x₁ + 0.4/x₂ + …,这里的加号是罗列不是算术加,斜杠也不是除法,属于纯记号,初学时最容易误算。
运算规则按笔记的例题反推最清楚。设 A = 0.2/x₁ + 0.4/x₂ + 0.9/x₃ + 0.0/x₄ + 0.5/x₅,B = 0.1/x₁ + 0.0/x₂ + 0.7/x₃ + 1.0/x₄ + 0.3/x₅,五种运算的结果分别是:
| 运算 | 规则 | 第 1 个元素结果 | 第 3 个元素结果 |
|---|---|---|---|
| 代数积 A·B | μA × μB | 0.2×0.1=0.02 | 0.9×0.7=0.63 |
| 代数和 A+B | μA + μB − μA×μB | 0.2+0.1−0.02=0.28 | 0.9+0.7−0.63=0.97 |
| 有界和 A⊕B | min(1, μA+μB) | 0.2+0.1=0.3 | 0.9+0.7→1 |
| 有界积 AⓧB | max(0, μA+μB−1) | 0.2+0.1−1→0 | 0.9+0.7−1=0.6 |
| 交 / 并 | min / max | 0.1 / 0.2 | 0.7 / 0.9 |
代数和与有界和最容易混:前者减掉乘积项,后者直接截断到 1。模糊关系是两个模糊集合中元素之间关联程度的多少,合成对应到矩阵运算时,乘号用 min、加号用 max,这套 min-max 合成不要和代数运算混着用。
模糊决策是把模糊推理得到的结论或操作(一个模糊向量)转化为确定值的过程,三种方法:最大隶属度法(取隶属度最大的元素)、加权平均判决法(以隶属度为权重求加权平均)、中位数法(取累积隶属度等于 0.5 的位置)。选哪个看题目要求,没要求时优先加权平均,它能保留全部信息。
下面这段脚本用来核对上面两类数值,考试前跑一遍比看十遍例题有用:
# 可信度合成 + 模糊集合运算,用来核对笔记例题的中间值 def cf_transfer(cf_he, cf_e): """不确定性传递:CF(H) = CF(H,E) × max{0, CF(E)}""" return cf_he * max(0.0, cf_e) def cf_combine(c1, c2): """两条知识对同一结论 H 的合成,c1、c2 为已求出的 CF(H)""" if c1 >= 0 and c2 >= 0: # 同为正 return c1 + c2 - c1 * c2 if c1 < 0 and c2 < 0: # 同为负 return c1 + c2 + c1 * c2 return (c1 + c2) / (1 - min(abs(c1), abs(c2))) # 一正一负 cf1 = cf_transfer(0.8, 0.35) # 0.28 cf2 = cf_transfer(0.6, 0.80) # 0.48 cf3 = cf_transfer(-0.5, 0.54) # -0.27 c12 = cf_combine(cf1, cf2) # 同号合成,约 0.6256 c123 = cf_combine(c12, cf3) # 异号合成,约 0.4871 print(round(cf1, 2), round(cf2, 2), round(cf3, 2), round(c12, 4), round(c123, 4)) # 模糊集合的四种代数/有界运算,对应上表 A = [0.2, 0.4, 0.9, 0.0, 0.5] B = [0.1, 0.0, 0.7, 1.0, 0.3] prod = [a * b for a, b in zip(A, B)] # 代数积 asum = [a + b - a * b for a, b in zip(A, B)] # 代数和 bsum = [min(1.0, a + b) for a, b in zip(A, B)] # 有界和 bprod = [max(0.0, a + b - 1) for a, b in zip(A, B)] # 有界积 print([round(x, 2) for x in prod]) print([round(x, 2) for x in asum]) print([round(x, 2) for x in bsum]) print([round(x, 2) for x in bprod])逻辑说明:cf_transfer把传递公式里的 max 保护写进去了,传入负的 CF(E) 时自动归零,这是手算最容易漏的一步。cf_combine按同正、同负、异号三分支处理,异号分支的分母是1 − min(|c1|,|c2|),取绝对值不能忘,笔记里 min{0.63, 0.27} 取的就是两个数的绝对值。参数上,cf_he 是规则自带的 CF(H,E),cf_e 是证据的可信度,两个数都必须在 [-1,1] 内,超出就说明组合证据那一步算错了。后半段四个列表推导式一一对应代数积、代数和、有界和、有界积,跑出来的结果应该和上表逐项对齐。
5. 避坑清单:这五处算错,卷面分直接掉一档
这一章是我把这套笔记借给别人复习时收集到的问题,几乎每一届都在同样的地方摔跤。五条按「现象 → 原因 → 解决」写,看完再去刷题,能省一半返工。
5.1 表示与化简环节三个坑
现象一:谓词公式化子句集时,Skolem 化之后归结怎么都配不上对。原因是 Skolem 函数漏写了自变量。存在量词落在全称量词辖域内时,用来替换的 Skolem 函数必须把外层所有全称变量都作为参数带上,写成f(x),而不是常量a。一旦写成常量,本应随 x 变化的个体被钉死,后面求最一般合一时找不到替换。 解决:化简时在草稿上把量词前缀单独抄一行,每遇到存在量词就往回看外层有几个全称量词,函数参数个数跟着走。这条检查做一次只要十秒,能挡住绝大多数错。
现象二:否定内移之后子句数对不上,或者凭空多出量词。原因是只翻了谓词没翻量词。¬∀x P(x)必须变成∃x ¬P(x),¬∃x P(x)变成∀x ¬P(x),量词符号要跟着否定一起翻转。笔记里第 (2) 步专门写了要用双重否定律、德·摩根定律、量词转换律,三条缺一不可。 解决:这一步单独作为一遍来做,不要和消蕴含混在一起。我习惯先全部消→、↔,再从头到尾只做否定内移,两遍分开做,出错率明显下降。
现象三:归结反演做到一半,子句越推越长,最后没出空子句。原因多半是选错了归结对,或者一条链上想一次消两个互补文字。笔记里的建议是按由长到短的子句顺序归结,短子句互补概率高;同时每次归结只消一对文字,贪心会破坏可追溯性。 解决:先把含结论否定的那个短子句当锚点,找与它互补的子句做第一轮,再顺着新生成的归结式往下走。求解型题目还要检查有没有把﹁Q ∨ ANSWER并进子句集,只并了 ﹁Q 的话最后只能得到 NIL,答案丢了。
5.2 数值计算环节两个坑
现象四:CF 合成结果的符号反了,或者绝对值大于 1。两个原因:一是异号合成时套了同号公式,c1 + c2 − c1×c2用在正负混合的场合会算出完全错误的数;二是 CF(E) 为负时仍然直接相乘,忘了传递公式里的 max{0, CF(E)}。笔记例题里 CF₃(H) = -0.5 × 0.54 = -0.27 之所以是负的,是因为 CF(H,E) 本身为负、而 CF(E) 为正,不是因为证据为假。 解决:合成前先把每个 CF(H) 的符号单独标出来,同号走加减乘积,异号走除法那条,分母取1 − min{|c1|,|c2|}。所有结果落在 [-1,1] 内才继续往下算,越界就是前一步错了。
现象五:证据理论里把概率分配函数当成概率,Bel 和 Pl 一起算错。现象是直接对元素求和、发现加起来不等于 1,或者 Bel 算出来比 Pl 还大。原因是概率分配函数定义在子集上,M({红,黄}) 这一项不能拆给红和黄,它整体属于 {红,黄} 这个子集;而且 Bel(A) 要把 A 的所有子集(含 A 本身)的 M 值都加上,不是只加单元素。 解决:画一张子集表,横轴列全部子集、纵轴写 M 值,先把 M(∅)=0 和总和为 1 校验一遍,再按 Bel(A)=ΣM(B)(B⊆A)逐格累加,最后用 Pl(A)=1−Bel(¬A) 求似然,注意 ¬A 是补集不是差集。模糊集合那边同理,代数积和代数和、有界和与有界积四组规则先列表再代值,别心算。
6. 把概念表跑成自测闭环:三遍扫读与脚本对答案的具体做法
概念汇总最容易变成「看的时候都懂,合上书全忘」。我的做法是把这份笔记当数据源,而不是当阅读材料,具体走三遍。
第一遍只做骨架,时间控制在一小时以内。按章扫条目,把每节的标题和加粗术语抄成一页纸的树状图:绪论的智能四特征、知识表示的四条路线、确定性推理的九步化简、不确定性推理的三套公式。这一遍不碰公式细节,目标只有一个——知道考纲上每个名词挂在哪根枝上。扫完合上笔记,能默画出这棵树就算过。
第二遍只做计算题,手算一遍、脚本一遍。归结反演挑两道,一道证明型一道求解型;CF 合成挑带异号的那道;Bel/Pl 挑需要先求补集的;模糊运算挑四种运算都出现的。每道题手写完整过程,包括子句集化简的九步和中间值,然后用前一章那两段脚本对答案。手算和脚本不一致时,九成是手算漏了某条子句或某个 max,回去定位比重新算一遍更有效率。这一遍我一般安排三个晚上,每晚两块内容,间隔开比连轴转记得牢。
第三遍做混淆对自测,这是提分最快的一遍。把最容易张冠李戴的几组概念列成对照表,只看左列默写右列:
| 易混对 | 区分要点 |
|---|---|
| 确定性推理 / 不确定性推理 | 证据与知识是否都确定,结论真值是否非真即假 |
| 正向推理 / 逆向推理 | 事实驱动还是目标驱动,起点是已知事实还是假设目标 |
| 单调推理 / 非单调推理 | 新知识加入后是加强结论还是否定结论回退 |
| 概率 / 概率分配函数 | 作用在元素上还是子集上,是否有 M(∅)=0 |
| Bel / Pl | 对 A 为真的信任 vs 对 A 为非假的信任,两者互补关系 |
| 代数积 / 有界积 | 是否减 1 再截断,结果是否可能为 0 |
默写不出来的当场翻回对应小节,标记后第二天只看标记项。这套流程跑完,通常两到三小时能覆盖全部易混点。
最后一个技巧,针对笔记里代码框被标非重点这件事。代码块确实不考,但它旁边的公式是考点,那些代码框往往是教材作者用来演示算法的伪代码,删掉不影响你背公式,但会切断「公式怎么来的」这条线索。我的习惯是遇到被标非重点的代码块,不看代码,只看它前后两段文字里的公式和结论,把公式抄到自己的公式卡上,代码跳过。这样既不浪费时间,也不至于把结论和来源脱节。
血泪教训是有一年帮人改模拟卷,对方把 CF 合成的异号公式记成了同号公式,前面所有中间值都对,最后一步符号翻车,一道 15 分的题只拿到 5 分。从那以后我每次碰到带符号的合成公式,都强制先用脚本跑一遍例题、确认符号方向,再手算新题。这份汇总的公式密度不低,但每一组都有配套例题,把例题当校验集用,比反复读定义靠谱得多。希望帮到你。
本文还有配套的精品资源,点击获取