【问题标题】:Combinations of binary features (vectors)二元特征(向量)的组合
【发布时间】: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


【解决方案1】:

我相信您描述的问题是 NP-Hard,因此您不应该期望在合理的时间内找到最佳解决方案。我不明白你目前的算法,但这里有一些建议:

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

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

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

4) 使用遗传算法。为贪心算法生成随机种子,如 3 所示,以生成好的解决方案并将它们交叉乘积(按位和可能)以生成新的候选种子。记住最佳解决方案。保持良好的解决方案作为当前人口。重复很多代。

您需要快速找到“给定行中有多少具有给定特征 f”的答案,因此您可能需要专门的数据结构,可能对每个特征使用 BitArray。

【讨论】:

  • 不回答你的问题,说说你找到的线性时间算法吗?
猜你喜欢
  • 2013-01-03
  • 1970-01-01
  • 2015-06-30
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 2019-04-16
  • 1970-01-01
相关资源
最近更新 更多