• 对流媒体传输关键指标作简单预测


    本文目录:

    现收集有流媒体传输过程中的6个指标,这些指标分别是:

    • PDCCH信道CCE可用个数 AvaPdcch
    • PDCCH信道CCE占用个数 OccPdcch
    • RRC连接最大数 ConRrc
    • 上行PRB平均利用率 UpPrb
    • 下行PRB平均利用率 DownPrb
    • 有效RRC连接最大数 EffConRrc

    1.数据情况

    每个指标的数据格式为:Data-Time-Value,本文首先对数据进行预处理,然后使用LSTM对这6个指标作简单预测。

    1. import pandas as pd 
    2. import numpy as np 
    3.  
    4. filenames=['AvaPdcch','OccPdcch','ConRrc','UpPrb','DownPrb','EffConRrc'] #属性列表 
    5.  
    6. #读取数据 
    7. dataset=[] 
    8. for filename in filenames: 
    9. df=pd.read_csv(filename+'.csv',delimiter=',') 
    10. partfea=np.array(df)[:,-1] 
    11. dataset.append(partfea) 
    12.  
    13. dataset=np.array(dataset) 
    14. dataset=dataset.T 
    15.  
    16. print(dataset.shape,dataset[1302]) 

    输出:

    (1378, 6) [nan nan 18.0 nan nan 8.0]

    从这输出可以看出,数据量就是1378个,每个数据量是前文的6个指标。并且数据中包含缺失值,为了简单,这里使用均值进行填充,实际上还可以更加灵活处理缺失值,比如整行/列去掉,进行插值等。

    2.数据预处理

    • 缺失值填充
    1. from sklearn import preprocessing 
    2.  
    3. impute = preprocessing.Imputer() 
    4. dataset = impute.fit_transform(dataset) 
    5.  
    6. print(dataset.shape,dataset[1302]) 

    输出:

    (1378, 6) [ 7.31026325e+07 9.40476974e+06 1.80000000e+01 3.38872727e-02
    1.92543953e-01 8.00000000e+00]

    • 数据归一化
    1. from sklearn.preprocessing import MinMaxScaler 
    2.  
    3. scaler = MinMaxScaler(feature_range=(0, 1)) 
    4. dataset = scaler.fit_transform(dataset) 
    5.  
    6. print(dataset.shape,dataset[1302]) 

    输出:

    (1378, 6) [ 0.5072962 0.23767169 0.22222222 0.17733455 0.21859107 0.23809524]

    3.样本划分及标签处理

    后一个数据作为前一个数据的标签,模型最终是基于当前的数据预测下一状态数据。

    1. train_size=int(0.8*len(dataset)) 
    2. #训练集 
    3. train_X=dataset[0:train_size,:] 
    4. train_y=dataset[1:train_size+1,:] 
    5. #验证集 
    6. vali_X=dataset[train_size:,:] 
    7. vali_y=dataset[train_size+1:,:] 
    8.  
    9. train_X=train_X.reshape(train_X.shape[0],1,train_X.shape[1]) 
    10. vali_X=vali_X.reshape(vali_X.shape[0],1,vali_X.shape[1]) 
    11.  
    12. print(train_X.shape,train_y.shape,vali_X.shape,vali_y.shape) 

    输出:

    (1102, 1, 6) (1102, 6) (276, 1, 6) (275, 6)

    4.模型训练

    1. import keras 
    2. from keras.models import Sequential 
    3. from keras.layers import Dense 
    4. from keras.layers import LSTM 
    5. from keras.utils import plot_model 
    6. from IPython.display import SVG 
    7.  
    8. from keras.utils.vis_utils import model_to_dot 
    9.  
    10. #构建LSTM网络 
    11. model=Sequential() 
    12. model.add(LSTM(32,input_shape=(1,6))) 
    13. model.add(Dense(6)) 
    14.  
    15. #编译模型 
    16. model.compile(loss='mean_squared_error', optimizer='adam') 
    17.  
    18. #打印模型 
    19. model.summary() 
    20.  
    21. #保存模型 
    22. SVG(model_to_dot(model,show_shapes=True).create(prog='dot', format='svg')) 
    23.  
    24. #训练LSTM网络 
    25. model.fit(train_X, train_y, epochs=10, batch_size=1, verbose=1) 

    5.模型评估

    1. #预测数据 
    2. valipredict=model.predict(vali_X) 
    3. print(valipredict.shape,vali_y.shape) 
    1. #画图模型预测显示 
    2. finalypredict=[] 
    3. #归一化后的数据画图,有6列 
    4. plt.subplots(2,3,figsize=(18,6))  
    5. for ind in range(6): 
    6. #归一化数据转换为真实数据 
    7. valipredict_real=valipredict[:,ind]*(scaler.data_max_[ind]-scaler.data_min_[ind])+scaler.data_min_[ind] 
    8. vali_y_real=vali_y[:,ind]*(scaler.data_max_[ind]-scaler.data_min_[ind])+scaler.data_min_[ind] 
    9.  
    10. #未来的6个真实值 
    11. finalypredict.append(valipredict_real[-1]) 
    12.  
    13. plt.subplot(2, 3,ind+1) 
    14. plt.title(filenames[ind])  
    15. plt.plot(valipredict_real,color='red',label='valipredict') 
    16. plt.plot(vali_y_real,color='green',label='vali_y') 
    17.  
    18. plt.show() 

    模型在验证数据上的预测效果
    模型在验证数据上的预测效果

    由图可以看出,6个指标基本的趋势被正确预测,但是某个时刻的准确度不是很高,我认为原因有几个:

    1. 数据量太少,导致模型无法学习足够的特征
    2. 特征太简单,某个指标的预测仅仅依赖于包括自身在内的历史时刻的6个值,这明显不够,可以考虑加入更多特征。比如这几个值明显对”时间“敏感,不同的时间区间内,流媒体的传输需要不同,将时间考虑进去将使得模型学习到更加丰富的特征
    3. 模型太简单,在数据量少,特征不多的情况下,我只用了一层的LSTM。

    6.预测未来下一个6个指标

    将数据中的最后的6个指标输入已经训练好的模型,模型输出6个值,该6个值作为模型预测到的未来下一个6个指标值。

    1. #前文已经存储,直接输出 
    2. print(finalypredict) 

    [93690488.0, 25693568.0, 40.356155, 0.088783175, 0.64066094, 17.614025]

  • 相关阅读:
    【转】 Linux进程间通信
    Django中的Templates
    Django中的应用
    url的使用
    Django框架的使用
    Django的安装
    文件上传
    flask中的request和response
    模板
    静态文件处理
  • 原文地址:https://www.cnblogs.com/wushaogui/p/10637277.html
Copyright © 2020-2023  润新知