用python实现动物识别专家系统

用Python从零实现一个动物识别专家系统(附完整代码与规则库) 本文详细介绍了如何使用Python从零构建一个动物识别专家系统,包含200行代码实现智能分类。通过规则库设计、事实库存储和推理机实现,系统能够识别7种动物,并支持交互式推理过程。文章还提供了性能优化和功能扩展方案,帮助开发者深入理解专家系统的核心原理。 阅读详情
AI摘要

该博客围绕Python实现动物识别专家系统展开实验。先阐述实验目的,接着介绍实验步骤,包括问题重述与代码实现,详细说明了基于产生式规则的专家系统结构。最后进行实验结果分析,指出代码优点与不足,并给出优化改进方向,如规则存储、算法优化等。

一、实验目的

1. 巩固对专家系统概念、原理、组成结构和推理方法的知识;

2. 掌握构造专家系统的方法;

3. 掌握使用专家系统进行推理的方法。

二、实验步骤

问题重述

运用所学知识,设计并编程实现一个小型动物识别系统,能识别虎、金钱豹、斑马、长颈鹿、鸵鸟、企鹅、信天翁等七种动物的产生式系统。

1. 仿照教材《知识工程:人工智能如何学贯古今》4.2.3小节创建动物知识库,存储到一个文本文件。

2. 定义读取知识库函数。

建议:创建一个空列表作为综合数据库来存储规则,创建一个空集合来存储所有不重复推理条件,方便后续给用户提示。

3. 定义推理机+解释器函数。包括如下步骤:

① 推理机使用用户输入的事实,依次与综合数据库中的规则匹配,并记录匹配的数量。

② 若某规则的前提全被事实满足,则规则可以得到运用,记录匹配的规则和推理结果。

③ 规则的结论部分若为中间结果,则作为新的事实存储在综合数据库中。

④ 用更新过的事实再与其他规则的前提匹配,直到不再有可匹配的规则为止。

4. 定义人机界面函数。该函数的主要作用是展示用户可输入的事实,并让用户循环输入。

5. 加载综合数据库。调用定义的函数加载知识库文件中的数据。

6. 专家系统人机交互。参考规则表,分别输入动物特征,按回车键进行系统推理。

包括如下步骤:

①测试成功识别动物的情况,并记录结果。

② 测试不成功识别动物的情况,并记录结果。

③ 测试推理得到中间结论的情况,并记录结果。

代码实现

基于产生式规则的专家系统完整结构

基于产生式规则的专家系统是一种模拟人类专家的推理思维过程的人工智能计算机程序。以下是这种专家系统的完整结构:

1. 知识库(Knowledge Base)

知识库是专家系统中的核心部分,它存储了从专家那里得到的专门知识。这些知识是专家所积累经验的信息数据库,包括事实和经验两种数据。在知识库中,知识是以产生式规则的形式存储的,每一条规则都有一个前提条件和一个结论。例如,规则可以表达为:“如果下雨,那么带伞”。

2. 推理机(Inference Engine)

推理机是专家系统中的另一个重要部分,它是专家系统的核心组件。它的任务是根据知识库中的知识推导出一定的结论,并能够执行各种任务进行各种推理或搜索等功能。推理机通过反复匹配知识库中的规则,获得新的结论,以得到问题求解结果。

3. 综合数据库(Composite Database)

综合数据库包含求解问题的世界范围内的事实和断言。在推理过程中,如果规则的前提条件与数据库中的事实相匹配,问题就得到解决;否则把这条规则的前提作为新的子目标,对新的子目标寻找可以运用的规则,执行逆向序列的前提,直到最后运用的规则的前提可以与数据库中的事实相匹配,或者直到没有规则再可以应用时,系统便以对话形式请求用户回答并输入必需的事实。

4. 人机交互界面(User Interface)

人机交互界面是专家系统与用户之间的桥梁,它接收用户的输入,将用户的命令进行识别,并把产生的结果传递给用户。用户可以通过人机交互界面向知识库添加、删除、修改规则。

5. 规则编辑器(Rule Editor)

规则编辑器是用来增添新的规则的工具,用户可以通过规则编辑器来扩充知识库中的知识内容,从而提高专家系统的性能。

6. 知识获取模块(Knowledge Acquisition Module)

知识获取模块是用来获取新的知识的模块,它可以对知识库进行知识补充、编辑增删等操作。通过知识获取模块,专家系统可以不断地学习和进步。

总的来说,基于产生式规则的专家系统的完整结构包括知识库、推理机、综合数据库、人机交互界面、规则编辑器和知识获取模块等六个部分。这些部分相互配合,共同实现了专家系统的功能。

