Найти - Пользователи
Полная версия: Анализ, предсказание следующего шага последовательности.
Начало » Python для экспертов » Анализ, предсказание следующего шага последовательности.
1 2
Antonio0608
Доброго времени.

Как предсказать следующий шаг последовательности.

Например есть последовательность.

112233112233112233…….

или

111211312111211312…….

Последовательность может быть любая.

Но как обучить нейронную сеть чтобы она определяла следующий шаг последовательности.

есть такой код.

Но эта нейронная сеть не предсказывает следующий шаг, а повторяет предидущии.

А как это исправить я не понимаю.

Может есть тут знатоки которые помогут решить задачу.
 import numpy
import pandas as pd
import math
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from sklearn.metrics import accuracy_score
# convert an array of values into a dataset matrix
def create_dataset(dataset, look_back):
        dataX, dataY = [], []
        for i in range(len(dataset)-look_back-1):
                xset = []
                for j in range(dataset.shape[1]):
                        a = dataset[i:(i+look_back), j]
                        xset.append(a)
                dataX.append(xset)
                dataY.append(dataset[i + look_back,0])
        return numpy.array(dataX), numpy.array(dataY)
# fix random seed for reproducibility
numpy.random.seed(1)
# load the dataset
file='test123456.xlsx'
xl=pd.ExcelFile(file)
dataframe = xl.parse('Sheet1')
dataset = dataframe.values
dataset = dataset.astype('float32')
# normalize the dataset
scaler = MinMaxScaler(feature_range=(0,1))
dataset = scaler.fit_transform(dataset)
# split into train and test sets
train_size = int(len(dataset) * 0.75)
test_size = len(dataset) - train_size
train, test = dataset[0:train_size,:],dataset[train_size:len(dataset),:]
# reshape into X=t and Y=t+1
look_back = 1
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)
# reshape input to be [samples, time steps, features]
trainX = numpy.reshape(trainX, (trainX.shape[0],1,trainX.shape[1]))
testX = numpy.reshape(testX, (testX.shape[0],1,testX.shape[1]))                           
# create and fit the LSTM network
model = Sequential()
model.add(LSTM(8, input_shape=(1, look_back)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='Adam')
model.fit(trainX, trainY, epochs=10000, batch_size=1, verbose=2)
# make predictions
trainPredict = model.predict(trainX)
testPredict = model.predict(testX)
# invert predictions
trainPredict = scaler.inverse_transform(trainPredict)
trainY = scaler.inverse_transform([trainY])
testPredict = scaler.inverse_transform(testPredict)
testY = scaler.inverse_transform([testY])
#
print("X=%s, Predicted=%s" % (testPredict[-1],testX[-1]))
print("X=%s, Predicted=%s" % (testPredict[0],testX[0]))

Буду презнателен за любую помощь.
doza_and
Antonio0608
Последовательность может быть любая.
Если вы говорите любая, то например может быть и случайная последовательность.

Правда жизни такова что в последовательности может быть закономерность а может и не быть ее. В этом случае принципиально невозможно предсказать следующее значение.

Начинать надо с оценки энтропии потока данных, предварительно выяснив каковы сообщения (где их границы в потоке байт).
Antonio0608
Мне кажется последовательность может быть любой.
Главное я не могу понять как обучить нейросеть. Анализировать, искать паттерны и делать прогноз.
в интернете есть много о прогнозировании временных рядов, но чаще все сводится к регрессии, или просто от среднего.
а вот как научить нейросеть работать с чистыми последовательстями. например последовательность Фиббоначи или любыми другими. Может нейросеть сама понять что это последовательность а не простой набор символов. не обязательно это могут быть цифры или буквы и т.д.
FishHook
Antonio0608
Может нейросеть сама понять что это последовательность а не простой набор символов

Нейросеть ничего не может понять. Ошибочно путать нейросеть с искуственным интеллектом. Я понимаю так, что нейросети - это способ численного решения задачи, при котором строится универсальная формула путем подбора коэффициентов дающих минимальную погрешность для данной обучающей выборки. У вас задача, которую я не представляю как решить численно, это сугубо аналитическая задача.
Antonio0608
Грубо говоря.
Нейросеть не способна на основе предидущих событий сделать прогноз.
так я понимаю.
это же ерунда.
Даже этот код способен делать предсказание но только для последовательности
123123123123……
но это больше не предсказание а перебор предидущих вариантов.
FishHook
Antonio0608
Нейросеть не способна на основе предидущих событий сделать прогноз.
так я понимаю.
это же ерунда.

Нейросеть может сделать прогноз.

Antonio0608
Может нейросеть сама понять что это последовательность а не простой набор символов

Нейросеть не может сама понять, что ваши данные представляют собой осмысленную последовательность.

нейросеть вам даст каой-то прогноз с некой вероятностью. Нейросеть никогда не дает точного аналитического результата. Вы даже квадратные уравнения можете решать нейросетью. Если вы скормите нейросети некоторое количество коэффициентов квадратного уравнения и соответствующих корней, то ваша нейросеть будет довольно точно подбирать решение на коэффициентах близких к вашей обучающей выборке. Но нейросеть никогда не придет к формуле (-b + sqr(D)) / 2a и никогда не даст точного результата. Ровно так же нейросеть не ответит на вопрос, по какому закону строится та или иная последовательность.
Antonio0608
Я понимаю это.
Почему мой код, не делает предсказание следующего шага? А просто перебирает предидущие.
Меняя настроики нейросети. Предсказание остается одно и тоже.
Где ошибка в моем коде?
В файле ексель.
Последовательность
112233112233112233112233…. и так повторяется пару сотню десятков раз.



Antonio0608
С экспертами видно недобор на форуме.
Может легче разобрать код по частям.
Вот у меня вопрос.
Почему если менять параметры в первой части кода, то это не влияет на конечный результат.
например.
тут 0
 def create_dataset(dataset, look_back=0):
        dataX, dataY = [], []
        for i in range(len(dataset)-look_back-1):
                xset = []
                for j in range(dataset.shape[1]):
                        a = dataset[i:(i+look_back), j]
                        xset.append(a)
                dataX.append(xset)
                dataY.append(dataset[i + look_back,0])
        return numpy.array(dataX), numpy.array(dataY)
X=[2.0298948], Predicted=[[0.5]]
X=[2.2400405], Predicted=[[1.]]
тут -1
 def create_dataset(dataset, look_back=-1):
        dataX, dataY = [], []
        for i in range(len(dataset)-look_back-1):
                xset = []
                for j in range(dataset.shape[1]):
                        a = dataset[i:(i+look_back), j]
                        xset.append(a)
                dataX.append(xset)
                dataY.append(dataset[i + look_back,0])
        return numpy.array(dataX), numpy.array(dataY)
X=[2.0298948], Predicted=[[0.5]]
X=[2.2400405], Predicted=[[1.]]
тут 1
 def create_dataset(dataset, look_back=1):
        dataX, dataY = [], []
        for i in range(len(dataset)-look_back-1):
                xset = []
                for j in range(dataset.shape[1]):
                        a = dataset[i:(i+look_back), j]
                        xset.append(a)
                dataX.append(xset)
                dataY.append(dataset[i + look_back,0])
        return numpy.array(dataX), numpy.array(dataY)
X=[2.0298948], Predicted=[[0.5]]
X=[2.2400405], Predicted=[[1.]]
не количество эпох, не количество блоков не меняет ситуацию. Даже если сделать через MLP.
Почему так происходит?
Выслушаю любые мнения(но только по теме).

xam1816
вот код моооощщщщного искусственного интеллекта,он может предсказать следующее число(правда только в правильной последовательности

 sequence = '123456'
def forecasting(sequence):
	try:
		for i in range(len(sequence)):
			if sequence[i] != sequence[-1]:
				if int(sequence[i+1]) == int(sequence[i])+1:
					continue
				else:
					n = int(sequence[-1]) + 1
					print(sequence)
					print(f"что дальше,не понятно,но моооожет быть {n}")
					return False
			else:
				n = int(sequence[-1])+1
				print(sequence)
				print(f"вероятно,следующее число {n}")
	except:
		print(sequence)
		print("это для меня сложная последовательность")
forecasting(sequence)

P.s код всерьёз не воспринимайте,просто тему поддержать
py.user.next
Antonio0608
Где ошибка в моем коде?
Где-то в обучении нейросети. Надо нейросеть сначала построить. Потом надо дать нейросети много пар вида (входные данные, правильный результат) , по которым она научится правильно определять. Потом обученной нейросети даются входные данные, похожие на входные данные при обучении, и она выдаёт результат для них.

Попробуй всё стереть и начать заново. К тому же исключить Excel, так как Excel вообще здесь никаким боком. И начни с чего-нибудь очень простого, не с чисел Фибоначчи, а с ноль и один.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB