我在ACE数据挖掘套件中使用WARMR频繁模式算法。这里有一个玩具示例来说明我的问题。
假设你有20个例子(example(ex1))
,…,example(ex20))
),并且只有一个谓词,称之为quality
,所以quality(E, X)
表示E
具有质量X
。X
可以取6个值:a
,b
,c
,d
,e
和f
,它们之间有关联:c
是b
,b
是a
(因此c
也是a
),f
是e
,e
是d
(因此f
也是d
)。可以想象成图形:
a - b - c
d - e - f
当WARMR挖掘频繁模式时,一旦一个分支/图形中的一个质量被包含,就不应该允许从同一分支中添加其他质量。例如,在第三级:
example(A),quality(A,a),quality(A,d)
是一个有效的模式,但:
example(A),quality(A,a),quality(A,c)
或
example(A),quality(A,a),quality(A,b)
则不是。
我已经在.bk
文件中包含了这个背景知识:
bond(b,a).bond(c,b).bond(f,e).bond(e,d).no_bond(a,d).no_bond(a,e).no_bond(a,f).bond(X,Y) :- bond(X,Z),bond(Z,Y).bond(X,Y) :- bond(Y,X).no_bond(X,Y) :- no_bond(Y,X).no_bond(X,Y) :- no_bond(X,Z),bond(Z,Y).
并且我尝试通过在.s
文件中添加以下内容来强制执行上述条件:
rmode(quality(+E, #).constraint(quality(E, Q), not_occurs(bond(Q,_))).
和
rmode(quality(+E, #).constraint(quality(E, Q), user(X, no_bond(Q,_))).
或
constraint(quality(E, Q), user(X, no_bond(Q,X))).
这些方法都没有奏效。任何帮助都将不胜感激。
回答:
所以有人向我建议了以下答案:
首先在背景知识中添加以下谓词:
branch1(E,X) :- quality(E,X), member(X, [a,b,c]).branch2(E,X) :- quality(E,X), member(X, [d,e,f]).
然后在设置文件中包含这些:
rmode(1:branch1(+E,#)).rmode(1:branch2(+E,#)).
这解决了我提出的问题。然而,我实际问题中的数据形成了一个有向树,因此这种“静态”分支方法不适用。