跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

使用 WebSphere ILOG JRules 进行模糊推理

Alessandro Mottadelli, ILOG 技术销售专家, IBM
Andrew Mottadelli 的照片
Alessandro Mottadelli 是位于意大利 IBM Softare Group 的 ILOG 技术销售专家。他在软件行业拥有将近 30 年的经验。在担任目前职务之前,Alessandro 曾在 IBM Services Group 做过十年的应用架构师,在此之前,他是一名 Smalltalk 技术销售专家,致力于面向对象的编程工作。

简介: 本文提出了一种方法,使用 WebSphere® ILOG JRules 工具构建模糊推理系统;也就是说,进行模糊推断,表述这些推断的推理规则,并得出模糊的结论。ILOG Business Rules Management System 支持经典的基于推理的正向链推理,高效地实施 Rete 算法(Rete plus)。正向链推理是 “犀利的推理”,也就是说,它是根据其他 “已知的” 事实推导事实。然而,有时关于事实的知识无法断定是否真实;例如,如果我说 “Joe 老了”,我可能在进行定性推理,无法客观地确定是否为真;如果 Joe 的年龄为 50 岁,他老吗?模糊逻辑正是为了应对并推理此类定性事实而开发。 本文来自于 IBM Business Process Management Journal 中文版

发布日期: 2012 年 2 月 06 日
级别: 中级 原创语言: 英文
访问情况 : 5800 次浏览
评论: 


免费下载:IBM® WebSphere® ILOG JRules 试用版
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

我为何撰写本文

在一些业务规则应用背景中,比如风险分析,产生评估的知识因素往往是定性的而非定量的。

碰巧有人问我:使用 ILOG JRules 来表述此类模糊推理是否有意义。起初,我对这个想法感到惊讶,但是,后来我开始探究这个想法。我决定撰写本文是为了与业务规则社区分享我的想法和方法,并收集反馈信息、意见和建议。


关于 WebSphere ILOG JRules 的一些背景

在本节中,我将提供一些关于 JRules 的背景信息;如果您已经了解了 JRules 概念,那么您可以安全地跳过本节。

WebSphere ILOG JRules(以下简称为 JRules)提供了用于构建和部署基于规则应用的功能。基于规则的应用是使用业务规则表达业务逻辑的应用,从应用代码进行外部化,并在业务规则管理系统 (BRMS) 基础架构中进行管理和执行。

业务行为语言

业务规则是 "IF criteria THEN action" 形式的有关业务的语句。为了使企业用户直接表述和管理与应用域相关的业务规则,JRules 实现了高级面向企业的规则语言,称为业务行为语言 (Business Action Language, BAL)。BAL 允许以用户提供的词汇表达句子,如图 1 所示。


图 1. 业务规则、词汇和对象模型
业务规则、词汇和对象模型

用户词汇通过构建业务对象模型 (BOM) 构件来定义,该构件定义问题域中所涉及的实体,应如何将这些展示(用语言表达)给用户以及如何将其映射到实现构件(XML 对象模型,Java™ 或 XML)。

执行业务规则(Rete 算法)

JRules 可以在连续模式下或使用高性能版本的 Rete 算法来执行业务规则,遵循以下步骤:

  1. 规则引擎根据运行内存中的对象匹配规则集中的规则条件。
  2. 对于每次匹配,都创建一个规则实例并放入称为 agenda 的执行队列中。然后该议程根据一些命令规则,选择应触发的规则实例。
  3. 触发该规则实例便会执行规则行为。这些行为可以修改运行的内存。

该流程循环继续,直到议程中没有规则实例。


图 2. 规则引擎:Rete plus 模式
规则引擎:Rete plus 模式

关于模糊逻辑的一些背景知识

在本节中,我将提供模糊逻辑概念的基本介绍,这些概念与本文息息相关,这是为了计算我们对根据不精确推断的知识进行推断的信任程度。

模糊集和模糊推断

是带有定义良好的成员概念的元素的集合。例如,70 岁以上人员的集合就是一个集。成员很明晰,也就是说,一个元素要不就是该集成员,要不就不是该集成员。

模糊集 是具有已定义的 “隶属度” 的集合。

例如,“老年人” 集合不是一个定义明确的集,但是只要定义出我们认为某个年龄为 “老” 的百分比,这个集便可以作为一个模糊集。例如,10 年是 10% 老,50 年是 40% 老,70 年是 90% 老,依此类推。

在数学上,隶属度是通过定义 membership 函数 来捕捉,它将成员映射到从 0 到 1 的一个数字。

模糊推断 是关于某个模糊集中的成员的语句,因此具有 “真实度”。

