1

我有一个分类系统,不幸的是,出于工作原因,我需要对其进行模糊处理。假设我们有 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 是噪声(对规则不重要)

有谁知道如何解决这个问题?任何语言或库都是公平的游戏,因为我希望这主要是一次性的过程。提前致谢。

4

3 回答 3

1

两千五百万条规则?有多少功能?每个特征有多少个值?是否可以在实际时间内迭代所有组合?如果可以的话,您可以先按结果将规则分成几组。

然后,对于每个结果,请执行以下操作。将每个特征视为一个维度,将一个特征的允许值视为沿该维度的度量,构建一个表示整个规则集的巨大卡诺图。

该地图有两个用途。一:研究Quine-McCluskey算法的自动化方法。在这方面已经做了很多工作。甚至还有一些程序可用,但可能没有一个程序可以处理您将要制作的大小的卡诺图。

第二:当您创建了最终的缩减规则集时,再次迭代所有特征的所有值的所有组合,并使用缩减规则集构建另一个卡诺图。如果映射匹配,则您的规则集是等效的。

-阿尔。

于 2010-01-19T23:07:49.780 回答
1

查看适用于 Java 的 Weka 机器学习库。API 有点笨拙,但非常有用。总体而言,您似乎想要的是现成的机器学习算法,而这正是 Weka 所包含的。您显然正在寻找相对容易解释的东西(您提到您希望它推断 A 和 B 之间的关系并告诉您 C 只是噪声。)您可以尝试决策树,例如 J48,因为这些通常很容易可视化/解释。

于 2010-01-19T23:32:04.207 回答
0

您可以尝试通过反向传播训练的神经网络方法,假设您拥有或可以随机生成(基于旧规则集)大量数据,这些数据会影响您的所有类别。使用适当大小的隐藏层将允许您在特征空间中逼近任意判别函数。这与聚类的想法或多或少相同,但由于训练范式的原因,您的离散输入应该没有问题。

但是,对于您的情况来说,这可能有点过于“黑匣子”,特别是如果您对误报和误报零容忍(尽管这是一个一次性的过程,您可以通过检查庞大的数据来获得任意程度的信心验证集)。

于 2010-01-19T19:24:04.183 回答