我有一个分类系统,不幸的是,出于工作原因我不得不模糊不清。假设我们有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
结果是我们可以通过Result列拆分规则集并单独收缩每个规则集。但是,我想不出一种简单的方法来识别和缩小规则集。我已经尝试过聚类算法,但是因为一些数据是离散的,所以它们会窒息,并将其视为连续算法并不完美。另一个例子:
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是噪声(对规则不重要)
有没有人知道如何解决这个问题?任何语言或图书馆都是公平的游戏,因为我认为这是一个大致一次性的过程。提前谢谢。
答案 0 :(得分:1)
二千五百万条规则?有多少功能?每个功能有多少个值?是否有可能在实际时间内迭代所有组合?如果可以,您可以从按结果将规则分成组开始。
然后,对于每个结果,请执行以下操作。将每个要素视为一个维度,并将要素的允许值作为该维度的度量标准,构建一个代表整个规则集的巨大卡诺图。
地图有两种用途。一:研究Quine-McCluskey算法的自动化方法。在这方面已经做了很多工作。甚至有一些程序可用,但可能没有一个可以处理你将要制作的卡诺图。
二:当您创建最终缩小的规则集时,再次迭代所有要素的所有值的所有组合,并使用缩小的规则集构建另一个卡诺图。如果地图匹配,则您的规则集是等效的。
-Al。
答案 1 :(得分:1)
查看Weka machine learning lib for Java。 API有点夸张但它非常有用。总的来说,你似乎想要的是一种现成的机器学习算法,这正是Weka所包含的。你显然正在寻找一些相对容易理解的东西(你提到你希望它推断出A和B之间的关系,并告诉你C只是噪音。)你可以尝试一个决策树,比如J48,就像这些通常很容易想象/解释。
答案 2 :(得分:0)
您可以尝试neural network方法,通过backpropagation进行培训,假设您已经或可以随机生成(基于旧规则集)大量数据,这些数据会打到您的所有课程。使用适当大小的隐藏层将允许您在要素空间中近似任意判别函数。这与集群或多或少的想法相同,但由于培训范式应该对离散输入没有任何问题。
然而,对于你的情况,这可能有点过于“黑匣子”,特别是如果你对误报和否定的零容忍(尽管,这是一次性过程,你可以获得任意程度的信任检查庞大的验证集。)