用MLP和Tens预测时间序列值

2024-10-06 11:55:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难尝试建立一个多层感知器神经网络来使用Tensorflow来预测时间序列的下一个值。在

我从一个文件中读取时间序列,将其分成三个数组,并使用这些数组来训练、测试和验证网络。不幸的是,我的网络对我的每一个输入都回答0.9999。在

下图显示了我希望我的网络产生的值,请注意,它们的范围从2.8到4.2

This is the real values my network is supposed to output. Note that it goes from 2.8 to 4.2

现在,这些是我的网络预测的值。虽然它们看起来都一样,但实际上是0.9999。。。(在小数点后第9位有些不同)。在

These are the values my network predicts

import csv
import numpy as np

from statsmodels.tsa.tsatools import lagmat
import tensorflow as tf

# Data split (values represent percentage)
perc_train = 0.5
perc_test = 0.4
perc_eval = 0.1

# Parameters
learning_rate = 10 ** -3
min_step_size_train = 10 ** -5
training_epochs = 250
display_step = 1

# Network Parameters
n_input = 15 
n_classes = 1 
n_hidden = (n_input + n_classes) / 2 


def get_nn_sets(pmX, pmY):
    '''
    Splits data into three subsets
    '''
    trainningIndex = int(len(pmX) * perc_train)
    validationIndex = int(len(pmX) * perc_test) + trainningIndex

    pmXFit = pmX[:trainningIndex, :]
    pmYFit = pmY[:trainningIndex]

    pmXTest = pmX[trainningIndex:validationIndex, :]
    pmYTest = pmY[trainningIndex:validationIndex]

    pmxEvaluate = pmX[validationIndex:, :]
    pmYEvaluate = pmY[validationIndex:]

    return pmXFit, pmYFit, pmXTest, pmYTest, pmxEvaluate, pmYEvaluate


def read_dollar_file(clip_first = 4000):
    '''
    Reads the CSV file containing the dollar value for Brazilian real during the years
    -----
    RETURNS:
        A matrix with the file contents
    '''

    str_vals = []
    with open('dolar.csv', 'rb') as csvfile:
        spamreader = csv.reader(csvfile, delimiter=',')
        for row in spamreader:
            # retrieving the first column of the file (the dollar value)
            str_vals.append(row[1]) 

    # removing title
    str_vals = str_vals[1:]
    # removing the empty strings (sunday and holidays have no values)
    y = filter(None, str_vals) 
    # converting from string to float values
    y = np.array(y).astype(np.float) 

    # checking if initial elements should be discarded
    if (clip_first > 0):
        y = y[clip_first:]
    return y

 # Create model
def get_multilayer_perceptron(x):
    # Store layers weight & bias

    weights = {
        'h1': tf.Variable(tf.random_normal([n_input, n_hidden], dtype=tf.float64)),
        'out': tf.Variable(tf.random_normal([n_hidden, n_classes], dtype=tf.float64))
    }
    biases = {
        'b1': tf.Variable(tf.random_normal([n_hidden], dtype=tf.float64)),
        'out': tf.Variable(tf.random_normal([n_classes], dtype=tf.float64))
    }
    # Hidden layer with relu activation
    layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1'])
    layer_1 = tf.nn.relu(layer_1)
    # Output layer with tanh activation
    out_layer = tf.matmul(layer_1, weights['out']) + biases['out']
    out_layer = tf.nn.tanh(out_layer)
    return out_layer

def run_mlp(inp, outp):

    pmXFit, pmYFit, pmXTest, pmYTest, pmXEvaluate, pmYEvaluate = get_nn_sets(inp, outp)

    # tf Graph input
    x = tf.placeholder("float64", [None, n_input])
    y = tf.placeholder("float64", [None, n_classes])

    # Construct model
    pred = get_multilayer_perceptron(x)    

    # Define loss and optimizer
    cost = tf.nn.l2_loss(tf.sub(pred, y))        
    optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)

    # Initializing the variables
    init = tf.initialize_all_variables()

    # Launch the graph
    with tf.Session() as sess:
        sess.run(init)

        # Training cycle
        last_cost = min_step_size_train + 1
        for epoch in range(training_epochs):

            # Trainning data
            for i in range(len(pmXFit)):
                batch_x = np.reshape(pmXFit[i,:], (1, n_input))
                batch_y = np.reshape(pmYFit[i], (1, n_classes))

                # Run optimization
                sess.run(optimizer, feed_dict={x: batch_x, y: batch_y})


            # Calculating data error
            c = 0.0
            for i in range(len(pmXTest)):
                batch_x = np.reshape(pmXTest[i,:], (1, n_input))
                batch_y = np.reshape(pmYTest[i], (1, n_classes))

                # Run Cost function                
                c += sess.run(cost, feed_dict={x: batch_x, y: batch_y})

            c /= len(pmXTest)
            # Display logs per epoch step
            if epoch % display_step == 0:
                print("Epoch:", '%04d' % (epoch+1), "cost=", \
                    "{:.30f}".format(c))            

            if abs(c - last_cost) < min_step_size_train:
                break
            last_cost = c

        nn_predictions = np.array([])          
        for i in range(len(pmXEvaluate)):
            batch_x = np.reshape(pmXEvaluate[i,:], (1, n_input))
            nn_predictions = np.append(nn_predictions, sess.run(pred, feed_dict={x: batch_x})[0])

        print("Optimization Finished!")

    nn_predictions.flatten()
    return [pmYEvaluate, nn_predictions]

inp = lagmat(read_dollar_file(), n_input, trim='both')
outp = inp[1:, 0]
inp = inp[:-1]

real_value, predicted_value = run_mlp(inp, outp)

我也试过不同的成本函数,但没用。我知道我可能错过了一些非常愚蠢的事情,所以我非常感谢你的帮助。在

谢谢。在


Tags: thelayerinputtfstepnpbatchtrain