【发布时间】:2011-01-06 23:10:31
【问题描述】:
我有一个分类系统,很遗憾,出于工作原因,我需要对其进行模糊处理。假设我们有 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是噪声(对规则不重要)
有人知道如何解决这个问题吗?任何语言或库都是公平的游戏,因为我希望这主要是一次性的过程。提前致谢。
【问题讨论】:
-
你确定你的第一个例子是正确的吗?据我了解,“1 2 bce 5 2-4 X”将意味着例如“1 2 b 5 2”将暗示 X,而原始规则集并未暗示这一点。
标签: algorithm cluster-analysis rules classification rule-engine