我在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挖掘频繁模式时,一旦包含分支/图中的一个质量,就不允许添加来自同一分支的其他质量。例如在级别3:
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,#)).
这解决了我提出的问题。然而,在我的实际问题中,数据形成了一个有向树,所以这种"静态"分支方法不适用。