人工智能基础 | Python实现-产生式系统-文字动物识别系统

参考资料: 《人工智能通识教程》——王万良

文章目录

  • 一、实现效果
  • 二、运行环境
  • 三、相关知识
    • 3.1 产生式系统
    • 3.2 控制系统(程序)的工作
    • 3.3 规则库总结
  • 四、程序
    • 4.1 流程图
    • 4.2 编写程序

一、实现效果


人工智能基础 | Python实现-产生式系统-文字动物识别系统_第1张图片

二、运行环境


Pycharm 社区版 + Anaconda3

三、相关知识


3.1 产生式系统

人工智能基础 | Python实现-产生式系统-文字动物识别系统_第2张图片
规则库:用于描述相应领域内知识的产生式集合
综合数据库:用于存放问题求解过程中各种当前信息的数据结构
控制系统:由程序组成,负责整个产生式系统的运行,实现对问题的求解

3.2 控制系统(程序)的工作

  • 规则库中选择与综合数据库中的已知事实进行匹配
  • 匹配成功的规则可能不止一条,进行冲突消解
  • 执行规则时,若右部是一或多个(1) 结论,则把这些结论加入到综合数据库中,(2) 操作,则执行
  • 对于不确定知识,执行规则时,根据算法计算结论的不确定性
  • 检查综合数据库中是否包含了最终结论,决定是否停止系统的运行

本次实验是实现识别虎、金钱豹、斑马、长颈鹿、鸵鸟、且、信天翁共七种动物的产生式系统

3.3 规则库总结

1有毛发 2有奶 3 有羽毛 4会飞 5会下蛋
6吃肉 7犬齿 8有爪 9眼盯前方 10有蹄
11反刍动物 12黄褐色 13暗斑点 14黑色条纹 15长脖子
16有长腿 17不会飞 18有黑白二色 19会游泳 20善飞
21哺乳类 22鸟类 23食肉类 24有蹄类 25金钱豹
26虎 27长颈鹿 28斑马 29鸵鸟 30企鹅 31信天翁
【R1】1 =>21 【R2】2 => 21 【R3】3 => 22 【R4】4 + 5 => 22 【R5】6 => 23
【R6】7 + 8 + 9 => 23 【R7】10+ 21 => 24 【R8】11 + 21 => 24
【R9】6 + 12 + 13 +21 => 25 【R10】12 + 14 + 21 + 23 => 26
【R11】15 + 16 + 13 + 24 => 27 【R12】 14 + 10 => 28
【R13】15 + 16 + 17 + 18 + 22 => 29 【R14】 17 + 18 + 19 + 22 => 30
【R15】20 + 22 => 31

四、程序

4.1 流程图

人工智能基础 | Python实现-产生式系统-文字动物识别系统_第3张图片

4.2 编写程序

测试数据:

已知初始事实(综合数据库):

暗斑点、长脖子、长腿、奶、蹄

rule.txt

[有毛发, 有奶,有羽毛,会飞, 会下蛋,吃肉,犬齿,有爪,眼盯前方,有蹄,反刍动物,黄褐色,暗斑点,黑色条纹,长脖子,有长腿,不会飞,有黑白二色,会游泳,善飞,哺乳类,鸟类,食肉类,有蹄类,金钱豹,虎,长颈鹿, 斑马,鸵鸟,企鹅,信天翁]
(1>21)
(2>21)
(3>22)
(4,5>22)
(6>23)
(7,8,9>23)
(10,21>24)
(11,21>24)
(21,23,12,13>25)
(21,23,12,14>26)
(24,15,16,13,2>27)
(24,14>28)
(22,15,16,17,18>29)
(22,19,17,18>30)
(22,20>31)

Animal.py

import re
# 读取数据
with open('rule.txt', encoding="utf8") as fp: rule = fp.read()
# 数据处理
res = re.findall("\[+(.+)\]", rule)[0].split(",")
ruleBase = dict([[i, res[i-1]] for i in range(1, len(res) + 1)])
integratedBase = [[y[0].split(','), y[1]]
                  for y in [x.split('>')
                            for x in re.findall("\((.+)\)", rule)]]
_rule = set()
def showRule():
    for i in range(1, len(ruleBase) + 1):
        print(str(i) + ':' + str(ruleBase[i]), end='\n' if i % 5 == 0 else ' ')

def judge():
    for i in range(1, len(integratedBase) + 1):
        target = integratedBase[i-1][1]
        ib = integratedBase[i-1][0]
        if ((set(ib)).issubset(_rule) and target not in _rule):
            print('根据:[ ', end='')
            for x in ib:
                print(ruleBase[int(x)], end=' ')
            _rule.add(target)
            print('] => ' + ruleBase[int(target)])
def getRule():
    global _rule
    print("\n请输入特征(多个特征 以空格隔开)")
    _rule = set([x for x in input().split(' ')])

if __name__ == '__main__':
    showRule()
    getRule()
    print('正向推导:')
    judge()

你可能感兴趣的:(python,人工智能)