【发布时间】:2016-07-03 17:58:34
【问题描述】:
假设我想以简单的匹配方式找到区分两个类的一组特征/属性,我可以在 prolog 中使用 clpfd 来做到这一点吗?
c_s_mining(Features,Value):-
Features = [F1,F2,F3,F4],
Features ins 0..1,
ExampleA = [A1,A2,A3,A4],
ExampleB =[B1,B2,B3,B4],
ExampleC =[C1,C2,C3,C4],
A1 #=0, A2#=1,A3#=0,A4#=1,
B1 #=0, B2#=1,B3#=0,B4#=1,
C1 #=1, C2#=0,C3#=0,C4#=1,
ExampleD =[D1,D2,D3,D4],
ExampleE =[E1,E2,E3,E4],
ExampleQ =[Q1,Q2,Q3,Q4],
D1#=1,D2#=0,D3#=1,D4#=0,
E1#=1,E2#=0,E3#=1,E4#=0,
Q1#=0,Q2#=1,Q3#=1,Q4#=0,
Positives =[ExampleA,ExampleB,ExampleC],
Negatives = [ExampleD,ExampleE,ExampleQ],
TP in 0..sup,
FP in 0..sup,
covers(Features,Positives,TP),
covers(Features,Negatives,FP),
Value in inf..sup,
Value #= TP-FP.
covers(Features,Examples,Number_covered):-
findall(*,(member(E,Examples),E=Features),Covers), length(Covers,Number_covered).
每个例子由四个二元特征描述,三个正例(A,B,C)和三个负例(D,E,Q)。
如果它们匹配,则一组选定的特征将覆盖一个示例。
例如,如果Features 与[0,1,0,1] 统一,那么这将匹配两个正数和0 个负数。
我将Value 设置为等于TP(真阳性)-TN(真阴性)。我想最大化价值并找到相应的特征集。
我查询?-c_s_mining(Features,Value),labelling([max(Value)],[Value]).
我期望的答案是:Features =[0,1,0,1], Value =2 但我得到了Features =[_G1,_G2,_G3,G4],Value =0, G1 in 0..1, G2 in 0..1, G3 in 0..1, G4 in 0..1.
【问题讨论】:
-
findall(*) 不会像你期望的那样......
-
怎么样? Covers/3 按我的意图工作,星号只是为了计算功能与示例结合的次数..
-
星号可以直接换成E,我觉得不会有影响吧?
-
问题是 findall 中隐含的变量的复制,而不是星号
标签: prolog swi-prolog clpfd prolog-findall