【机器学习入门Machine Learning For Beginners】笔记&代码实践——专家系统


前言

你好哇,下定决心要在毕业前完成这一本书的学习,这个系列用于记录阅读这本书的笔记和一些代码、想法~
参考书如下:
在这里插入图片描述


一、早期的专家系统

专家系统是最早的人工智能系统,当时人们希望用专家系统来模拟和代替某些领域的人类专家。通过将领域知识组织成形式化的知识库模型,专家系统能够利用基本的逻辑推导规则,对知识库中的知识进行推理,形成新的知识,从而模拟人类专家推理和决策的过程。

专家系统并不是基于统计理论从经验数据中进行学习的机器学习方法,而恰恰相反,提取知识的过程需要领域专家人工介入,知识库则是人工制定的规则系统。它将人的思维过程抽象为对知识进行逻辑推理,将一些共同的推理机制抽取出来,建成通用的系统。这样,“专家系统”就诞生了。

简言之, 规则 = 已有的知识, 再根据已有的事实,进行推理。就是早期的专家系统。推理逻辑通常表示为 “如果…那么…”的形式,这个过程类似初等几何问题的证明。

二、正向推理

正向推理,即从事实出发,利用规则推导出新的事实,并不断重复这个步骤,直到无法推导出新的事实,或者得出了需要的答案为止。

下面通过一个“动物分类系统”来看专家系统是如何工作的。这个系统有干条产生式规则组成的规则库,这些规则根据动物的特征将它们进行分类,

R1.如果它有羽毛,那么它是鸟类。

R2.如果它产乳,那么它是哺乳动物。

R3. 如果它是鸟类,而且不会飞,那么它是走禽。

R4.如果它是鸟类,而且会飞,那么它是飞禽。

R5.如果它是走禽,而且脖子长,那么它是鴕鸟。

R6. 如果它是飞禽,而且脖子长,那么它是仙鹤。

R7: 如果它是哺乳动物,而且以植物为食,那么它是食草动物。

R8.如果它是食草动物,而且脖子长,那么它是长颈鹿。
在这里插入图片描述
太懒啦,就直接放原书的解释啦,这个例子很好,看看就完全可以理解这个过程。

三、逆向推理

逆向推理就是从某个假设出发,推导出满足假设需要的条件。
比如,已知某动物B脖子长且不会飞,那么如果它是长颈鹿,还需要满足什么条件呢?
在这里插入图片描述

四、谓词逻辑

采用谓词逻辑来表示事实和规则,跟离散数学里面的一样。
谓词语句是一个可以判断真假的命题。与运算、或运算、蕴含关系等等。
专家系统的核心——谓词逻辑描述的规则。
在这里插入图片描述

五、专家系统的贡献和困难

贡献:
它解决了知识表示和存储问题,具有数据(知识库或规则库)和算法(通用推理引擎)分离的思想。解决了如何把领域知识和计算机推理逻辑分离开来的问题。抽取领域知识由专业的领域专家负责,而计算机专家可以专注于构建具有自动推理能力的专家系统引擎。
困难:

  • 建立规则库的效率比较低,完全依赖于知识工程师和领域专家人工发现的建立规则。
  • 大规模系统难以解决可扩展性问题,随规则数量增加,推理性能明显下降。甚至不能简单通过提高计算机的算力来解决。
  • 如何保持规则系统内在的一致性。

六、简化的专家系统示例代码

正向推理:不断用规则产生新的事实,直到无法产生新的事实为止。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@Project :demo1 
@File    :ExpertSystemDemo.py
@IDE     :PyCharm 
@Author  :Yue
@Date    :2024-03-12 15:54 
'''


rules = [
    '有羽毛 => 鸟类',
    '产乳 => 哺乳动物',
    '鸟类 and 会飞行 => 飞禽',
    '飞禽 and 脖子长 => 仙鹤',
    '哺乳动物 and 吃草 => 食草动物',
    '食草动物 and 脖子长 => 长颈鹿'
]

# 解析这些规则
# 返回一个列表[ ([条件1,条件2,...],结果) , ([条件2,条件3,...],结果) ,...]
# [(['有羽毛'], '鸟类'), (['产乳'], '哺乳动物'), (['鸟类', '会飞行'], '飞禽'), (['飞禽', '脖子长'], '仙鹤'),
# (['哺乳动物', '吃草'], '食草动物'), (['食草动物', '脖子长'], '长颈鹿')]
def parse_rules(rules):
    parsed_rules = []
    for rule in rules:
        conditions, result = rule.split(" => ")
        conditions = conditions.split(" and ")
        parsed_rules.append((conditions,result))
    return parsed_rules

# 正向推理
# 输入: 规则 和 事实
def forward_chain(rules, facts):
    has_new_fact = True # 是否有新的事实产生
    #如果有,就可以不断重复正向推理的过程
    while has_new_fact:
        has_new_fact = False
        for rule in rules:
            # rule是一个元组 ([条件1,条件2,...],'结果')

            # all()函数用于判断给定的可迭代参数iterable中的所有元素是否都为TRUE,如果是返回True,否则返回False。
            # 元素除了是0、空、None、False外都算True。

            # 检查前置条件是否都在已知事实中
            # 这里用 x 遍历规则中的所有 前置条件
            condition_met = all([ x in facts for x in rule[0] ])
            if not condition_met:
                continue
            has_new_fact = rule[1] not in facts # 所有前置条件都在已知事实中时,可以直接把结果推理出来,推理结果就是rule[1

            #如果可以推出新的事实,把它打印出来
            if has_new_fact:
                facts.append(rule[1])
                print(rule[1])
                break

print(parse_rules(rules))
forward_chain(parse_rules(rules),['会飞行','有羽毛','脖子长'])

逆向推理:以验证某个假设为目标,所以,需要增加一个参数作为假设的目标。
这是一个递归的过程。可以看逆向推理部分的图片。
从假设的目标出发,寻找能够产生该目标的规则,递归验证规则的前置条件是否成立。

# 逆向推理过程, 以规则、事实 和假设的目标 为输入
def backforward_chain(rules, facts, hypo):
    # 如果假设已经在 事实中, 终止推理
    if hypo in facts:
        return
    some_rule_applies = False
    # 遍历每一条规则
    for rule in rules:
        if rule[1] != hypo: # 找到能够推理出假设结论的那一条规则
            continue
        some_rule_applies = True
        condition_met = all( [x in facts for x in rule[0]] )
        # 如果条件已经满足, 终止推理
        if condition_met:
            facts.append(rule[1])
            return
        # 否则,递归检查不满足的条件
        for fact in rule[0]:
            if fact in facts:
                continue
            backforward_chain(rules, facts, fact)

    # 如果没有任何规则可以应用, 需要向用户 求证假设
    if not some_rule_applies:
        print('{0}?'.format(hypo))


backforward_chain(parse_rules(rules), ['脖子长'], '长颈鹿')

这个代码真的很妙啊,呜呜呜看了几遍才看懂


总结

以上就是今天学习的内容,本文仅仅简单介绍了最早期的人工智能系统——专家系统,它的优势在于,移植到其他系统不需要改变推理引擎,而只需要重新定义规则。

  • 12
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值