| 免费下载: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)。
JRules 可以在连续模式下或使用高性能版本的 Rete 算法来执行业务规则,遵循以下步骤:
- 规则引擎根据运行内存中的对象匹配规则集中的规则条件。
- 对于每次匹配,都创建一个规则实例并放入称为 agenda 的执行队列中。然后该议程根据一些命令规则,选择应触发的规则实例。
- 触发该规则实例便会执行规则行为。这些行为可以修改运行的内存。
该流程循环继续,直到议程中没有规则实例。
图 2. 规则引擎: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 用作模糊推理引擎,您需要执行以下操作:
- 编写一个 BOM,使您可以表述模糊推断
- 使用 JRules 推理引擎处理模糊推断工作
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_RISK 是 risk 模糊集的一个成员。该推断事实的真实值是从规则上下文中隐式推导出的。
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 函数
图 4 展示了我们的样例域的 (trapezoidal) membership 函数。
图 4. 模糊词汇
图 5 显示了 JRules Rules Studio 中定义的模糊词汇。>
图 5. 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 是一款灵活、强大的工具,用于创建函数式(虽然简单)实现的模糊推理系统。在本文中,我向您展示了如何能够实现此类系统。非常乐意倾听您的观点和体验!
学习
- Mathworks Fuzzy
Logic Toolbox 文档
-
WebSphere ILOG JRules BRMS 信息中心
-
developerWorks BPM 专区
-
IBM developerWorks 中国 WebSphere 专区:为使用 WebSphere 产品的开发人员准备的技术信息和资料。这里提供产品下载、how-to 信息、支持资源以及免费技术库,包含 2000 多份技术文章、教程、最佳实践、IBM Redbook 和在线产品手册。
获得产品和技术
- 最受欢迎的 WebSphere 试用软件下载:下载关键 WebSphere 产品的免费试用版。
- IBM developerWorks 软件下载资源中心:IBM deveperWorks 最新的软件下载。
- IBM developerWorks 工具包:下载关键 WebSphere 最新的产品工具包。
讨论
- 加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。
- 加入 IBM 软件下载与技术交流群组,参与在线交流。
