主题的源数据是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个组合,这对我的特定应用来说是一个不错的结果。
我使用一些经验标准来切断不太可能的下降路径,并非没有有限的成功,但是有什么从根本上更好的?我非常肯定有必要吗?任何形式,参考或建议的帮助都会受到赞赏。
答案 0 :(得分:0)
我认为您描述的问题是NP-Hard,因此您不应期望在合理的时间内找到最佳解决方案。我不了解你当前的算法,但这里有一些建议在我的头顶:
1)构建决策树。将目标标记为A,将非目标标记为B,并让决策树学习分类。在每个节点处选择特征,使得P(目标特征)和P(目标“|特征”)的函数最大。 (即尽可能多的目标落到正面,尽可能多的非目标落到负面)
2)使用贪心算法。从空集开始,每次都添加杀死最多非目标行的特征。
3)使用随机算法。从一些目标的一小部分正面特征开始,使用该集作为贪心算法的种子。重复多次。选择最佳解决方案。贪心算法会很快,所以没问题。
4)使用遗传算法。为3中的贪婪算法生成随机种子以生成良好的解决方案并交叉产生它们(按位和可能)以生成新的候选种子。记住最好的解决方案。保持当前人口的良好解决方案。重复几代人。
你需要找到答案“有多少给定的行具有给定的特征f”,所以你可能需要专门的数据结构,也许需要为每个特征使用BitArray。