规则库:

r1: IF 该动物有毛发 THEN 该动物是哺乳动物

r2: IF 该动物能产乳 THEN 该动物是哺乳动物

r3: IF 该动物有羽毛 THEN 该动物是鸟

r4: IF 该动物会飞 AND 会下蛋 THEN 该动物是鸟

r5: IF 该动物吃肉 THEN 该动物是食肉动物

r6: IF 该动物有犬齿 AND 有爪 AND 眼盯前方 THEN 该动物是食肉动物

r7: IF 该动物是哺乳动物 AND 有蹄 THEN 该动物是有蹄类动物

r8: IF 该动物是哺乳动物 AND 是反刍动物 THEN 该动物是有蹄类动物

r9: IF 该动物是哺乳动物 AND 是食肉动物 AND 是黄褐色 AND 身上有暗斑点 THEN 该动物是金钱豹

r10:IF 该动物是哺乳动物 AND 是食肉动物 AND 是黄褐色 AND 身上有黑色条纹 THEN 该动物是虎

r11:IF 该动物是有蹄类动物 AND 有长脖子 AND 有长腿 AND 身上有暗斑点 THEN 该动物是长颈鹿

r12:IF 该动物有蹄类动物 AND 身上有黑色条纹 THEN 该动物是斑马

r13:IF 该动物是鸟 AND 有长脖子 AND 有长腿 AND 不会飞 AND 有黑白二色 THEN 该动物是鸵鸟

r14:IF 该动物是鸟 AND 会游泳 AND 不会飞 AND 有黑白二色 THEN 该动物是企鹅

r15:IF 该动物是鸟 AND 善飞 THEN 该动物是信天翁

有毛发,是哺乳动物
能产乳,是哺乳动物
有羽毛,是鸟
会飞,会下蛋,是鸟
吃肉,是肉食动物
有犬齿,有爪,眼盯前方,是食肉动物
是哺乳动物,有蹄,是蹄类动物
是哺乳动物,是咀嚼反刍动物,是蹄类动物
是哺乳动物,是食肉动物,是黄褐色,身上有暗斑点,金钱豹
是哺乳动物,是肉食动物,是黄褐色,身上有黑色条纹,虎
是蹄类动物,有长脖子,有长腿,身上有暗斑点,长颈鹿
是蹄类动物,身上有黑色条纹,斑马
是鸟,有长脖子,有长腿,不会飞,有黑白二色,鸵鸟
是鸟,会游泳,不会飞,有黑白二色,企鹅
是鸟,善飞,信天翁

要求给定初始条件,能识别出是哪种动物。

比如已知初始事实存放在综合数据库中:

有毛发 吃肉 是黄褐色 身上有黑色条纹

运行后得该动物是:虎

相关原理解释可能比较浅显,因为博主也在学习阶段,可以参考一些内容更饱满的博客,比如:

基于Python的动物识别专家系统_python 动物识别 虎 金钱豹 斑马-优快云博客icon-default.png?t=O83Ahttps://blog.youkuaiyun.com/qq_44487263/article/details/109700240

动物识别系统(无GUI版)

# ①规则库直接赋值(方法并不局限于文中两种)
txt_rule = '''有毛发,是哺乳动物
能产乳,是哺乳动物
有羽毛,是鸟
会飞,会下蛋,是鸟
吃肉,是食肉动物
有犬齿,有爪,眼盯前方,是食肉动物
是哺乳动物,有蹄,是蹄类动物
是哺乳动物,是咀嚼反刍动物,是蹄类动物
是哺乳动物,是食肉动物,是黄褐色,身上有暗斑点,金钱豹
是哺乳动物,是肉食动物,是黄褐色,身上有黑色条纹,虎
是蹄类动物,有长脖子,有长腿,身上有暗斑点,长颈鹿
是蹄类动物,身上有黑色条纹,斑马
是鸟,有长脖子,有长腿,不会飞,有黑白二色,鸵鸟
是鸟,会游泳,不会飞,有黑白二色,企鹅
是鸟,善飞,信天翁'''

# # ②导入外部规则库
# with open('rule.txt', 'r', encoding='utf-8') as file:
#     txt_rule = file.read()

# 特征值字典
character_dict = {'1': '有毛发', '2': '能产乳', '3': '有羽毛', '4': '会飞', '5': '会下蛋',
                  '6': '吃肉', '7': '有犬齿', '8': '有爪', '9': '眼盯前方', '10': '有蹄',
                  '11': '是咀嚼反刍动物', '12': '是黄褐色', '13': '身上有暗斑点',
                  '14': '身上有黑色条纹', '15': '有长脖子', '16': '有长腿',
                  '17': '不会飞', '18': '会游泳', '19': '有黑白二色',
                  '20': '善飞', '21': '是哺乳动物', '22': '是鸟',
                  '23': '是食肉动物', '24': '是蹄类动物', }
