popc虚拟货币
程序员宝藏库:https://github.com/Jackpopc/CS-Books-Store
循环神经网络(RNN)是最先进的时间序列算法,被苹果的Siri和谷歌的语音搜索所采用。
它是一种由其内部存储器记住其输入的算法,这使得该算法完全适合解决涉及时序的机器学习问题,这也使得它在深度学习中取得巨大的成果。
在这篇文章中,讨论了如何通过分析过去6年的信息来预测比特币的价格。我们实现了一个简单的模型,使用Python和RNN帮助我们更好地理解时间序列的工作方式。
理解比特币
比特币是一种加密货币,诞生于2009年1月。它是世界上最有价值的加密货币,在全世界40多个交易所交易,接受30多种不同的货币。
作为一种货币,比特币为价格预测提供了一个新的机会,因为它具有高波动性,与传统货币相比要高得多。
比特币系统是一组去中心化的节点,运行比特币代码并存储其区块链。
一个区块链可以被认为是一组区块的集合。在每个区块中,都有一个交易的集合。因为所有运行区块链的计算机都有相同的区块和交易列表,并且可以透明地看到这些新区块被新的比特币交易填满,所以没有人可以欺骗系统。
比特币使用点对点技术来促进即时支付,矿工负责处理区块链上的交易。
比特币的工作方式是理解它为何如此受欢迎的关键。与其他投资不同,加密货币不与实物资产或美元挂钩。它的主要目的是允许任何地方的两个人直接交换价值。这意味着,没有中心控制这个网络。没有政府,没有中央银行可以关闭或任意提高或降低价值。每当有人进行交易时,一个独特的加密签名就会被添加到账本上进行验证。
实现
循环神经网络
循环神经网络是一种稳健而强大的神经网络类型,被认为是最专业的算法之一,因为它们是唯一具有内部存储器的神经网络。
循环神经网络最早创建于20世纪80年代,但只有在最近几年才真正发挥它的潜力。
计算能力的提高,加上我们现在有的巨量数据,以及20世纪90年代短时记忆(LSTM)的发明,使RNN真正进入人们的视野。
该算法对于时间序列、语音、文本、金融数据、音频、视频、天气等时序问题表现非常好。与其他算法相比,RNN能够对一个序列及其上下文有更深入的理解。
在RNN中,信息会经过一个循环。当做出决定时,它考虑到当前的输入,也考虑到它从之前收到的输入中所学到的东西。
下面的图片说明了RNN算法中的信息流是如何工作的。
LSTM
长短期记忆网络是递归神经网络的延伸,它RNN基础上扩展了记忆。因此,它很适合从中间有很长时间滞后的重要经验中学习。
LSTM使RNN能够记住很长一段时间内输入,这是因为LSTM把信息存储到内存中,很像计算机的内存。LSTM可以从其内存中读取、写入和删除信息。
在一个LSTM中,你有三个门:输入门、遗忘门和输出门。这些门决定是否让新的输入进入(输入门),删除不重要信息(遗忘门),或让它影响当前时间步长的输出(输出门)。下面是一个有三个门的RNN的图示。
LSTM中的门是模拟的sigmoids形式,意味着它们的范围从0到1。它们是模拟的这一事实使它们能够进行反向传播。
获取实时加密货币数据(比特币)
本文使用到的数据是从雅虎财经上获取到的:
import numpy as npimport matplotlib.pyplot as pltimport pandas as pdfrom sklearn.preprocessing import MinMaxScalerdata = pd.read_csv('BTC-USD.csv', date_parser = True)data.tail()
data_training = data[data['Date']< '2020-01-01'].copy()data_training
data_test = data[data['Date']< '2020-01-01'].copy()data_test
training_data = data_training.drop(['Date', 'Adj Close'], axis = 1) training_data.head()
归一化
我们对数据采取的第一个步骤是对其数值进行标准化。归一化的目的是将数据集中的数字列的值改为一个共同的尺度,而不扭曲数值范围的差异。
MinMaxScaler is used to normalize the datascaler = MinMaxScaler()training_data = scaler.fit_transform(training_data)training_data
X_train = [] Y_train = []for i in range(60, training_data.shape[0]): X_train.append(training_data[i-60:i]) Y_train.append(training_data[i,0])X_train, Y_train = np.array(X_train), np.array(Y_train)X_train.shape
使用LSTM神经网络(深度学习)预测加密货币的价格
下面到了建立模型的阶段,找到正确的模型是一门艺术,需要多次调整和尝试,才能为每个模型找到正确的层和超参数。
对于这种类型的问题,模型的建立是相当简单和标准的。
训练这个模型是即使没有GPU也能做到的,数据量非常小,网络结构也非常简单。当涉及到有更多细化信息的更高级的模型时,它可能需要几个小时或几天的时间来训练。
from tensorflow.keras import Sequentialfrom tensorflow.keras.layers import Dense, LSTM, Dropoutmodel = Sequential() model.add(LSTM(units = 50, activation = 'relu', return_sequences = True, input_shape = (X_train.shape[1], 5)))model.add(Dropout(0.2)) model.add(LSTM(units = 60, activation = 'relu', return_sequences = True))model.add(Dropout(0.3)) model.add(LSTM(units = 80, activation = 'relu', return_sequences = True))model.add(Dropout(0.4)) model.add(LSTM(units = 120, activation = 'relu'))model.add(Dropout(0.5)) model.add(Dense(units =1))model.summary()
model.compile(optimizer = 'adam', loss = 'mean_squared_error')history= model.fit(X_train, Y_train, epochs = 20, batch_size =50, validation_split=0.1
loss = history.history['loss']val_loss = history.history['val_loss']epochs = range(len(loss))plt.figure()plt.plot(epochs, loss, 'b', label='Training loss')plt.plot(epochs, val_loss, 'r', label='Validation loss')plt.title("Training and Validation Loss")plt.legend()plt.show()
验证
part_60_days = data_training.tail(60)df= part_60_days.append(data_test, ignore_index = True)df = df.drop(['Date', 'Adj Close'], axis = 1)df.head()
inputs = scaler.transform(df) inputs
X_test = []Y_test = []for i in range (60, inputs.shape[0]): X_test.append(inputs[i-60:i]) Y_test.append(inputs[i, 0]) X_test, Y_test = np.array(X_test), np.array(Y_test) X_test.shape, Y_test.shape Y_pred = regressor.predict(X_test) Y_pred, Y_test scaler.scale_
scale = 1/5.18164146e-05Y_test = Y_test*scale Y_pred = Y_pred*scaleY_pred
Y_test
plt.figure(figsize=(14,5))plt.plot(Y_test, color = 'red', label = 'Real Bitcoin Price')plt.plot(Y_pred, color = 'green', label = 'Predicted Bitcoin Price')plt.title('Bitcoin Price Prediction using RNN-LSTM')plt.xlabel('Time')plt.ylabel('Price')plt.legend()plt.show()
结语
RNN和LSTM是优秀的技术,有很好的架构,可以用来分析和预测时间序列信息。这篇文章的重点是实现一个简单的模型,如果你对这个主题感兴趣,可以尝试不同的东西。