例如,the customer is old 是一个语句,具有与 old people 模糊集中客户隶属度相对应的真实度。

与在香草集的情况相同,模糊集可以通过枚举带有相应的隶属度的集成员来定义。

模糊算子

集算子(并集、交集和补集)可以立即扩展到模糊集,其中:

  • 两个模糊集的并集 的隶属函数被视为这两个隶属函数的最大值。例如,如果我可以 80% 确定地说该客户是老年人,30% 确定地说客户是中年人,那么我可以 80% 确定地说该客户是老年人或中年人。
  • 交集何用两个隶属函数的最小值。例如,如果一名司机是 100% 的中年人,10% 的安全驾驶司机,那么我可以 10% 肯定地说这个司机既是一个中年人又是安全驾驶的司机。>
  • 补集取 “1 的补充”。例如,如果我 100% 地确定这位客户是一位老年人,那么我可以 0% 确定地说这位客户不是老年人。

模糊的如果-那么规则

单一的模糊语句采用的形式为:
If x is A then y is B.

在模糊推理系统中,该语句的语义不同于传统的推理规则,因为:

  • x is A 计算 x 在模糊集 A 中的隶属度。
  • y is B 推断 y 是模糊集 B 的一个成员。
  • if x is A then y is B 推断 y is B 的真实水平(隶属度)等于 x is A 的真实水平。

模糊推理

在通常情况下,模糊推理涉及三个主要阶段:模糊化、规则评估和去模糊化。

模糊化

在该阶段,创建模糊集来代表应用的 “论域”,评估输入的数据来计算相应的模糊集中的隶属度。例如,如果我想表述关于司机的年龄如何影响交通事故的风险的规则,我将构建 "old" 模糊集(输入)和 "high_risk" 模糊集。根据司机的年龄,我将能够计算该司机在 old 模糊集中的隶属度。

规则评估

在该阶段,引擎将评估规则并推导输出模糊集中的隶属度。例如,我可以根据一个规则评估该司机具有 90% 的高风险,并根据另一个规则评估该司机有 20% 的低风险。

去模糊化

在该阶段,根据模糊集计算出一个清晰的数字输出。这是一种算法计算。例如,可以根据高风险和低风险隶属度计算一个数字的风险评分。


将 JRules 用于模糊推理

为了将 JRules 用作模糊推理引擎,您需要执行以下操作:

  • 编写一个 BOM,使您可以表述模糊推断
  • 使用 JRules 推理引擎处理模糊推断工作

编写用于模糊推断的 BOM

BOM 有两个主要类别:FuzzySet 和 FuzzyFact。图 2 显示了编写模糊推断需的可重复使用基本词汇。图 3 显示了以此为基础创建的简单 if-then 规则。

FuzzyFact

FuzzyFact 是主要的 BOM 类。它实现了模糊推断。FuzzyFact 拥有一个真实水平,并公开了 somehow 算子,如果真实水平大于 0 它便会返回 true

以下面的规则为例;

definitions 
  set age to a number in { 30 , 40 , 50, 60 , 70};
if 
  somehow age is old
then  
  print "age: " + age +  " is old with confidence: " + truth value ;
else  
  print "age: " + age +  " is not old at all" ;

gives:

age: 30 is not old at all
age: 40 is not old at all
age: 50 is old with confidence: 0.4
age: 60 is old with confidence: 0.8
age: 70 is old with confidence: 1.0

结果是:

age: 30 is not old at all
age: 40 is not old at all
age: 50 is old with confidence: 0.4
age: 60 is old with confidence: 0.8
age: 70 is old with confidence: 1.0

FuzzyFacts 可以使用模糊布尔运算符合并。例如:

if somehow 'the driver' is MIDDLE_AGED and 'the driver' is LOW_RISK_DRIVER 
then
  print "MIDDLE_AGED with evidence: " 
+ the truth level of  'the driver' is MIDDLE_AGED ;
  print "LOW_RISK_DRIVER with evidence: " 
+  the truth level of 'the driver' is LOW_RISK_DRIVER ;	
  print "combined (and) evidence: " + truth value;

结果是:

MIDDLE_AGED with evidence: 0.2
LOW_RISK_DRIVER with evidence: 0.5
combined (and) evidence: 0.2

FuzzySet

FuzzySet 提供了一种获得或推断 FuzzyFact 的方法,即;

  • getMembership(Object),语言表达为 {an object} is {a fuzzy set},根据 FuzzySet 创建 FuzzyFact。
  • assertFact(Object),语言表达为 set {a fuzzy set} as {0},在 FuzzySet 中创建一个 FuzzyFact,以后可以使用 getMembership() 函数对其进行检索。

