一、实验目的
1、能够描述常见的医学知识表示方法,并能运用谓词逻辑表示法、产生式表示法和语义网络表示法进行医学知识的表示。
2、能够描述常见的确定性知识推理方法和不确定性知识推理方法的基本原理,并能运用产生式推理和可信度推理进行医学知识推理。
3、能够编写Python程序实现医学知识推理。
二、实验过程
1、知识表示
1、分别利用谓词逻辑表示法、产生式表示法和语义网络表示法,对以下知识进行表示:
1)患者病情表现为头项强痛、恶寒、脉浮,医生诊断为太阳病。
2)患者得了太阳病,并且还表现为项背拘急、汗出、恶风等症状,则诊断为桂枝加葛根汤证,可以采用发汗的治疗方法,采用桂枝加葛根汤进行治疗。
1)答:
谓词逻辑表示法:头痛(x) ∧ 恶寒(x) ∧ 脉浮(x) → 太阳病(x)
产生式表示法:IF 头痛 AND 恶寒 AND 脉浮 THEN 太阳病
语义网络表示法:
2)谓词逻辑表示法:太阳病(x) ∧ 项背拘急(x) ∧ 汗出(x) ∧ 恶风(x) → 桂枝加葛根汤证(x) ∧ 发汗治疗(x) ∧ 桂枝加葛根汤治疗(x)
产生式表示法:IF 太阳病 AND 项背拘急 AND 汗出 AND 恶风 THEN 桂枝加葛根汤证 AND 发汗治疗 AND 桂枝加葛根汤治疗
语义网络表示法:
2、可信度推理解题
2、基于以下的一组医学知识,请利用可信度推理进行解题:
r1: IF 脉浮缓 THEN 脉浮 (1.0)
r2: IF 头项强痛 AND 恶寒 AND 脉浮 THEN 太阳病 (0.9)
r3: IF 太阳病 AND 发热 AND 汗出 THEN 太阳中风证 (0.7)
r4: IF 太阳病 AND 烦闷 AND 汗出 THEN 太阳中风证 (0.6)
已知:CF(脉浮缓)=0.7,CF(头项强痛)=0.6,CF(恶寒)=0.8,CF(发热)=0.8,CF(汗出)=0.9,CF(烦闷)=0.6
求:CF(太阳中风证)=?
答:
CF(脉浮) = CF(脉浮缓) * 1.0 = 0.7
CF(太阳病) = min(CF(头项强痛), CF(恶寒), CF(脉浮)) * 0.9 = min(0.6, 0.8, 0.7) * 0.9 = 0.6 * 0.9 = 0.54
CF(太阳中风证) from r3 = min(CF(太阳病), CF(发热), CF(汗出)) * 0.7 = min(0.54, 0.8, 0.9) * 0.7 = 0.54 * 0.7 = 0.378
CF(太阳中风证) from r4 = min(CF(太阳病), CF(烦闷), CF(汗出)) * 0.6 = min(0.54, 0.6, 0.9) * 0.6 = 0.54 * 0.6 = 0.324
合并两条规则:CF(太阳中风证)=CF(r3)+CF(r4)×(1−∣CF(r3)∣)CF(太阳中风证) ==0.378+0.324×(1−0.378)=0.378+0.324×0.622=0.579
最终结果:CF(太阳中风证)=0.579
3、Python编程
3. 利用Python编程实现可信度推理,并将第2题的r1、r2、r3、r4等四条规则知识,以及初始事实集,输入程序,运行该程序得出推理结果。
# 定义规则及初始可信度
facts = {
"脉浮缓": 0.7,
"头项强痛": 0.6,
"恶寒": 0.8,
"发热": 0.8,
"汗出": 0.9,
"烦闷": 0.6,
}
# 规则
rules = [
{"if": ["脉浮缓"], "then": "脉浮", "weight": 1.0},
{"if": ["头项强痛", "恶寒", "脉浮"], "then": "太阳病", "weight": 0.9},
{"if": ["太阳病", "发热", "汗出"], "then": "太阳中风证", "weight": 0.7},
{"if": ["太阳病", "烦闷", "汗出"], "then": "太阳中风证", "weight": 0.6},
]
# 计算CF
def calculate_cf(facts, rules):
def combine_cf(cf1, cf2): # 合并两条规则(结论不确定性的合成)
return cf1 + cf2 * (1 - abs(cf1))
updated_facts = facts.copy() # 每次循环都需要更新规则和可信度
for rule in rules:
condition_cf = min([updated_facts.get(cond, 0) for cond in rule["if"]]) # 可信度推理:证据不确定性的表示和计算
result_cf = condition_cf * rule["weight"]
if rule["then"] in updated_facts: # 判断是否存在一样的数据,需要进行规则的更新
updated_facts[rule["then"]] = combine_cf(updated_facts[rule["then"]], result_cf)
else:
updated_facts[rule["then"]] = result_cf
return updated_facts
# 执行推理
result = calculate_cf(facts, rules)
print("CF(太阳中风证) =", result.get("太阳中风证", 0))
三、知识补充
1、中医知识说明
(1)中医诊病:辩证论治。
首先辩证,辨别证据(四诊信息,望闻问切);然后论治(治则、治法、方药、针推)
(2)”证据“——症(症状、体征)
(3)疾病与证候:疾病是病情整个发生发展过程,证候是某一阶段的病理本质的概况,比如,太阳病包括太阳中风证、太阳伤寒证、表郁轻证等。
2、可信度推理
(1)概念:
可信度是指人们根据以往经验对某个事物或现象为真的程度的一个判断,或者说是人们对某个事物或现象为真的相信程度。
例如,沈强昨天没来上课,理由是头疼。就此理由,只有以下两种可能:一是真的头疼了,理由为真;二是没有头疼,理由为假。但就听话人而言,因不能确切知道,就只能某种程度上相信,即可信度。
(2)表示形式:
在C-F模型中,知识是用产生式规则表示的,其一般形式为: IF E THEN H (CF(H, E)) 。其中,E是知识的前提条件;H是知识的结论;CF(H, E)是知识的可信度。
(3)MB和MD:
在CF模型中,把CF(H, E)定义为CF(H, E)=MB(H, E)-MD(H, E),式中E是知识的前提条件; H是知识的结论;CF(H,E)是知识的可信度。
MB称为信任增长度, MB(H, E)的定义
MD称为不信任增长度, MD(H, E)的定义为
(4)MB和MD的关系:
当MB(H, E)>0时,有P(H|E)>P(H),即E的出现增加了H的概率
当MD(H, E)>0时,有P(H|E)<P(H) ,即E的出现降低了H的概率
根据前面对CF(H, E)可信度 、MB(H, E)信任增长度、MD(H, E)不信增 长度的定义,可得到CF(H, E)的计算公式:
3、证据不确定性的表示和计算
(1)基本证据:
表示方法,用可信度,其取值范围也为[-1,1]。例如,CF(E) ,其含义:
CF(E)= 1,证据E肯定它为真
CF(E)= -1,证据E肯定它为假
CF(E)= 0,对证据E一无所知
0<CF(E)<1,证据E以CF(E)程度为真
-1<CF(E)<0,证据E以CF(E)程度为假
(2)否定证据:
(3)组合证据:
合取:E=E1 AND E2 AND … En时,若已知CF(E1),CF(E2),…,则 CF(E)=min{CF(E1), CF(E2), … ,CF(En)}
析取:E=E1 OR E2 OR … En时,若已知CF(E1),CF(E2),…,则 CF(E)=max{CF(E1), CF(E2), … ,CF(En)}
4、不确定性的更新
(1)不确定性的更新公式:CF(H)=CF(H, E)×max{0, CF(E)}
若CF(E)<0,则 CF(H)=0 ,即该模型没考虑E为假对H的影响。
若CF(E)=1,则 CF(H)=CF(H,E) ,即规则强度CF(H,E)实际上是在E为真时,H的可信度。
5、结论不确定性的合成
设有知识:IF E1 THEN H (CF(H, E1))
IF E2 THEN H (CF(H, E2))
则结论H 的综合可信度可分以下两步计算:
(1)分别对每条知识求出其CF(H)。即
CF1(H)=CF(H, E1) ×max{0, CF(E1)}
CF2(H)=CF(H, E2) ×max{0, CF(E2)}
(2)用如下公式求E1与E2对H的综合可信度
![]()