美文网首页
实现了一下动物识别系统---基于专家系统

实现了一下动物识别系统---基于专家系统

作者: 小星star | 来源:发表于2019-02-26 17:24 被阅读1次

2019.2.26

主要功能:
1. 功能完善(知识库、综合数据库、推理机)
2. 正向推理、反向推理
3. 知识库可维护(添加、删除、修改)
4. 中间结果可视化(推理中间结果可见)

这次编写代码的时候,思路很清晰,从之前的节奏中跳了出来,先def main() ,之后在main() 中定义各个模块,之后再思考各个模块怎样实现,这样编写代码看起来很合理。
当我编写一个函数的时候,特别是算法部分,如 def Topo() 最好是先想一下自己要怎么做才能完成,而不是直接上手,要想好怎么做,之后再动手

没有UI界面。。因为只是随手做的,而且也没有学PyQt5,只是为了另一件事拿这个熟悉一下专家系统。
后期会更新的, 吧??

  1. 主要说一下问题:
    我觉得主要是难在了新增一条规则时候,需要进行规则的整合管理。
    开始的时候,使用了拓扑排序,但是发现不行,因为同一个结论,如下面rules.txt中的哺乳动物,可以由两种方式推导出来,这样的结构其实不合适用拓扑排序(也可能是我理解不够)

    对于下面这一个规则,就是很简单的 当满足哺乳动物 和 反刍动物的时候,那么就是有蹄类动物

    哺乳动物 反刍动物->有蹄类动物
    
    image.png

    而对于这样两条规则:

    有毛发->哺乳动物
    有奶-> 哺乳动物
    
    image.png

    那么他们的逻辑图应该怎么画呢?这就很迷惑。。
    这样导致了他们的图我不知道怎么画,更不用DAG谈拓扑化了。

    我所使用的方法,则很简单,就是先遍历一遍所有规则,找出其中的baseAttr(也就是基础属性,基础属性意味着他不是被推导出来的,而是先天的属性,如:有毛发);
    然后,不断第二次规则库,当规则满足他的前置条件都在base中,那么就加入到拓扑规则序列中,然后将他的结论也加入到baseAttr中。不断遍历规则库,知道所有的规则都被加入到了拓扑序列中。
    这样就能实现规则的增加了。

  2. 代码

#使用专家系统来构建 动物识别系统

#使用:加入一条规则S,当规则库中已有的node中包含了S的前置条件,才加入到规则库中,否则先跳过
def TopulogyRules(rules):
    basicAttr = set()   #基础属性
    midAttr = set()     #这些中是被推倒出来的结论
    for rule in rules:
        for attr in rule:
            basicAttr.add(attr)
        midAttr.add(rule[-1])
    basicAttr = basicAttr - midAttr     #全部属性 - 中间属性 = 基础属性
    
    rs = rules.copy()
    visited = []
    for i in range(len(rules)):
        visited.append(0)
    newRules = []
    while(len(rs) != 0): 
        for rule in rules:
            if rule in rs:
                s = set(rule[:-1])
                if s <= basicAttr:
                    newRules.append(rule)
                    rs.remove(rule)
                    visited[i] = 1
                    basicAttr.add(rule[-1])
    print(newRules)
    #不断新建base环境,不断向前搜索,不断添加
    return rules

###读入rules.txt,然后拓扑化 rules,返回一个拓扑化之后的 rules
def getRules():
    animalKinds = []
    rules = []
    f = open("./AnimalRecongnizeSystem/rules.txt", 'r', encoding='UTF-8')
    #f = open("./AnimalRecongnizeSystem/data.txt", 'r').read()
    for line in f:
        #print(line, end='')
        line = line.replace("\n","")
        ls = line.split(" ")
        rules.append(ls)
    animalKinds = rules[-1]
    rules.pop()
    rules = TopulogyRules(rules)
    f.close()
    return rules,animalKinds

