我有一个分类系统,不幸的是,由于工作原因,我需要含糊其辞假设我们要考虑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是噪声(对规则来说并不重要)
有人知道怎么解决这个问题吗?任何语言或库都是公平的,因为我希望这是一个基本上一次性的过程提前谢谢。

最佳答案

查看Weka machine learning lib for Java。这个api有点粗糙,但它非常有用。总的来说,你似乎想要的是现成的机器学习算法,这正是weka所包含的。很明显,你在寻找一个相对容易理解的东西(你提到你希望它能推断出a和b之间的关系,并告诉你c只是噪音),你可以尝试一个决策树,比如j48,因为这些通常很容易可视化/解释。

关于algorithm - 聚合自动生成的特征向量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2096279/

10-12 21:36