原文链接本题是国际航线客运预测的问题。该数据为1949年1月至1960年12月国际航空公司每月旅客人数(单位:千人),共12年144个月的数据。链接:https://pan.baidu.com/s/1JJTe...提取码:6666数据趋势:训练程序:importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimporttorchfromtorchimportnnfromtorch。autogradimportVariable#LSTM(LongShort-TermMemory)是长短期记忆网络data_csv=pd.read_csv('C:/Users/DZF/Desktop/LSTM/data.csv',usecols=[1])#pandas.read_csv可以读取CSV(逗号分隔)文件,文本类型文件文本,日志类型到DataFrame#原来两列,时间和乘客人数,usecols=1:只取一列乘客人数plt。plot(data_csv)plt.show()#数据预处理data_csv=data_csv.dropna()#取出na数据dataset=data_csv.values#Dictionary(字典)values():返回字典中所有的值。dataset=dataset.astype('float32')#astype(type):实现变量类型转换max_value=np.max(dataset)min_value=np.min(dataset)scalar=max_value-min_valuedataset=list(map(lambdax:x/scalar,dataset))#标准化0到1之间的数据#lambda:定义一个匿名函数,区别于def#map(f(x),Itera):map()接收函数f和一个列表,并把函数f依次作用于列表的每个元素,得到一个新的对象并返回'''然后我们创建一个数据集,我们要通过前几个月的流量来预测当月的流量,比如我们希望通过前两个月的流量来预测当月的流量,我们可以将前两个月的流量作为输入,当月的流量作为输出。同时,我们需要将我们的数据集分为训练集和测试集,通过测试集的效果来测试模型的性能。这里我们简单的用前几年的数据作为训练集,后面两年的数据作为测试集。'''defcreate_dataset(dataset,look_back=2):#look_back将前面的时间步作为输入变量,预测下一个时间段dataX,dataY=[],[]foriinrange(len(dataset)-look_back):a=dataset[i:(i+look_back)]#i和i+1赋值dataX.append(a)dataY.append(dataset[i+look_back])#i+2赋值返回np.array(dataX),np.array(dataY)#np.array构造数组data_X,data_Y=create_dataset(dataset)#data_X:2*142data_Y:1*142#划分训练集和测试集,70%作为训练集train_size=int(len(data_X)*0.7)test_size=len(data_X)-train_sizetrain_X=data_X[:train_size]train_Y=data_Y[:train_size]test_X=data_X[train_size:]test_Y=data_Y[train_size:]train_X=train_X.reshape(-1,1,2)#reshape中-1使元素变成一行,然后输出为1列,每列有2个子元素train_Y=train_Y.reshape(-1,1,1)#输出为1列,每列是1个子元素test_X=test_X.reshape(-1,1,2)train_x=torch.from_numpy(train_X)#torch.from_numpy():numpy中的ndarray转化为pytorch中的tensortrain_y=torch.from_numpy(train_Y)test_x=torch.from_numpy(test_X)#定义模型输入维度input_size为2,因为使用2个月的流量作为输入,隐藏层维度hidden_??size可以任意指定,这里是4classlstm_reg(nn.Module):def__init__(self,input_size,hidden_??size,output_size=1,num_layers=2):super(lstm_reg,self).__init__()#super()函数是用来调用父类(超类)的一个方法,直接用类名调用父类self.rnn=nn.LSTM(input_size,hidden_??size,num_layers)#LSTM网络self.reg=nn.Linear(hidden_??size,output_size)#Linear函数继承自nn.Moduledefforward(self,x):#定义模型类的前向函数x,_=self.rnn(x)s,b,h=x.shape#Dimensions矩阵从外到内#view()函数的作用和reshape类似,用来转换大小x=x.view(s*b,h)#输出变成(s*b)*htwo-dimensionalx=self.reg(x)x=x.view(s,b,-1)#由外向内卷积输出的维度为s,b,a列returnxnet=lstm_reg(2,4)#input_size=2,hidden_??size=4criterion=nn.MSELoss()#损失函数均方eerroroptimizer=torch.optim.Adam(net.parameters(),lr=1e-2)#构造一个优化器对象Optimizer,用于保存当前状态,可以根据计算得到梯度来更新参数#Adamalgorithm:params(iterable):可用于迭代优化的参数或定义参数组的dictslr:learningrateforeinrange(10000):var_x=Variable(train_x)#converttoVariable(variable)var_y=变量le(train_y)out=net(var_x)loss=criterion(out,var_y)optimizer.zero_grad()#设置梯度为零,即将loss相对于权重的导数改为0loss.backward()#calculateloss之后,需要返回loss。这是仅在训练期间发生的操作。测试时只有前向过程optimizer.step()#returnloss过程中会计算梯度,然后optimizer.step()会根据这些梯度更新参数if(e+1)%100==0:print('Epoch:{},Loss:{:.5f}'.format(e+1,loss.data[0]))torch.save(net.state_dict(),'net_params.pkl')#保存训练文件net_params.pkl#state_dict是一个简单的python字典对象,建立各层与其对应参数的映射关系测试程序:importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimporttorchfromtorchimportnnfromtorch.autogradimportVariabledata_csv=pd.read_csv('C:/Users/DZF/Desktop/LSTM/data.csv',usecols=[1])#plt.plot(data_csv)#plt.show()#Data预处理data_csv=data_csv.dropna()#取出na数据dataset=data_csv.values#Dictionary(字典)values():返回字典中的所有值dataset=dataset.astype('float32')#astype(type):实际变量类型转换max_value=np.max(dataset)min_value=np.min(dataset)scalar=max_value-min_valuedataset=list(map(lambdax:x/scalar,dataset))#将数据标记准化到0~1之间defcreate_dataset(dataset,look_back=2):dataX,dataY=[],[]foriinrange(len(dataset)-look_back):a=dataset[i:(i+look_back)]dataX.append(a)dataY.append(dataset[i+look_back])返回np.array(dataX),np.array(dataY)data_X,data_Y=create_dataset(dataset)classlstm_reg(nn.Module):def__init__(self,input_size,hidden_??size,output_size=1,num_layers=2):super(lstm_reg,self).__init__()self.rnn=nn.LSTM(input_size,hidden_??size,num_layers)自我.reg=nn.Linear(hidden_??size,output_size)defforward(self,x):x,_=self.rnn(x)s,b,h=x.shapex=x.view(s*b,h)x=self.reg(x)x=x.view(s,b,-1)返回xnet=lstm_reg(2,4)net.load_state_dict(torch.load('net_params.pkl'))data_X=data_X.reshape(-1,1,2)#reshape,-1使元素变成一行,然后输出1列,每列有2个子元素data_X=torch.from_numpy(data_X)#torch.from_numpy():numpy中的ndarray转换为pytorch中的tensor(tensor)var_data=Variable(data_X)#转换为Variable(变量)pred_test=net(var_data)#产生预测结果pred_test=pred_test.view(-1).data.numpy()#view(-1)输出为一行plt.plot(pred_test,'r',label='prediction')plt.plot(dataset,'b',label='real')plt.legend(loc='best')#loc显示图像'best'表示自适应方法plt.show()预测结果:学习更多编程知识,请关注我的公众号:编码方式