# 结果值字典
result_dict = {'25': '信天翁', '26': '鸵鸟', '27': '斑马', '28': '长颈鹿',
               '29': '虎', '30': '金钱豹', '31': '企鹅'}
# 数据库对应的过程,合并两个字典
database = {**character_dict, **result_dict}


# 规则库数据转换为了列表
def get_data_list():
    # 用于储存中间过程
    data_process_list = []
    # 用于存储过程对应的结果
    data_result_list = []
    # 将规则库数据预处理
    data_str = txt_rule.split('\n')
    for data in data_str:
        data = data.split(',')
        data_process_list.append(data[:-1])
        data_result_list.append(data[-1].replace('\n', ''))
    return data_process_list, data_result_list


# 特征值字典转为提示词
def character_dict_trans():
    # 使用enumerate()函数获取字典的键值对及其索引
    indexed_data = list(enumerate(character_dict.items()))
    rsp_str = ''
    # 使用for循环遍历这些键值对,每5个元素输出为1行
    for i in range(0, len(indexed_data), 5):
        line = ''
        for j in range(5):
            if i + j < len(indexed_data):
                line += str(indexed_data[i + j][1][0] + ':' + indexed_data[i + j][1][1]) + '  '
        # print(line)
        rsp_str += line + '\n'
    return rsp_str


# 通过传入的列表寻找结果
def find_data(process_data_list, dict_output):
    # 依次进行循环查找并对过程排序
    for index, data_process in enumerate(data_process_list):
        # 用于判断此过程是否成立
        num = 0
        for data in process_data_list:
            if data in data_process:
                num += 1
        # 过程成立则数值相同,可以进入下一步
        if num == len(data_process):
            # 此过程中结果是否为最终结果,不是将此过程结果加入到过程中
            if data_result_list[index] not in result_dict.values():
                # 弹出过程和此过程结果,因为此过程已经进行过,此结果存入需要查找的过程中
                result = data_result_list.pop(index)
                process = data_process_list.pop(index)
                # 判断结果是否已经存在过程中,存在则重新寻找,不存在则加入过程,并将其存入最终结果
                if result not in process_data_list:
                    dict_output[','.join(process)] = result
                    end_result = find_data(process_data_list + [result], dict_output)
                    if end_result == 1:
                        return 1
                    else:
                        return 0
                # 存在则直接寻找
                else:
                    end_result = find_data(process_data_list, dict_output)
                    if end_result == 1:
                        return 1
                    else:
                        return 0
            # 找到最终结果,取出结果后返回
            else:
                process = data_process_list.pop(index)
                dict_output[','.join(process)] = data_result_list[index]
                return 1


# 快速排序算法
def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quick_sort(left) + middle + quick_sort(right)


if __name__ == '__main__':

    # 规则库数据转换为了列表
    data_process_list, data_result_list = get_data_list()
    print_str_start = '''输入对应条件前面的数字编号:
*************************************************************
'''
    print_str_end = '''*************************************************************
*********************当输入数字0时!程序结束******************
'''
    # 特征值字典转为提示词
    character_str = character_dict_trans()
    character_all_str = print_str_start + character_str + print_str_end
    print(character_all_str)

    # 存储用于查询的数据
    list_data = []
    # 循环进行输入,直到碰见0后退出
    while 1:
        input_num = input("请输入数字编号:")
        # 当输入数字0时!程序结束
        if input_num == '0':
            break
        # 输入数字编号,不在查询数据的列表中
        if input_num not in list_data:
            # 则加入查询列表
            list_data.append(input_num)
    # 将查询数字编号从小到大排序
    sorted_list_data = quick_sort([int(i) for i in list_data])
    # 打印查询条件
    list_data_str = [character_dict[str(i)] for i in sorted_list_data]
    print('查询条件为:' + ' '.join(list_data_str) + '\n')
    # 用于存储输出结果
    dict_output = {}
    # 进行递归查找,直到找到最终结果,返回1则找到最终结果
    end_result = find_data(list_data_str, dict_output)
    # 查找成功时
    if end_result == 1:
        print('查询成功,推理过程如下:')
        # 将结果进行打印
        for data in dict_output.keys():
            print(f"{data}->{dict_output[data]}")
            # 得到最终结果即输出所识别动物
            if dict_output[data] in result_dict.values():
                print(f'所识别的动物为:{dict_output[data]}')
    else:  # 查找失败时
        print('条件不足,无匹配规则,查询失败.')

