二进制特征的组合(向量)

时间:2012-02-01 14:16:14

标签: algorithm search optimization

主题的源数据是m-by-n二进制矩阵(仅允许0和1)。 m行代表观察,n列 - 特征。一些观察结果被标记为需要与其余部分分开的目标。

虽然它看起来像典型的NN,SVM等问题,但我不需要概括。我需要的是一种有效的算法,可以找到尽可能多的列(特征)组合,将目标与其他观察完全分开,进行分类,即。

例如:

    f1 f2 f3
o1   1  1  0
t1   1  0  1
o2   0  1  1

这里{f1,f3}是一个可接受的组合,它将目标t1与其余组合分开(o1,o2)(顺便说一下,{f2}不是任务定义,目标中必须存在一个特征)。换句话说,

t1(f1) & t1(f3) = 1 and o1(f1) & o1(f3) = 0, o2(f1) & o2(f3) = 0
where '&' represents logical conjunction (AND).

m约为100,000,n为1,000。目前,数据沿m包装成128位字,搜索优化为sse4和诸如此类。然而,获得这些特征组合需要花费太长时间。 在对树下降例程进行20亿次调用之后,它已经覆盖了大约15%的根节点。并且发现了大约8,000个组合,这对我的特定应用来说是一个不错的结果。

我使用一些经验标准来切断不太可能的下降路径,并非没有有限的成功,但是有什么从根本上更好的?我非常肯定有必要吗?任何形式,参考或建议的帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

我认为您描述的问题是NP-Hard,因此您不应期望在合理的时间内找到最佳解决方案。我不了解你当前的算法,但这里有一些建议在我的头顶:

1)构建决策树。将目标标记为A,将非目标标记为B,并让决策树学习分类。在每个节点处选择特征,使得P(目标特征)和P(目标“|特征”)的函数最大。 (即尽可能多的目标落到正面,尽可能多的非目标落到负面)

2)使用贪心算法。从空集开始,每次都添加杀死最多非目标行的特征。

3)使用随机算法。从一些目标的一小部分正面特征开始,使用该集作为贪心算法的种子。重复多次。选择最佳解决方案。贪心算法会很快,所以没问题。

4)使用遗传算法。为3中的贪婪算法生成随机种子以生成良好的解决方案并交叉产生它们(按位和可能)以生成新的候选种子。记住最好的解决方案。保持当前人口的良好解决方案。重复几代人。

你需要找到答案“有多少给定的行具有给定的特征f”,所以你可能需要专门的数据结构,也许需要为每个特征使用BitArray。