我有一组相当大(不是太大,但可能超过 50 个)必须放在一组数据上的条件(或者更确切地说,应该对数据进行操作以适应条件)。
例如,假设我有一个长度为 n 的二进制数序列,
如果 n = 5,则数据中的元素可能是 {0,1,1,0,0} 或 {0,0,0,1,1} 等...
但是可能有一组条件,例如
- x_3 + x_4 = 2
- 总和(x_even)<= 2
- x_2*x_3 = x_4 模 2
ETC...
因为条件非常复杂,因为它们来自实验(尽管它们可以以逻辑形式写下来)并且难以诊断,所以我想改用大量有效数据的样本集。即,我知道的数据满足条件并且是一个相当大的集合。也就是说,收集数据比推断数据必须遵守的条件更容易。
话虽如此,基本上我所做的与神经网络非常相似。不同之处在于,我想要一个实际的算法,在某种意义上是最优的,在某种形式的代码中,我可以运行而不是网络。
可能不清楚我实际上想要做什么。我所拥有的是一组独特且明确但不适合我的需求的原始格式的数据(从某种意义上说数据量太大)。
我需要将数据映射到另一个在某种程度上实际上是模棱两可的集合,但也具有所有数据都遵循的某些特定约束集(某些事情不可能发生,而其他事情是首选)。
独特的约束和偏好很难弄清楚。也就是说,从非歧义集到歧义集的映射很难描述(这就是它是歧义的原因)。实际上,我们的目标是尽可能提供正确的约束来获得一个明确的地图。
所以,在我最初的例子中,我被给定(或提供)了一组元素,并且需要一些方法来导出类似于我列出的约束列表。
从某种意义上说,我只是拥有一组有效数据,并对其进行非常类似于神经网络的训练。
然后,在这个“训练”之后,我得到了映射函数,然后我可以在我的数据集中的任何元素上使用它,它将产生一个满足约束的新元素,或者如果它不能,将尽可能接近一个明确的结果。
神经网络和我想要实现的主要区别是我希望能够使用一种算法来编写代码,而不是必须运行神经网络。这里的不同之处在于算法可能会简单得多,不需要潜在的再训练,而且速度要快得多。
这是一个简单的例子。
假设我的“训练集”是二进制序列和映射
01000 => 10000 00001 => 00010 01010 => 10100 00111 => 01110
然后从“Magical Algorithm Finder”(tm)我会得到一个映射
f(x) = x rol 1 (rol = 向左旋转)
或者任何一种人们想要表达的方式。
然后我可以简单地将 f(x) 应用于任何其他元素,例如 x = 011100 并且可以应用 f 来生成希望明确的输出。
当然有很多这样的函数可以在这个例子中使用,但目标是提供足够的数据集来缩小范围,希望能找到一些最有意义的函数(至少总是能正确映射训练集) .
在我的特定情况下,我可以轻松地将我的问题转换为将长度为 m 的二进制数字集映射到长度为 n 的基 B 数字集。约束防止某些数字出现倒数。例如,映射是单射的,但不是满射的。
如果需要的话,我的算法可以是一个简单的集合,如果语句作用于数字。