本代码来源:

人工智能-产生式系统实验(动物识别) - 知乎 (zhihu.com)icon-default.png?t=O83Ahttps://zhuanlan.zhihu.com/p/669264732

动物识别系统(有GUI版)(自写,代码比较简陋,不足之处多多见谅)

import tkinter as tk
from tkinter import messagebox

# ①规则库直接赋值
txt_rule = '''有毛发,是哺乳动物
能产乳,是哺乳动物
有羽毛,是鸟
会飞,会下蛋,是鸟
吃肉,是肉食动物
有犬齿,有爪,眼盯前方,是食肉动物
是哺乳动物,有蹄,是蹄类动物
是哺乳动物,是咀嚼反刍动物,是蹄类动物
是哺乳动物,是食肉动物,是黄褐色,身上有暗斑点,金钱豹
是哺乳动物,是肉食动物,是黄褐色,身上有黑色条纹,虎
是蹄类动物,有长脖子,有长腿,身上有暗斑点,长颈鹿
是蹄类动物,身上有黑色条纹,斑马
是鸟,有长脖子,有长腿,不会飞,有黑白二色,鸵鸟
是鸟,会游泳,不会飞,有黑白二色,企鹅
是鸟,善飞,信天翁'''

# 特征值字典
character_dict = {'1': '有毛发', '2': '能产乳', '3': '有羽毛', '4': '会飞', '5': '会下蛋',
                  '6': '吃肉', '7': '有犬齿', '8': '有爪', '9': '眼盯前方', '10': '有蹄',
                  '11': '是咀嚼反刍动物', '12': '是黄褐色', '13': '身上有暗斑点',
                  '14': '身上有黑色条纹', '15': '有长脖子', '16': '有长腿',
                  '17': '不会飞', '18': '会游泳', '19': '有黑白二色',
                  '20': '善飞', '21': '是哺乳动物', '22': '是鸟',
                  '23': '是食肉动物', '24': '是蹄类动物', }
# 结果值字典
result_dict = {'25': '信天翁', '26': '鸵鸟', '27': '斑马', '28': '长颈鹿',
               '29': '虎', '30': '金钱豹', '31': '企鹅'}
# 数据库对应的过程,合并两个字典
database = {**character_dict, **result_dict}

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quick_sort(left) + middle + quick_sort(right)


# # 全局变量
# data_process_list = []
# data_result_list = []
#
# # 规则库数据转换为了列表
# def get_data_list():
#     global data_process_list, data_result_list
#     # 将规则库数据预处理
#     data_str = txt_rule.split('\n')
#     for data in data_str:
#         data = data.split(',')
#         data_process_list.append(data[:-1])
#         data_result_list.append(data[-1].replace('\n', ''))
#     return data_process_list, data_result_list
# 规则库数据转换为了列表
def get_data_list(txt_rule):
    # 初始化列表
    data_process_list = []
    data_result_list = []
    # 将规则库数据预处理
    data_str = txt_rule.split('\n')
    for data in data_str:
        data = data.split(',')
        data_process_list.append(data[:-1])
        data_result_list.append(data[-1].replace('\n', ''))
    return data_process_list, data_result_list

# 调用函数获取列表
data_process_list, data_result_list = get_data_list(txt_rule)
# 特征值字典转为提示词
def character_dict_trans():
    # 使用enumerate()函数获取字典的键值对及其索引
    indexed_data = list(enumerate(character_dict.items()))
    rsp_str = ''
    # 使用for循环遍历这些键值对,每5个元素输出为1行
    for i in range(0, len(indexed_data), 5):
        line = ''
        for j in range(5):
            if i + j < len(indexed_data):
                line += str(indexed_data[i + j][1][0] + ':' + indexed_data[i + j][1][1]) + '  '
        # print(line)
        rsp_str += line + '\n'
    return rsp_str