def getAnimalInfo():
    info = input("请输入动物的特征(空格为分隔符): ")
    basicInfo = info.split(' ')
    return basicInfo

def Inference(rules, basicInfo, animalKinds):
    animal = "茄子"
    for rule in rules:
        set1 = set(rule[:-1])
        set2 = set(basicInfo)
        if set1 <= set2:
            set2.add(rule[-1])
            basicInfo = list(set2)
            if rule[-1] in animalKinds:
                animal = rule[-1]
                break
    print(basicInfo)
    return animal

def showRules():
    pass

def main():
    rules, animalKinds = getRules()
    # print("知识库中的全部规则为:{}".format(rules))
    # print("知识库能推导出的动物种类为:{}".format(animalKinds))
    basicInfo = getAnimalInfo()
    animal = Inference(rules, basicInfo, animalKinds)
    print("你描述的动物是:{}".format(animal))
main()

# 测试用例:身上有暗斑点 黄褐色 长脖子 有长腿 有奶 有蹄
  1. rules.txt
有毛发 哺乳动物
有奶 哺乳动物
有羽毛 鸟
会飞 会下蛋 鸟
吃肉 食肉动物
有犬齿 有爪 眼盯前方 食肉动物
哺乳动物 有蹄 有蹄类动物
哺乳动物 反刍动物 有蹄类动物
哺乳动物 食肉动物 黄褐色 身上有暗斑点 金钱豹
哺乳动物 食肉动物 黄褐色 身上有黑色条纹 虎
有蹄类动物 长脖子 有长腿 身上有暗斑点 长颈鹿
有蹄类动物 身上有黑色条纹 斑马
鸟 长脖子 有长腿 不会飞 有黑白二色 鸵鸟
鸟 会游泳 不会飞 有黑白二色 企鹅
鸟 善飞 信天翁
金钱豹 虎 长颈鹿 斑马 鸵鸟 企鹅 信天翁

相关文章

  • 实现了一下动物识别系统---基于专家系统

    2019.2.26 主要功能:1. 功能完善(知识库、综合数据库、推理机)2. 正向推理、反向推理3. 知识库可维...

  • 关于学习模型的两个分支

    目前关于智能化工具的实现主要是应用到专家系统和基于概率统计 早些时候大部分都是用专家系统实现的,近几年就已经慢慢的...

  • Drools入门

    规则引擎 相关介绍 规则引擎起源于基于规则的专家系统,而基于规则的专家系统又是专家系统的其中一个分支。专家系统属于...

  • iOS开发 基于系统原生的语音识别助手

    语音识别系统是基于系统的speech.framework来实现的 写的demo已经上传github: git地址-...

  • 基于规则的专家系统的图形检测

    一、概述 此项目具体要求为实现一个基于规则的专家系统, 用来进行简单直线型几何图形的形状检测。 实现的重点在于规则...

  • [源码和文档分享]基于规则的专家系统的图形检测

    一、概述 此项目具体要求为实现一个基于规则的专家系统, 用来进行简单直线型几何图形的形状检测。 实现的重点在于规则...

  • 【2022-06-13】今日总结

    今天做的事情 1、整理app上线情况2、专家系统讨论 总结或者反思事情 1、专家系统的讨论,基于文档进行讨论,所有...

  • day21

    动物识别系统表示看不懂啊(大哭(´;︵;`))

  • 4.无坑系列:安装OpenFace

    OpenFace OpenFace是一个基于深度神经网络的开源的人脸识别系统,由卡耐基梅隆大学开发实现。 相关文献...

  • 1.分词

    基于词典的方法、基于统计的方法、基于规则的方法、(传说中还有基于理解的-神经网络-专家系统,按下不表) 1、基于词...

网友评论

      本文标题:实现了一下动物识别系统---基于专家系统

      本文链接:https://www.haomeiwen.com/subject/ggzeyqtx.html