我有一个分类系统,不幸的是,出于工作原因,我需要对其进行模糊处理。假设我们有 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
我们取一个主题并获取它的 AE 值,然后尝试按顺序匹配规则。如果一个匹配,我们返回第一个结果。
C 是一个离散值,可以是 ae 中的任何一个。其余的只是整数。
规则集是从我们的旧系统自动生成的,并且有非常多的规则(约 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 是噪声(对规则不重要)
有谁知道如何解决这个问题?任何语言或库都是公平的游戏,因为我希望这主要是一次性的过程。提前致谢。