# 通过传入的列表寻找结果
# 通过传入的列表寻找结果
def find_data(process_data_list, dict_output, data_process_list, data_result_list):
    # 创建数据处理和结果列表的副本,以避免修改原始数据
    local_data_process_list = list(data_process_list)
    local_data_result_list = list(data_result_list)

    # 依次进行循环查找并对过程排序
    for index, data_process in enumerate(local_data_process_list):
        # 用于判断此过程是否成立
        num = 0
        for data in process_data_list:
            if data in data_process:
                num += 1
        # 过程成立则数值相同,可以进入下一步
        if num == len(data_process):
            # 此过程中结果是否为最终结果,不是将此过程结果加入到过程中
            if local_data_result_list[index] not in result_dict.values():
                # 弹出过程和此过程结果,因为此过程已经进行过,此结果存入需要查找的过程中
                result = local_data_result_list.pop(index)
                process = local_data_process_list.pop(index)
                # 判断结果是否已经存在过程中,存在则重新寻找,不存在则加入过程,并将其存入最终结果
                if result not in process_data_list:
                    dict_output[','.join(process)] = result
                    end_result = find_data(process_data_list + [result], dict_output, local_data_process_list, local_data_result_list)
                    if end_result:
                        return True
                # 存在则直接寻找
                else:
                    end_result = find_data(process_data_list, dict_output, local_data_process_list, local_data_result_list)
                    if end_result:
                        return True
            # 找到最终结果,取出结果后返回
            else:
                process = local_data_process_list.pop(index)
                dict_output[','.join(process)] = local_data_result_list[index]
                return True
    return False


# GUI界面布局设置
def setup_gui(root):
    global checkboxes_vars, conditions_text

    # 创建一个滚动窗格来放置勾选框
    checkboxes_frame = tk.Frame(root)
    checkboxes_canvas = tk.Canvas(checkboxes_frame)
    scrollbar = tk.Scrollbar(checkboxes_frame, orient="vertical", command=checkboxes_canvas.yview)
    checkboxes_inner_frame = tk.Frame(checkboxes_canvas)
    checkboxes_inner_frame.bind(
        "<Configure>",
        lambda e: checkboxes_canvas.configure(
            scrollregion=checkboxes_canvas.bbox("all")
        )
    )
    checkboxes_canvas.create_window((0, 0), window=checkboxes_inner_frame, anchor="nw")
    checkboxes_canvas.configure(yscrollcommand=scrollbar.set)

    # 在这个函数内用enumerate()生成带索引的checkbox
    checkboxes_vars = []
    for index, (key, description) in enumerate(character_dict.items()):
        var = tk.StringVar(value="")
        checkboxes_vars.append(var)
        tk.Checkbutton(checkboxes_inner_frame, text=description, variable=var, onvalue=key, offvalue="",
                       command=update_conditions).pack(anchor='w')

    # 装载滚动窗格
    checkboxes_frame.pack(fill="both", expand=True)
    checkboxes_canvas.pack(side="left", fill="both", expand=True)
    scrollbar.pack(side="right", fill="y")

    # 文本框显示选中的条件
    conditions_text = tk.Text(root, height=5, width=50)
    conditions_text.pack()

    # 查询按钮
    query_button = tk.Button(root, text="查询", command=do_query)
    query_button.pack()


# 更新界面上的查询条件
def update_conditions():
    selected_conditions = [var.get() for var in checkboxes_vars if var.get()]
    sorted_list_data = quick_sort([int(i) for i in selected_conditions])
    selected_conditions_names = [character_dict[str(i)] for i in sorted_list_data]
    conditions_text.delete('1.0', tk.END)
    conditions_text.insert(tk.END, "查询条件为:" + ' '.join(selected_conditions_names) + '\n')


# 查询按钮绑定的查询函数
# 查询按钮绑定的查询函数
def do_query():
    selected_conditions_indexes = [var.get() for var in checkboxes_vars if var.get()]
    selected_conditions = [database[var.get()] for var in checkboxes_vars if var.get()]

    dict_output = {}
    # 对用户选择的条件进行排序
    sorted_list_data = quick_sort([int(i) for i in selected_conditions_indexes])
    # 查询条件转换为文字
    selected_conditions_names = [character_dict[str(i)] for i in sorted_list_data]
    # 进行递归查找
    end_result = find_data(selected_conditions_names, dict_output, data_process_list, data_result_list)

    # 查找成功时
    if end_result:
        result_message = '查询成功,推理过程如下:\n'
        for data in dict_output.keys():
            result_message += f"{data}->{dict_output[data]}\n"
            # 得到最终结果即输出所识别动物
            if dict_output[data] in result_dict.values():
                result_message += f'所识别的动物为:{dict_output[data]}\n'
        messagebox.showinfo('查询结果', result_message)
    else:
        messagebox.showinfo('查询结果', '条件不足,无匹配规则,查询失败.')



# 主程序
if __name__ == '__main__':
    # 创建主窗口
    root = tk.Tk()
    root.title("动物识别系统")

    # 设置GUI界面
    setup_gui(root)

    # 启动事件循环
    root.mainloop()


三、实验结果及分析

1.测试成功识别动物的情况(无GUI版)

2.测试不成功识别动物的情况(无GUI版)

3.测试成功识别动物的情况(有GUI版)

4.测试不成功识别动物的情况(有GUI版)