通过调用空构造函数并添加(推断)所有成员事实,可以明确定义 FuzzySet。例如,下面的规则推断 HIGH_RISKrisk 模糊集的一个成员。该推断事实的真实值是从规则上下文中隐式推导出的。

if 
  somehow the age of person is old
then  
  set risk as HIGH_RISK ; 
  print "risk is HIGH_RISK with confidence: " + truth value ;

通过将模糊集关联到 membership 函数(该函数在需要时将计算隶属度)也可以隐式定义 FuzzySet。一个简单、典型的 membership 函数的示例是 "trapezoidal" 函数。图 3 显示了年轻人、中年人和老年人模糊集的 membership 函数。


图 3. Trapezoidal membership 函数
Trapezoidal membership 函数

图 4 展示了我们的样例域的 (trapezoidal) membership 函数。


图 4. 模糊词汇
模糊词汇

图 5 显示了 JRules Rules Studio 中定义的模糊词汇。>


图 5. BOM 元素
BOM 元素

推理

基本思路是让 JRules 引擎的工作方式像在执行 “犀利的” 推理并利用 JRules IlrTool API 跟踪推断的真实水平。


表 1. IlrTool API 子集
notifyAddInstance(IlrRuleInstance instance, IlrRuleInstance previous)
提供通知,规则实例已经被插入到日程中。
notifyBeginInstance(IlrRuleInstance instance)
提供通知,规则实例已经被选定触发,第一个行为即将要执行。
notifyEndInstance(IlrRuleInstance instance)
提供通知,规则实例已经完成了行为部分的执行。

正如在 执行业务规则(Rete 算法) 中所述,JRules 首先将根据运行内存中的对象评估每个业务规则的前提;如果前提评估为 true,则将该规则放入议程。

在我们的用例中,每个业务规则的前提可能是模糊事实的组合。somehow 算子将评估为 true,如果模糊事实对于规则实例可以为 true,这可用于将业务规则应用于运行内存中的特定的业务对象。在这种情况下,该规则实例被添加到议程,notifyAddInstance 回调会被调用。该实例的真实值可以被捕捉和跟踪,直到该实例(notifyEndInstance)从议程中被删除。

此处的关键性假设是 JRules 在评估业务规则的前提并在同一个 Java 线程中调用 notifyAddInstance。请注意这种方法的局限性在于 somehow 算子在规则前提中只能被调用一次。

图 6 显示了 EngineTracker Java 实现。引擎跟踪器在 JRules 规则引擎上注册,将收到规则评估事件的通知。


图 6. 引擎跟踪器
引擎跟踪器

去模糊化

在推理阶段,推理引擎将把工作区对象的成员推断到我们用于分类问题空间的某个模糊集。例如我们可以定义一个 HIGH_RISK 模糊集和一个 LOW_RISK 模糊集。业务规则将推断我们何时将一位司机看作为某个类别的成员,引擎将计算隶属度。

在去模糊化阶段中,计算一个数字的 “风险评分”。一个通用流程是计算所产生的模糊集的梯形的重心。这涉及到简单的几何运算,可很容易在 Java 中实现。

图 7 显示了根据以下规则计算得出的得分:

老年人规则:

if 
	somehow 'the driver' is OLD 
then 
 	set risk as HIGH_RISK  ; 


年轻人规则:

if 
	somehow 'the driver' is YOUNG  	
then 
	set risk as HIGH_RISK  ;

安全驾驶司机规则:

if 
	somehow 'the driver' is MIDDLE_AGED or 'the driver' is LOW_RISK_DRIVER 
then 
	set risk as LOW_RISK   ;


不安全驾驶司机规则:

 
if 
	somehow 'the driver' is HIGH_RISK_DRIVER  
then 
	set risk as HIGH_RISK  ;


图 7. 评分
评分

结束语

综上所述,模糊技术由于提供了用于应对不精确知识非常有用的工具而获得广泛的赞誉。IBM ILOG JRules 是一款灵活、强大的工具,用于创建函数式(虽然简单)实现的模糊推理系统。在本文中,我向您展示了如何能够实现此类系统。非常乐意倾听您的观点和体验!


参考资料

学习

获得产品和技术

讨论

关于作者

Andrew Mottadelli 的照片

Alessandro Mottadelli 是位于意大利 IBM Softare Group 的 ILOG 技术销售专家。他在软件行业拥有将近 30 年的经验。在担任目前职务之前,Alessandro 曾在 IBM Services Group 做过十年的应用架构师,在此之前,他是一名 Smalltalk 技术销售专家,致力于面向对象的编程工作。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=791651
ArticleTitle=使用 WebSphere ILOG JRules 进行模糊推理
publish-date=02062012

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。