【问题标题】:WARMR algorithm in ALEPH (SWI-Prolog)ALEPH 中的 WARMR 算法(SWI-Prolog)
【发布时间】:2015-12-18 08:58:24
【问题描述】:

我正在尝试使用 WARMR 在我的数据中查找频繁的关系模式;为此,我在 SWI-Prolog 中使用 ALEPH。但是,我正在努力弄清楚如何做到这一点以及为什么我之前的尝试没有奏效。

我想在继续我的完整数据之前制作一个玩具示例。为此,我从 aleph pack 页面获取了玩具“火车”数据: http://www.swi-prolog.org/pack/list?p=aleph

Aleph 手册说明了 ar 搜索:

ar 实现由 WARMR 系统执行的关联规则搜索类型的简化形式(参见 L. Dehaspe,1998 年,博士论文,Katholieke Universitaet Leuven)。在这里,Aleph 只需找到至少涵盖 预先指定的正面例子的一部分。这个分数由参数 pos_fraction 指定。

我已经插入了

:- set(search,ar).
:- set(pos_fraction,0.01). 

进入后台文件(并删除了:- set(i,2).))并删除了反例的.n文件。我还注释掉了所有的决定和 modeh 声明逻辑是我们正在搜索频繁模式,而不是规则(即在受监督的上下文中,head 将是一个“输出”变量和正文中的子句——“输入”试图解释输出),即它是一个无监督的任务。

现在,原始的trains 数据集正在尝试为“东行”列车构建规则。这是通过使用诸如carshapehas_car(train, car) 等谓词来完成的。最初与这些相关的所有背景知识都位于.b 文件中,而五个正例(例如eastbound(east1).)则位于.f 中文件(在 .n 文件中 + 五个否定示例,例如 eastbound(west1).)。保持文件不变(除了上面描述的更改)并运行induce. 不会产生合理的结果(例如,它将返回像train(east1) 这样的基本术语作为“规则”)。我尝试将一些背景知识移到 .f 文件中,但这也没有产生任何明智的结果。

如何构建 .f 和 .b 文件?如果我们不是真的想解释任何正例(这肯定会构成监督问题),而是要在数据中找到频繁模式(无监督问题),那么应该在正例文件中添加什么?我错过了什么吗?

任何帮助将不胜感激。

【问题讨论】:

    标签: algorithm prolog data-mining swi-prolog logic-programming


    【解决方案1】:

    首先如果你能用原版的WARMR我觉得会更好。但是我认为您需要成为免费使用的学者。您可以尝试申请许可证。 https://dtai.cs.kuleuven.be/ACE/

    为了得到关联规则,我把所有我想要的例子都放在了f文件中。 n 文件中可以有示例,或者我认为是空的。

    我唯一改变的就是放:

     :- set(search,ar).
     :- set(pos_fraction,0.01).  
    

    在 .b 文件中。保留确定和模式声明。

    set(i,2) 将查询的长度限制为具有两个额外的文字(我认为),因此您可能希望它更大。

    ?-read_all(train). induce.

    然后你会得到一个我认为是频繁查询的“好子句”。

    [good clauses] eastbound(A). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), long(B). [pos cover = 2 neg cover = 0] [pos-neg] [2] eastbound(A) :- has_car(A,B), open_car(B). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), shape(B,rectangle). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), wheels(B,2). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), load(B,rectangle,3). [pos cover = 1 neg cover = 0] [pos-neg] [1] eastbound(A) :- has_car(A,B), has_car(A,C). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), has_car(A,C). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), has_car(A,C). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), short(B). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), closed(B). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), shape(B,rectangle). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), wheels(B,2). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), load(B,triangle,1). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), has_car(A,C). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), has_car(A,C). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), long(B). [pos cover = 2 neg cover = 0] [pos-neg] [2] eastbound(A) :- has_car(A,B), open_car(B). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), shape(B,rectangle). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), wheels(B,3). [pos cover = 3 neg cover = 0] [pos-neg] [3] eastbound(A) :- has_car(A,B), load(B,hexagon,1). [pos cover = 1 neg cover = 0] [pos-neg] [1] eastbound(A) :- has_car(A,B), has_car(A,C). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), short(B). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), open_car(B). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), shape(B,rectangle). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), wheels(B,2). [pos cover = 5 neg cover = 0] [pos-neg] [5] eastbound(A) :- has_car(A,B), load(B,circle,1). [pos cover = 3 neg cover = 0] [pos-neg] [3] eastbound(A) :- has_car(A,B), open_car(B), shape(B,rectangle). [pos cover = 4 neg cover = 0] [pos-neg] [4]

    等等等等

    规则的格式为eastbound(A):-blah blah。但它只计算东行的例子。所以把它想象成 example_covered(A):-blah blah

    【讨论】:

    • user27815,谢谢您的回答。我已经尝试过了,但我仍然对需要有积极的例子感到困惑。我认为show(features) 打印了所有“好条款”。相反,在搜索约束时(通过induce_constraints),既不需要提供 .f 文件也不需要提供 .n 文件。
    • 我的数据是遗传来源的(所以是关于标记、基因、突变等的信息),我想了解数据中的频繁模式。我也有表型(性状)数据,但我需要学习与任何性状无关的遗传数据的特征(这是正例的唯一候选者)。
    • warmr 需要计算一些东西。在普通取暖器中,您可以使用按键设置计数。在火车示例中,大概您想计算火车。因为您对正面或负面不感兴趣,所以您只需要一个文件来描述火车。你可能会认为 Aleph 只是将所有的火车从正面和负面结合起来,但它并没有这样做。它只从正面文件中获取示例火车。如果你想让它找到所有列车的频繁查询,你需要把所有的例子都放在 f 文件中。 Induce_constraints 与频率查询不同。
    • 当搜索为 ar 时,它会运行 show(features),因此输出相似,但使用的标准也设置为仅覆盖正面。您可以查看源代码..它可能会有所帮助。
    • 嗨,谢谢您的 cmets!现在它绝对是有道理的,我认为它终于融入了。我已将所有火车示例(东部和西部)放入正面示例文件并运行 induce。 show(features) 现在显示具有所需覆盖率的子句(根据 pos_fraction 的值)。可以预见的唯一规则是eastbound(A).,这也是有道理的。我还检查了 ACE 软件中的示例,在 .s 文件中的编码方式似乎更直观一些;输出也是如此。但是,对获得许可证感到厌烦是一种威慑。
    猜你喜欢
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    相关资源
    最近更新 更多