实验结果分析

这个代码实现了一个基于规则的动物识别系统,并使用Tkinter库为用户提供了图形用户界面(GUI)。以下是对这个代码的优点、缺点以及可以优化改进的地方的分析:
优点:
1. 用户界面:通过Tkinter库提供了一个直观的图形用户界面,用户可以通过勾选动物特征来进行查询,这比命令行界面更加友好和易于使用。
2. 模块化:代码被分成多个函数,每个函数负责一个特定的任务,如设置GUI、更新条件、执行查询等,这样的模块化设计使得代码更易于维护和扩展。
3. 错误处理:使用messagebox.showinfo来显示查询结果,包括成功和失败的情况,为用户提供明确的反馈。
4. 条件排序:在查询之前对用户选择的条件进行排序,确保了查询的一致性和准确性。
缺点:
1. 硬编码规则:规则库仍然是通过直接赋值的方式硬编码在代码中的,这使得系统的可扩展性较差。改进的方法是将规则存储在外部文件中,通过读取文件来动态加载规则。
2. 递归效率:使用递归函数进行规则匹配可能会导致效率问题,尤其是当规则库很大或者规则之间有复杂的依赖关系时。可以考虑使用更高效的算法,如正向链接或反向链接算法。
3. 全局变量:虽然代码中减少了一些全局变量的使用,但仍然存在一些全局变量(如data_process_list和data_result_list),这可能会使得代码的维护和调试变得更加困难。
4. 代码重复:在GUI设置和查询函数中存在一些重复的代码,比如对用户选择的条件进行排序的代码。可以通过创建一个公共函数来避免这种重复。
可以优化改进的地方:
1. 规则存储:将规则存储在文件中,并在程序启动时读取这些规则,以提供更好的灵活性和可扩展性。
2. 算法优化:考虑使用更高效的推理算法,比如正向链接或反向链接算法,以提高系统的性能。
3. 减少全局变量:尽可能避免使用全局变量,通过函数参数传递所需的数据。
4. 代码重构:对于重复的代码段,可以创建公共函数来减少重复,并提高代码的可维护性。
5. 错误处理和输入验证:添加对用户输入的验证,以确保输入的数据是有效的,并处理可能出现的错误情况。
6. 用户体验:进一步改进GUI的设计,比如提供清晰的指示和帮助信息,以增强用户体验。
总的来说,这个代码提供了一个基本的框架,并通过图形用户界面提高了用户体验,但在多个方面还有改进的空间,特别是在规则管理、算法效率和代码结构方面。

用Python实现一个动物识别专家系统--人工智能 加油! 阅读详情

相关推荐

动物识别专家系统(Java实现已开源)

动物识别专家系统产生式系统问题定义系统实现规则、事实和产生式的表示类的设计匹配顺序推理机结果演示源代码 产生式系统 规则库 规则库是用于描述相应领域内知识的产生式集合。它是产生式系统求解问题的基础,其中对领域知识表达的完整性、准确性、有效性,将直接影响到系统的性能和效率。因此必须要合理设计和组织规则库中的知识,检测并排除冗余或矛盾的知识。 事实库。 事实库用于存放问题的初始事实、当前已知的信息、推理过程中形成的中间结论以及最终结论。显然,事实库的内容是动态的,是不断变化的。 推理机。 推理机由一组程序组

qq_40486952的博客 9318

动物专家识别系统(Java)

动物专家识别系统

qq2977078774的博客 4990

用Python手搓一个动物识别专家系统:从规则库到推理机的完整实现

本文详细介绍了如何使用Python构建一个动物识别专家系统,涵盖规则库设计、推理机实现及交互式诊断工具开发。通过正向推理和冲突消解策略,系统能准确识别长颈鹿、斑马等动物,并提供可解释的推导过程。代码简洁高效,适合AI初学者理解专家系统原理。

weixin_29952383的博客 319

人工智能---动物识别系统

由于研究生阶段的需要,需要系统学习C#语言,为了将最近学习的东西进行一个总结,偶然间想到了本科写的那个动物识别系统,用C语言写的很简单,只是用了简单的if…else语句,这里也是简单的用C#语言进行了一个复现。动物识别系统C语言版代码还有很多不完善的地方,比如说实现反复推理,不是每次运行推理结束后又要点一次运行,又比如说在不小心输入错误了,实现重新输入等等。

亲爱的老吉先森呀 4535

别再死记硬背了!用Python手把手实现一个动物识别专家系统(附完整代码)

