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 

我们拍摄对象并获取其值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 

结果是我们可以通过结果列拆分规则集并独立收缩。但是,我想不出一个简单的方法来识别和缩小规则集。我试过聚类算法,但它们因为某些数据是离散的而窒息,并将其视为连续的并不完美。又如:

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 2 5 5 4 X”将意味着例如“1 2 b 5 2”意味着X,这不是原始规则集所隐含的。 – Sami 2010-01-19 19:24:37

回答

1

查看Weka machine learning lib for Java。该API有点笨重,但它非常有用。总的来说,你似乎想要的是一种现成的机器学习算法,这正是Weka包含的算法。你显然在寻找相对容易解释的东西(你提到你希望它推断A和B之间的关系,并告诉你C只是噪声)。你可以尝试一个决策树,比如J48,因为这些通常易于可视化/解释。

+1

接受 - 我实现了一个简单的分类算法,它利用了我通过使用Weka发现的关系和含义。谢谢。 – rjh 2010-02-14 21:03:12

0

假设您已经或可以随机生成(基于旧规则集)一大组打破所有类的数据,您可以尝试使用neural network方法,通过backpropagation进行培训。使用适当大小的隐藏层可以使您近似于特征空间中的任意判别函数。这或多或少是与聚类相同的想法,但由于训练范例应该对离散输入没有任何问题。

但是,对于您的情况,这可能会有点过于“黑匣子”,特别是如果您对误报和负面情况零容忍(尤其是对于一次性过程,您会获得任意程度的置信度通过检查一个庞大的验证集)。

+0

不幸的是,我们需要能够反思确切的规则,尽管你的想法对于许多其他用例来说是非常好的。 – rjh 2010-01-20 12:22:38

1

2500万条规则?有多少功能?每个功能有多少个值?是否可以在实际时间内遍历所有组合?如果可以的话,您可以先将结果按规则分组。

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

该地图有两种用途。一:研究Quine-McCluskey算法的自动化方法。这方面做了很多工作。甚至还有一些可用的程序,但可能它们都不会处理您要制作的卡诺图地图。

二:当您创建了最终约简规则集时,再次遍历所有要素的所有值的所有组合,并使用约简规则集构造另一个卡诺图。如果地图匹配,则您的规则集是相同的。

-Al。