我有一个分类系统,不幸的是,出于工作原因,我需要含糊。说我们有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

结果是,我们可以按结果列将规则集拆分并独立收缩。但是,我想不出一种简单的方法来识别和缩小规则集。我尝试了聚类算法,但是它们会扼杀,因为某些数据是离散的,并且将其视为连续的是不完美的。另一个例子:

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机器学习lib for java. 。 API有点肮脏,但非常有用。总体而言,您似乎想要的是一种现成的机器学习算法,这正是WEKA所包含的。显然,您正在寻找相对容易解释的东西(您提到它希望它推断出A和B之间的关系,并告诉您C只是噪音。)您可以尝试一个决策树,例如J48,通常易于可视化/解释。

其他提示

2500万规则?多少个功能?每个功能有多少个值?是否有可能在实用时间内通过所有组合进行迭代?如果可以的话,您可以通过结果将规则分为组开始。

然后,对于每个结果,请执行以下操作。将每个功能视为一个尺寸,而将功能的允许值作为沿该维度的度量标准构建代表整个规则集的巨大karnaugh映射。

该地图有两种用途。一:Quine-McCluskey算法的研究自动化方法。在这一领域已经完成了许多工作。甚至有一些程序可用,尽管可能没有一个程序会处理您要制作的尺寸的Karnaugh地图。

第二:当您创建最终的简化规则集后,再次迭代所有功能的所有值组合,并使用简化的规则集构造另一个Karnaugh映射。如果地图匹配,则规则集是等效的。

- al。

你可以尝试一个 神经网络 方法,通过 反向传播, ,假设您拥有或可以随机生成(基于旧规则集)一组击中所有类的数据。使用适当大小的隐藏层将使您能够在功能空间中近似任意判别功能。这与聚类的想法或多或少是相同的,但是由于培训范式,您的离散输入应该没有问题。

但是,对于您的情况来说,这可能有点“黑匣子”,尤其是如果您对误报和负面影响零容忍(尽管这是一次性的过程,但您通过检查Gargantuan获得了任意的信心验证集)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top