【发布时间】:2012-02-01 14:16:14
【问题描述】:
主题的源数据是一个 m×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 个组合,这对于我的特定应用程序来说是一个不错的结果。
我使用一些经验标准来切断不太可能的下降路径,但并非没有有限的成功,但有什么更好的方法吗?我很确定一定有?..任何形式的帮助,参考或建议,将不胜感激。
【问题讨论】:
-
澄清请求:假设您有 t1、t2、o1、o2。你会: a) 搜索一次以将 t1,t2 与 o1,o2 分开 b) 搜索两次,一次将 t1 与 o1,o2 分开,另一次将 t2 与 o1,o2 分开 c) 搜索两次以将 t1 与 o1 分开, o2,t2 和另一个将 t2 与 o1,o2,t1 分开?
-
阿里:目前搜索是通过递减树并消除已处理的组合递归完成的,因此每个组合只考虑一次。
-
我不明白。假设有三个特征 f1,f2,f3。我将以二进制形式编写这些功能,即 101 表示 f1,而不是 f2、f3。假设 t1=110 t2=101 o1=010 o2=011。现在 {f1} 是一个解决方案,因为它将 t1 和 t2 与其余部分分开?还是我们需要两种不同的解决方案, s1={f1,f2} 来分隔 t1 和 s2={f1,f3} 来分隔 t2 ?
-
阿里:我明白你的意思了。我不想用额外的细节来污染我的问题,但这让它不清楚,我猜。实际任务需要找到将至少一定数量的目标与其余目标分开的任何 f-combo。假设,这个数字说,薄荷,是 1。那么在你的例子中, f1 是一个解决方案。如果有 t3=001 或 t2 没有分离,它仍然是。但如果 mint =3,那么您示例中的 f1 将不是有效的解决方案。
标签: algorithm search optimization