【问题标题】:fill missing values of sequence with neural networks用神经网络填充序列的缺失值
【发布时间】:2013-05-15 11:01:34
【问题描述】:

我想做一个小项目,我想在 python 中使用神经网络。我发现 pybrain 是最好的解决方案。但是直到现在,我发现的所有示例和问题都无法帮助我。

我有一个数字序列。数百行。缺少一些值,而不是数字,而是一个“x”。

例如

1425234838636**x**40543485435097**x**43953458345345430843967067045764607457607645067045**x**04376037654067458674506704567408576405

等等。这只是一个例子。不是我的序列。

我想一一读取这些值并训练我的神经网络,当我找到一个“x”时,我会预测这个数字,然后我会继续用以下数字训练它。

到目前为止我发现的都是这样的训练

trainSet.addSample([0,0,0,0],[1])

有一些输入和一些输出。

有什么建议可以继续吗?

编辑:我想出了一些东西,我想收到反馈,因为我不知道它是否正确。

我还有上面的字符串。我将它拆分为列表,因此我有一个列表,其中每个实体都是一个数字。

for ind in range(len(myList)):
   if not myList[ind] == "x" and not myList[ind+1]=="x":
       ds.addSample(myList[ind],myList[ind+1])
   else:
       break

net = FeedForwardNetwork() 
inp = LinearLayer(1) 
h1 = SigmoidLayer(1) 
outp = LinearLayer(1)

net.addOutputModule(outp) 
net.addInputModule(inp) 
net.addModule(h1)

net.addConnection(FullConnection(inp, h1))  
net.addConnection(FullConnection(h1, outp))

net.sortModules()

trainer = BackpropTrainer(net, ds)
trainer.trainOnDataset(ds,1000)
trainer.testOnData(verbose=True)

lis[ind+1] = net.activate((ind,))

GO to the beggining and continue from the last "x" which replaced from the net.activate()

你怎么看?你相信这样的事情会奏效吗?

【问题讨论】:

标签: python artificial-intelligence neural-network time-series forecasting


【解决方案1】:

一般来说,如果您使用反向传播来训练您的 ANN,那么您基本上是在训练一个输入-输出图。这意味着您的训练集必须包含已知的输入-输出关系(训练集中不包含任何未知值)。然后,ANN 就变成了输入和输出之间实际关系的近似值。

然后您可以调用x = net.activate([seq]),其中seq 是与未知值x 关联的输入序列。

如果x 是已知结果的未知输入序列,那么您必须调用 ANN 的逆。我不认为有一种简单的方法可以在 pybrain 中反转 ANN,但是您可以使用原始训练数据的倒数来训练 ANN。换句话说,使用您已知的结果作为训练输入,并将它们关联的序列作为训练结果。

要考虑的主要问题是该工具的适用性以及您正在尝试做的事情的训练数据。如果您只想将 x 预测为前一个数字的函数,那么我认为您的训练正确。我猜x 将成为之前n 数字的函数,在这种情况下,您希望将数据集更新为:

n = 10
for ind in range(len(myList)):
    # Don't overrun our bounds
    if ind == len(myList)-1:
        break

    # Check that our sequence is valid
    for i in range(ind-n, ind+1):
        if i >= 0 and myList[i] == "x":
            # we have an invalid sequence
            ind += i   # start next seq after invalid entry
            break

    # Add valid training sequence to data set
    ds.addSample(myList[ind-n:ind],myList[ind+1])

【讨论】:

  • 你好@Engineero。您的答案的问题是每次输入都会有不同的长度。而且我认为当我像这样设置我的 NN ds = SupervisedDataSet(1, 1) 时,我必须修复输入序列的数量。我不知道我是否可以添加一个长度为 10 的样本,并在另一次迭代中添加另一个长度为 20 的样本。
  • @Tasos,您可以以 for ind in range(n, len(myList)): 开始上述循环,这样您最终只能得到长度 = 10 个输入训练序列。
  • 所以您的意见是添加我的样本和我选择的修复编号?大于 1 的数字更好地进行更好的预测。对吗?
  • 我想是这样,但我不知道数据集的性质。如果您试图预测一个完全随机的过程,那么您将不会从更多样本中获得任何帮助。如果你的过程是这样的,一个数字取决于它之前的数字,那么你可能会到达某个地方。
  • 我为你的答案投票。如果我不能变得更好,我会选择你的作为最好的。谢谢。
【解决方案2】:

您所描述的是一个名为Imputation 的统计应用程序:替换数据中的缺失值。传统方法不涉及神经网络,但肯定有一些research in this direction。这不是我的领域,但我建议您查看文献。

【讨论】:

    【解决方案3】:

    对于那个 python 库,我不能给你一个具体的答案,但正如我所见,你有一个神经网络,你给它形式的样本

    [ i0 i1 ... i n ] --> [ o0 o1 ... on ] (输入向量) (输出向量)

    现在你用长度为 1 的样本向量训练网络。你的网络不知道呈现给它的数字的序列,该序列只对训练网络的结果感兴趣。

    要获得一个知道序列的网络,您可以将连续数字的向量作为输入,将您想要的单个数字作为输出。您留下包含 X 示例的序列:

    顺序:1 2 3 4 X 2 3 4 5 6 7 8 输入长度为 3,输出长度为 1 的训练: [1 2 3] -> 4 [2 3 4] -> 5(第二个,因为第一个不可用) [3 4 5] -> 6 [4 5 6] -> 7 [5 6 7] -> 8

    我认为使用这个,您的网络可以稍微适应输入序列。 “如何”提取正确的训练序列作为输入,我必须留给领域专家(你)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-06
      • 2012-04-05
      • 2017-10-19
      • 1970-01-01
      • 2021-05-04
      • 2018-10-27
      • 2013-09-22
      • 1970-01-01
      相关资源
      最近更新 更多