本文详细介绍了如何使用Python构建一个基于产生式表示法的动物识别专家系统。通过完整的代码示例和分步指南,读者将学习如何创建规则库、实现推理引擎,并进行交互式动物识别。该系统采用经典的IF-THEN规则形式,帮助开发者理解专家系统的核心原理,并提供了多种优化和扩展思路。

weixin_30621711的博客 230

基于产生式的动物识别系统

规则库包含15条规则,开发一个专家系统可以识别老虎,金钱豹,斑马,长颈鹿,企鹅,信天翁这6种动物。

人工智能-动物识别专家系统Python实现

1.实验目的 理解和掌握产生式知识表示方法及产生式系统的基本过程,能够利用编程技术建立一个基于产生式知识表示的简单的智能系统。 2.实验要求 2.1运用任意一种编程语言实现动物专家识别系统并撰写实验报告 2.2功能要求: 建立一个动物识别系统的规则库,用以识别虎、豹、斑马、长颈鹿、企鹅、鸵鸟、信天翁等7种动物。为了识别这些动物,可以根据动物识别的特征,建立包含下述规则的规则库: R1:if 动物有毛发 then 动物是哺乳动物 R2:if 动物有奶 then 动物是哺乳动物 R3:if 动物有羽毛

重庆科技大学XMY的博客 1万+

基于ABCDRez的激光谐振腔设计与热透镜效应仿真实践

本文详细介绍了如何利用ABCDRez代码包进行激光谐振腔设计与热透镜效应仿真。通过ABCD矩阵理论和高斯光束q参数,该工具能有效模拟热透镜动态变化对腔稳定性的影响,指导腔型优化与热补偿设计,是固体激光器预研与调试的高效辅助手段。

weixin_29093017的博客 290

用Python复刻经典AI实验:手把手教你实现一个动物识别专家系统

本文详细介绍了如何使用Python构建一个动物识别专家系统,涵盖规则库设计、前向链式推理算法实现及交互式命令行界面开发。通过产生式系统模拟人类专家决策过程,该系统能根据输入特征逐步推导出动物种类,适合AI初学者理解专家系统原理并实践应用。

weixin_30906185的博客 289

手把手教你用DCT/DCG实现Multi-bit FF物理优化(含SPG流程避坑指南)

本文详细解析了Multi-bit FF(MBFF)在芯片物理实现中的优化方法,重点介绍了DCT/DCG与SPG流程的实战应用。通过物理感知综合、寄存器组识别和增量优化三阶段流程,实现PPA(Power-Performance-Area)的协同提升。文章还提供了Innovus与ICC工具的协同优化策略及典型问题排查指南,帮助工程师高效完成MBFF物理优化。

ik67890123的博客 242

搞定安卓11+抓包难题:用Kitsune Mask、magic_overlayfs和LSPosed三件套绕过SSL Pinning(保姆级教程)

本文详细解析了安卓11+系统中抓包面临的核心挑战,包括SSL Pinning和Root检测机制,并提供了使用Kitsune Mask、magic_overlayfs和LSPosed三件套的完整解决方案。通过动态分区技术解析和工具链配置,帮助开发者绕过安全限制,实现高效抓包分析。

weixin_42665255的博客 442

python动物专家系统_人工智能-动物识别专家系统算法Python + Pyqt 实现

#-*- coding: utf-8 -*-#Form implementation generated from reading ui file '动物识别专家系统.ui'##Created by: PyQt5 UI code generator 5.9.2##WARNING! All changes made in this file will be lost!from PyQt5 impor...

weixin_30695909的博客 919

群晖NAS从入门到精通的所有帖子汇总,只要这一篇就够了

本站陆陆续续的转载、原创帖子也有十几二十篇了,从不同的角度对群晖NAS的各种骚操作都有深入的讲解,虽然很多文章都不是讲的很深入,但是针对小白入门已经是足够了,希望对小白来说是一个入门,群晖NAS的大佬们勿喷,哪里写的不对的,请随时留言西安SEO优化站长一定在第一时间纠正修改。

西安SEO优化网站资源 8万+

Python与PYQT5实现的动物特征识别专家系统:助力大学生AI实验的利器

Python与PYQT5实现的动物特征识别专家系统:助力大学生AI实验的利器 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在人工智能快速发展的今天,动物特征识别作为AI领域的一个重要分支,吸引了众多学子的关注。为了帮助大学生更好地进行相关实验,我们开发了一款基于Python和PYQT5的动物特征识别专家系统。该系统不仅实现了动物特征的增删查功能,还提供了一个简洁易用...

gitblog_09718的博客 529

深度理解嵌入(embedding)层

首先从one_hot开始: one_hot的优点:计算方便快捷、表达能力强。 one_hot的缺点:过于稀疏,过于占用资源,尤其是在数据量特别大时;数据之间完全独立。

