ValueError: операнды не могут транслироваться вместе с фигурами (1,108) (3,) (1,108) - PullRequest
0 голосов
/ 17 июня 2020
import pandas as pd
import numpy as np
from numpy import array
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense
from sklearn.preprocessing import MinMaxScaler

# split a multivariate sequence into samples
def split_sequences(sequences, n_steps, n_test):
    X, y = list(), list()

    for i in range(0,len(sequences),100):
        # find the end of this pattern
        end_ix = i + n_steps
        # check if we are beyond the dataset
        if i!=0 and end_ix > len(sequences):
            break

        sequences[i:end_ix,0]=np.insert(np.diff(sequences[i:end_ix,0]),0,0)
        # gather input and output parts of the pattern
        seq_x, seq_y = sequences[i:end_ix-n_test], sequences[end_ix-n_test:end_ix]

        X.append(seq_x)
        y.append(seq_y)
    return array(X), array(y)

df = pd.read_csv('time-series-19-covid-combined.csv')
df = df.drop(['Lat','Long'], axis = 1)
df.columns = ['day','country', 'territory','confirmed','recovered','deaths']

data=df[df.country.isin(['Australia','Costa Rica','Greece','Hungary','Israel'])][['confirmed','recovered','deaths']]

is_brazil =  (df['country']=='Brazil')

data2=df[(is_brazil)][['confirmed','recovered','deaths']]
date=df[(is_brazil)][['day','confirmed']]
date.day = pd.to_datetime(date.day,format='%Y%m%d', errors='ignore')
date.set_index('day', inplace=True)

n_features = data.shape[1] # this is number of parallel inputs
n_timesteps = date.shape[0] # this is number of timesteps
n_test = int(n_timesteps*0.25)

X, Y = split_sequences(data.values, n_timesteps, n_test)

#normalization#####################################################
alld=np.concatenate((X,Y),1)
alld=alld.reshape(alld.shape[0]*alld.shape[1],alld.shape[2])



scaler = MinMaxScaler()
scaler.fit(alld)
X=[scaler.transform(x) for x in X]
y=[scaler.transform(y) for y in Y]

X=np.array(X)
y=np.array(y)[:,:,0]

# define model
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(n_timesteps - n_test, n_features)))
model.add(Dense(y.shape[1]))
model.compile(optimizer='adam', loss='mse')

# fit model
model.fit(X, y, epochs=200, verbose=1)

# evaluation

data2x=data2
truth = data2

data2x.values[0:len(data2x),0]=np.insert(np.diff(data2x.values[0:len(data2x),0]),0,0)
data2x=scaler.transform(data2x)

X_test = np.expand_dims(data2x, axis=0)

yhat = model.predict(X_test[:,-n_timesteps + n_test:,:], verbose=0)

print (data2x[-n_timesteps + n_test:,0], yhat)

actual_predictions = scaler.inverse_transform(np.tile(yhat, (1, 1, 3))[0])[:,0]

Размеры и значения :

X: массив float-64 (16,108,3)

X_test: массив float-64 (1,144, 3)

Y: массив float-64 (16,36,3)

alld: массив float-64 (2304,3)

data: Dataframe ( 1728,3)

data2: Dataframe (144,3)

data2x: массив float-64 (144,3)

date: Dataframe (144,1)

df: Dataframe (38448,6)

is_brazil: Series (38448,)

n_features: 3 (int)

n_test: 36 (int )

n_timesteps: 144 (int)

истина: Dataframe (144,3)

y: Массив с плавающей запятой-64 (16,36)

yhat: Массив float-32 (1,36)

В своем проекте я собираюсь обучить LSTM с данными о подтвержденных случаях, выздоровевших пациентах и ​​смертях из определенного набора стран и попытаться чтобы спрогнозировать количество заболевших в другой стране. Например: обучение LSTM с данными из Австралии, Коста-Рики, Греции, Венгрии и Израиля и попытка предсказать количество случаев в Бразилии.

Нашел исходный код здесь и попытался закодировать он использует Keras, но в последней строке кода выше, когда я пытаюсь отменить нормализацию, у меня возникает ошибка: ValueError: операнды не могут транслироваться вместе с фигурами (1,108) (3,) (1,108)

Я понятия не имею, что можно сделать, чтобы решить эту проблему. Искал в других темах, но безуспешно. Мы будем очень благодарны за любое решение.

С уважением,

Привет go.

1 Ответ

0 голосов
/ 18 июня 2020

Решено.

Я добавил недостающую линию изменения формы раньше:

lstm_out=lstm_out.reshape(1,144,1).cpu().data.numpy()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...