4

我想做一个小项目,我想用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() 

您怎么看?你相信这样的事情会起作用吗?

+0

如果你有兴趣的神经网络,你可以考虑加入机器学习网站:http://area51.stackexchange.com/proposals/41738/machine-learning – travisbartley

回答

2

在一般情况下,如果你使用的反向传播训练你的神经网络,你基本上是训练的输入输出映射。这意味着您的训练集必须包含已知的输入 - 输出关系(训练集中未包含您的未知值)。然后,人工神经网络成为您的输入和输出之间实际关系的近似值。

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

如果x是已知结果的未知输入序列,则必须调用ANN的逆。我不认为在pybrain中有一种简单的方法来反演人工神经网络,但是你可以用原始训练数据的逆向训练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]) 
+0

你好@Engineero。您的答案的问题是每次输入都会有不同的长度。我认为当我像这样设置我的NN时,ds = SupervisedDataSet(1,1),我必须修复输入序列的数量。我不知道是否可以添加长度为10的样本,在另一个迭代中添加长度为20的另一个样本。 – Tasos

+0

@Tasos,你可以用'for ind in range(n,len(myList))开始上面的循环:'这样你最终只能得到长度为10的输入训练序列。 – Engineero

+0

所以你的意见是添加我选择的固定编号的样本?大于1的数字更好地预测。对? – Tasos

1

我可以给你的是Python库没有一个明确的答案,但我看到它,你有一个神经网络,你给它的形态样品

 
    [ i0 i1 ... i n ] --> [ o0 o1 ... on ] 
    (input vector)  (output vector) 

现在你训练那网样本向量的长度为1.您的网络不知道向其提供的数字的顺序,该顺序仅对训练网络的结果感兴趣。

为了得到一个网络,它知道你可以提出连续的数字作为输入你想要的单号的载体,作为输出序列。你离开包含X的序列例如:

 
    Sequence: 1 2 3 4 X 2 3 4 5 6 7 8 
    Training with input length 3, output length 1: 
    [1 2 3] -> 4 
    [2 3 4] -> 5 (the second one, as the first one is not available) 
    [3 4 5] -> 6 
    [4 5 6] -> 7 
    [5 6 7] -> 8 

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

1

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