weixin_44441131的博客 5659

lammps后处理:ovito选择原子高级技巧讲解

大家好,我是小马老师。 本文介绍如何在ovito中使用公式(Expression)选择需要的原子。 用ovito查看lammps模拟结果时,可能会遇到选择特定原子的情况,比如选择坐标位于一定范围内的原子,或者选择结构为fcc的原子等等。 这时候,就需要用到expression selection功能。 Expression selection功能比较强大,下面分别介绍几种选择原子的方法。 在输入公式前,先点击“Add modification”->"Expression selection"选项,在B

lammps_jiayou的博客 2万+

用Python手搓一个动物识别专家系统:从规则库到推理引擎的保姆级实现

本文详细介绍了如何使用Python构建一个基于产生式系统的动物识别专家系统,从规则库设计到正向链推理引擎的实现。通过具体的代码示例和冲突处理策略,帮助开发者理解专家系统的核心原理,并掌握可复用的实现方法。文章还提供了系统优化和扩展方向,如处理不确定性和规则自动学习。

weixin_30596023的博客 293

【应用】什么是Azure?一文读懂微软云的核心逻辑与全球版图

作为微软的核心云计算服务平台,Azure不仅是数字化转型的引擎,更是全球企业在构建、扩展与优化IT基础设施时的首选平台。在这篇文章中,我们将深入探讨Azure云服务平台的各个方面,涵盖其核心优势、架构、功能、应用场景以及未来发展趋势。

高校图书馆高级系统架构师/研究馆员,推动高校AI从概念演示到可评审、可交付、可运维:路线图与立项评审、PoC交付、评测回归与上线运维(Baseline/Eval/Ops)。 1957

基于pyqt5+python实现的动物识别专家系统源码+GUI界面

树皮灰色灰褐色或暗灰色 球果下垂近四棱状球形或矩圆状球形 水杉。树皮灰褐色 分枝繁密 淡黄色而边缘有时红色或紫色 含笑花。树皮灰色灰褐色或灰黑色 花大淡紫色或白色 泡桐。树皮平滑 树皮灰色或灰褐色 花色玫红 紫薇。树皮灰褐色或褐灰色 球果卵形或卵圆形 油松。树皮灰褐色粗糙 叶椭圆形卵形或矩圆形 杜仲。树冠倒卵形或椭圆形 树皮褐色或黄灰色 梓树。树冠圆形或倒卵形 树皮平滑 浅灰色 拓树。3.可以自己设置规则 在RD.txt里。树皮平滑灰色 核果单生或2个并生 朴树。树皮暗灰棕色 花白色或淡绿黄色 刺楸。

2403_88102872的博客 473

Jetson Nano之CSI摄像头操作方法

jetson端csi摄像头的应用方法

ZONGXP的博客 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

用Python复刻经典AI实验:手把手教你实现动物识别专家系统(附完整代码)

本文详细介绍了如何使用Python构建一个基于产生式规则的动物识别专家系统,从规则引擎设计到交互式推理实现。通过清晰的代码示例和分步指导,帮助开发者理解专家系统的工作原理,并实现一个可实际应用的AI项目。文章特别强调了规则库的质量对系统准确性的重要性,并提供了系统优化与扩展的实用建议。

weixin_30376509的博客 438

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

别再死记硬背了!用Python手把手带你实现一个动物识别专家系统(附完整代码)

本文详细介绍了如何使用Python构建一个动物识别专家系统,基于产生式表示法设计规则库,并实现前向链式推理机。通过完整的代码示例和优化技巧,帮助开发者理解专家系统的核心原理,并快速实现可扩展的AI应用。

weixin_30873847的博客 528

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

python动物专家系统_用Python实现一个动物识别专家系统--人工智能作业分享

考察 产生式系统我猜在搜索引擎的茫茫大海中,你能看见我的这篇文章不是缘分,而是你要交作业了(抖机灵)求点赞,给作者一点分享的鼓励代码没写GUI,因为不喜欢这玩意,直接在终端中进行人机交互。使用代码之前,请根据自身情况对字符编码、文件路径进行修改代码写的很烂,以后有能力了再把算法加进去优化代码吧第一问 先根据题图,创建规则库(使用了一个文本文件)if 有毛发 then 哺乳动物if 有乳 then ...

weixin_39664995的博客 2360
上一篇: VMware17.5.0 build-22583795版本虚拟机安装Ubuntu桌面版教程
下一篇: 微软联合领英和讯飞联合Datawhale的AI证书获取教程
冰万森
博客等级 码龄5年 1万+粉丝 36原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值