Python 基于Pybrain的模式识别

Python 基于Pybrain的模式识别,python,machine-learning,pybrain,Python,Machine Learning,Pybrain,有没有一种方法可以训练大脑识别单个神经网络中的多种模式?例如,我添加了两种不同模式的几个排列: 第一种模式: (200[1-9], 200[1-9]),(400[1-9],400[1-9]) 第二种模式: (900[1-9], 900[1-9]),(100[1-9],100[1-9]) 然后,对于我的无监督数据集,我添加了(9000290009),我希望它会返回[100[1-9],100[1-9]](第二种模式),但它会返回[2508425084]。我意识到它试图找到所有输入的最佳值,但是我

有没有一种方法可以训练大脑识别单个神经网络中的多种模式?例如,我添加了两种不同模式的几个排列:

第一种模式:

(200[1-9], 200[1-9]),(400[1-9],400[1-9])
第二种模式:

(900[1-9], 900[1-9]),(100[1-9],100[1-9])
然后,对于我的无监督数据集,我添加了(9000290009),我希望它会返回[100[1-9],100[1-9]](第二种模式),但它会返回[2508425084]。我意识到它试图找到所有输入的最佳值,但是我试图让它在集合中区分某些模式,如果这有意义的话

这就是我工作的例子:

[[EDIT]]添加了分类变量和ClassificationDataSet


[[EDIT 1]]添加了更大的训练集和看不见的训练集

是的,有。这里的问题是您选择的表示形式。您正在训练网络以输出实数,因此NN是一个函数,在某种程度上近似于您在数据集中采样和提供的函数。因此,结果是10000到40000之间的某个值

这看起来更像是你在找一个新的工作。 根据你的描述,我假设你有一套清晰定义的模式,你正在寻找。然后必须将模式映射到一个分类变量。例如,您提到的模式1
(200[1-9],200[1-9]),(400[1-9],400[1-9])
将是0,模式2将是1,依此类推

然后,训练网络输出输入模式所属的类(0,1,…)。 可以说,考虑到模式的结构,基于规则的分类可能比ANN更合适


关于数据量,您需要更多的数据。最基本的方法是将数据集分成两组(例如70-30)。您使用70%的样本进行训练,剩余的30%作为看不见的数据(测试数据)来评估模型的泛化/过度拟合。一旦运行了基本功能,您可能会想了解交叉验证。

我添加了一个ClassificaitonDataSet,并像您所说的那样放入了分类变量,但是它无法识别正确的模式。它需要更多的数据还是训练时间?是的,你也需要更多的数据。我没有补充这一点,因为我认为你只是举了一个例子。现在查看更新。我显然做错了什么。。我在训练数据集中添加了1000行,在未看到的数据集中添加了100行。它仍然没有100%的时间猜测正确的模式。这是一个不同的问题,通常是这样的。请参见分类器的性能度量。
from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.datasets import SupervisedDataSet,UnsupervisedDataSet
from pybrain.structure import LinearLayer
from pybrain.datasets import ClassificationDataSet
from pybrain.structure.modules.sigmoidlayer import SigmoidLayer
import random

ds = ClassificationDataSet(2, 1)

tng_dataset_size = 1000
unseen_dataset_size = 100
print 'training dataset size is ', tng_dataset_size
print 'unseen dataset size is ', unseen_dataset_size
print 'adding data..'
for x in range(tng_dataset_size):
   rand1 = random.randint(1,9)
   rand2 = random.randint(1,9)

   pattern_one_0 = int('2000'+str(rand1))
   pattern_one_1 = int('2000'+str(rand2))
   pattern_two_0 = int('9000'+str(rand1))
   pattern_two_1 = int('9000'+str(rand2))
   ds.addSample((pattern_one_0,pattern_one_1),(0))#pattern 1, maps to 0
   ds.addSample((pattern_two_0,pattern_two_1),(1))#pattern 2, maps to 1


unsupervised_results = []

net = buildNetwork(2, 1, 1, outclass=LinearLayer,bias=True, recurrent=True)
print 'training ...'
trainer = BackpropTrainer(net, ds)
trainer.trainEpochs(500)


ts = UnsupervisedDataSet(2,)
print 'adding pattern 2 to unseen data'
for x in xrange(unseen_dataset_size):
   pattern_two_0 = int('9000'+str(rand1))
   pattern_two_1 = int('9000'+str(rand1))

   ts.addSample((pattern_two_0, pattern_two_1))#adding first part of pattern 2 to unseen data
   a = [int(i) for i in net.activateOnDataset(ts)[0]]#should map to 1

   unsupervised_results.append(a[0])

print 'total hits for pattern 1 ', unsupervised_results.count(0)
print 'total hits for pattern 2 ', unsupervised_results.count(1)