我有一个分类系统,不幸的是,由于工作原因,我需要含糊其辞假设我们要考虑5个特性,这基本上是一套规则:
A B C D E Result
1 2 b 5 3 X
1 2 c 5 4 X
1 2 e 5 2 X
我们取一个主题,得到它的a-E值,然后尝试按顺序匹配规则如果一个匹配,我们返回第一个结果。
c是一个离散值,可以是a-e的任意一个,其余的都是整数。
规则集是从我们的旧系统中自动生成的,并且有大量的规则(大约2500万条)。旧规则是if语句,例如。
result("X") if $A >= 1 && $A <= 10 && $C eq 'A';
如您所见,旧规则通常甚至不使用某些功能或接受范围。有些更烦人:
result("Y") if ($A == 1 && $B == 2) || ($A == 2 && $B == 4);
规则集需要小得多,因为它必须由人工维护,所以我想缩小规则集,以便第一个示例变成:
A B C D E Result
1 2 bce 5 2-4 X
结果是,我们可以按结果列拆分规则集,并分别收缩每个规则集。但是,我想不出一个简单的方法来识别和缩小规则集。我尝试过聚类算法,但由于一些数据是离散的,将其视为连续的是不完美的,因此它们会窒息。另一个例子:
A B C Result
1 2 a X
1 2 b X
(repeat a few hundred times)
2 4 a X
2 4 b X
(ditto)
在理想的世界里,这有两条规则:
A B C Result
1 2 * X
2 4 * X
也就是说:算法不仅可以识别A和B之间的关系,而且还可以推断C是噪声(对规则来说并不重要)
有人知道怎么解决这个问题吗?任何语言或库都是公平的,因为我希望这是一个基本上一次性的过程提前谢谢。
最佳答案
查看Weka machine learning lib for Java。这个api有点粗糙,但它非常有用。总的来说,你似乎想要的是现成的机器学习算法,这正是weka所包含的。很明显,你在寻找一个相对容易理解的东西(你提到你希望它能推断出a和b之间的关系,并告诉你c只是噪音),你可以尝试一个决策树,比如j48,因为这些通常很容易可视化/解释。
关于algorithm - 聚合自动生成的特征向量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2096279/