背景介绍

飞机在飞行过程中遇到扰动气流或者受到方向、大小不同的气流冲击导致的左右摇晃、前后颠簸、上下抛掷以及局部震颤等想象统称为颠簸。中度以上颠簸会使飞机仪表指示失常,操纵困难;特别严重时会破坏飞机结构,造成事故。飞机一旦进入颠簸区,可采用改变航向和高度等办法尽快脱离。所以提前预测颠簸发生区域,规划飞行线路避开颠簸区域对飞行安全有着重大意义。

数据说明

颠簸数据来源AMDAR飞机报数据,利用DEVG(导出垂直阵风风速)作为颠簸发生依据。

参考WMO关于颠簸强度定义标准,对数据进行标注。


其次,颠簸的发生跟温度、位势高度、垂直速度、纬向风速和经向风速有关,这些要素在AMDAR数据中缺失,所以还需要利用NCEP再分析数据获取这些要素。

数据提取过程如下:

首先,从AMDAR数据中提取DEVG值大于0的数据及其经纬度时间飞行高度等。其次,对AMDAR提取到的数据进行同化,即对AMDAR时间、经纬度、飞行高度数据进行格点化,对应到NCEP格点数据。之后,从NCEP数据中提取需要的要素值。

从AMDAR中提取数据

def read_amdar():# select DEVC values from AMDAR dataset.# AMDAR dataset# V11036 DEVC# Lat 纬度# Lon 精度# Year 年# Mon 月# Day 日# Hour 时# Min 分# Second 秒#Flight_Heigh 飞行高度root_dir = 'fjbcsv/'files = os.listdir(root_dir)for filename in sorted(files):print(filename)if os.path.isdir(os.path.join(root_dir,filename)):csvs = os.listdir(os.path.join(root_dir,filename))for each in tqdm(csvs):nn = each.split('.')[0] + '.csv'df = pd.read_csv(os.path.join(root_dir,filename,csvs[0]))temp =  df[['Year','Mon','Day','Hour','Min','Second','Lat','Lon','Flight_Heigh','V11036']] temp2 = temp[(temp['V11036']!=999999.0) & (temp['V11036']!=999998.0)]#print(temp.shape,temp2.shape)#print(temp2['V11036'].max())#print(temp2.head)#print(temp2['Flight_Heigh'].max())# 提取到的数据存储下来用作后续提取NCEP再分析数据# 数据较多且分散,不适合全部加载到内存中做一步到位提取NCEP数据temp2.to_csv(os.path.join('temp_result',nn),index=False)

从NCEP再分析数据中提取数据

NCEP是标准的格点数据,需要根据时间、等压面、经纬度格点坐标提取要素值,所以比较难的是如何把AMDAR数据中的时间、经纬度、飞行高度等要素值转变成格点坐标。

def post_process(*args):## transform time to index :time - YYYY-MM-DD:Hour## transorm flight heigh to air pressure## transform lat degrees to index## transform lon degrees to index## transform once, apply to different nc files.time,fh,lat,lon = argsDay,hour = time.split(':')hour = int(float(hour))days = getDays('2020-01-01',Day)if hour >=0 and hour < 6:t_index = days * 4 + 1if hour >= 6 and hour < 12:t_index = days * 4 + 2if hour >= 12 and hour < 18:t_index = days * 4 + 3if hour >= 18:t_index = days * 4 + 4 ######################## height indexindex = find_h(fh)if index == 0 :a = np.argmin([abs(H[index]-fh),abs(H[index+1]-fh)])elif index == len(H) - 1:a = np.argmin([abs(H[index-1]-fh),abs(H[index]-fh)])else:a = np.argmin([abs(H[index-1]-fh),abs(H[index]-fh),abs(H[index+1]-fh)])if a == 0 :index -= 1if a == 1:index = index if a == 2:index += 1h_index = index##################### lat indexlat_index = round(abs(lat-90)/180*73)#################### lon indexlon_index = round(abs(lon)/180*72)if lon > 0:lon_index = lon_indexelse:lon_index = 72 + lon_index#print(f'time index {t_index},height index {h_index},lat index {lat_index},lon index {lon_index}')return (t_index,h_index,int(lat_index),int(lon_index))def extract_data(*args):time,airP,lat,lon,ds = args temp = ds[time][airP][lat][lon]temp = temp.values#print(f'values: {temp}')return float(temp)

需要注意的是,提取到的数据中位势高度存在负值,根据实际应用场景分析,不会出现位势高度为负值的情况,所以要对这一类数据进行剔除。

模型架构

在调研大量文献资料之后,确定使用BP神经网络。依据调研的资料,颠簸模型与决定颠簸的要素是非线性的关系,常用方法是使用一个判别函数,对要素进行变换之后得到衡量颠簸类型的值。这种方法的优点是部署方便,缺点是性能很容易达到瓶颈,一个函数仅能表示一种变换,无法适配输入输出多种对应关系。这正好是神经网络的优点,能够拟合较为复杂多样的映射关系。

class Tur(nn.Module):def __init__(self,n_feature,n_hidden,n_ouput):super(Tur,self).__init__()self.fc1 = nn.Linear(n_feature,n_hidden)self.fc2 = nn.Linear(n_hidden,n_hidden)"""maybe module is too simple to converge"""self.fc3 = nn.Linear(n_hidden,n_hidden)self.fc4 = nn.Linear(n_hidden,n_hidden)self.dropout1 = nn.Dropout(p=0.2)self.out = nn.Linear(n_hidden,n_ouput)def forward(self,x):#x = F.tanh(self.fc1(x))x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))#x = F.relu(self.fc3(x))#x = F.relu(self.fc4(x))#x = self.dropout1(x)x = self.out(x)return x 

使用三层BP网络作为骨干网络,dropout方法防止过拟合。由于全连接网络比卷积网络更容易过拟合,特别是数据集中各类别的分类超平面类间间距不够大时,更容易发生过拟合想象,所以引入dropout防止过拟合是非常有必要的。

在训练模型时,SGD方法收敛速度较快,Adam方法的收敛效果较好,使用SGD时应设置较少的epochs较大的初始学习率如1e-2,或者0.05等,如果模型推理结果没有达到生产要求,在增加epochs延长训练过程时需要设置动态衰减学习率;使用Adam方法,需要注意的是设置较小的初始学习率较大的epochs可以达到更好的效果,比如1e-3,40以上的epochs等。

模型评估

使用Adam方法,训练10000个epochs,得到的结果如下:

precision    recall  f1-score   supportclass 0       0.54      0.74      0.62        50class 1       0.48      0.30      0.37        50class 2       0.56      0.50      0.53        50class 3       0.91      1.00      0.95        50accuracy                           0.64       200macro avg       0.62      0.64      0.62       200
weighted avg       0.62      0.64      0.62       200

类别0到3分别是无颠簸、轻度颠簸、重度颠簸、严重颠簸。

模型在无颠簸、严重颠簸类别上表现最好,在轻度颠簸和重度颠簸上表现较差。通过对训练数据集进行TSNE分析,发现轻度颠簸和重度颠簸数据没有清晰的分类超平面,如下图,两类数据有较多的重叠,合并为一个类别分析要比作为单独的两个类别更为合理。

部署生产环境

模型在训练和推理数据集上取得合理的结果后,就可以作为1.0版本部署到生产环境进行用户测试和版本迭代。

推荐使用Tornado,或者Django作为正式服务框架,Flask作为试验服务框架。

Tornado是一个优秀的异步架构,对于深度学习服务来说,很多任务都做不到实时推理,同步服务逻辑需要保持长链接,推理完成前任务常时等待,所以异步服务架构是一个更合理的选择。

在试验时发现模型推理时间小于1ms,使用同步服务相对异步服务要更合理,一是因为模型可以准实时推理不需要长链接,二是同步服务更容易实现。

class MainHandler(tornado.web.RequestHandler):def set_default_headers(self):# 解决跨域问题self.set_header('Access-Control-Allow-Origin', '*')self.set_header('Access-Control-Allow-Headers', 'x-requested-with')self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')def resp(self, resp_dct):# 定义返回形式,jsonresp = json.dumps(resp_dct, ensure_ascii = False)# logging.info(resp)return respdef post(self):# post方法获取模型推理需要的要素# 加载推理模型# 获取模型输出# 进行类别转换# 返回模型推理结果#files = self.request.files.get('file', None)air = self.get_argument('air', None)hgt = self.get_argument('hgt', None)omega = self.get_argument('omega', None)uwnd = self.get_argument('uwnd', None)vwnd = self.get_argument('vwnd', None)print(air,hgt,omega,uwnd,vwnd)try:net = load_turmodel()except Exception as e:logging.info(e)x = [air,hgt,omega,uwnd,vwnd]query = '\t'.join(x)x = [np.float(each) for each in x]x = np.array(x)x = (x-Turdata.min_value)/(Turdata.max_value-Turdata.min_value)x = np.expand_dims(x,0)x = torch.FloatTensor(x)outputs = net(x)_,predicted = torch.max(outputs,1)predicts = predicted.numpy()prob = F.softmax(outputs.data)prob_value = prob.max().data.numpy()flag = label_tur[predicts[0]]print(flag,prob_value)    # 记录每一次提交的测试要素值和模型推理结果,人工验证推理结果,进行类别校正# 用作后续模型2.0版本迭代# 的训练数据f = open('turdata.txt','a+')f.write(query+'\t'+str(prob_value)+'\t'+(flag))f.write('\n')self.write(self.resp({'code':0, 'prob': float(prob_value), 'flag': flag}))def options(self):# passself.set_status(204)self.finish()# self.write(self.resp({'code':0, 'msg':''}))def get(self):self.write('some get')

设计前端界面

设计一个基础的使用界面,界面上需要有提交模型推理所需要素值的输入框和显示模型推理结果的显示框。

可以根据博主的设计进行优化

模型下载链接

基于BP神经网络飞机颠簸预测相关推荐

  1. 机器学习应用篇(八)——基于BP神经网络的预测

    机器学习应用篇(八)--基于BP神经网络的预测 文章目录 机器学习应用篇(八)--基于BP神经网络的预测 一.Introduction 1 BP神经网络的优点 2 BP神经网络的缺点 二.实现过程 1 ...

  2. 机器学习之基于BP神经网络的预测

    BP神经网络具有以下优点: 1) 非线性映射能力:BP神经网络实质上实现了一个从输入到输出的映射功能,数学理论证明三层的神经网络就能够以任意精度逼近任何非线性连续函数.这使得其特别适合于求解内部机制复 ...

  3. 【智能算法】基于双隐含层BP神经网络的预测

    目录 基于双隐含层BP神经网络的预测 基于双隐含层BP神经网络的预测 %% 该代码为基于双隐含层BP神经网络的预测 clc clear%% 训练数据预测数据提取及归一化 %下载输入输出数据 load ...

  4. 【预测模型】基于BP神经网络、LSTM、GRNN实现风电功率预测附matlab代码

    1 简介 风电功率预测结果的准确性,不仅关系到风力发电厂的综合运行效率,也与区域运行成本具备直接联系,基于BP神经网络.LSTM.GRNN实现风电功率预测.​经过实例分析,证明设计的方法对风电功率的预 ...

  5. MATLAB基于BP神经网络的光伏发电太阳辐照度预测(源码链接在文末)

    光伏发电功率主要受太阳辐照度影响,所以准确预测太阳辐照度对光伏功率预测十分重要.程序采用小波分解先对辐照度数据进行分解,然后再用bp神经网络对分解的辐照度数据分别预测,再组合作为最后的预测结果. 人工 ...

  6. 【停车位预测】基于matlab BP神经网络停车位预测【含Matlab源码 765期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[停车位预测]基于matlab BP神经网络停车位预测[含Matlab源码 765期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方 ...

  7. (文章复现)5.基于BP神经网络的风电功率预测方法(MATLAB程序)

    复现文章: 基于BP神经网络的风电功率预测方法--刘立群(2021年) 摘要: 风电功率预测结果的准确性,不仅关系到风力发电厂的综合运行效率,也与区域运行成本具备直接联系,为解决传统预测方法的不足,基 ...

  8. 基于BP神经网络的电力系统短期负荷预测,简单实用

    基于BP神经网络的电力系统短期负荷预测,包含30日的负荷数据和气象特征数据,对31日负荷进行预测,同时与实际负荷进行对比,观察误差. %创建一个新的BP前向神经网络 %newff-生成一个新的BP前向 ...

  9. 基于果蝇优化的BP神经网络(预测应用) - 附代码

    基于果蝇优化的BP神经网络(预测应用) 文章目录 基于果蝇优化的BP神经网络(预测应用) 1.数据介绍 3.FOA优化BP神经网络 3.1 BP神经网络参数设置 3.2 果蝇算法应用 4.测试结果: ...

最新文章

  1. AI总监王长虎被曝离职,字节跳动AI Lab 再失一将!
  2. formdata 嵌套_角度7 FormData+文件+嵌套对象
  3. hihocoder 1343 : Stable Members【拓扑排序】
  4. Node.js web应用模块之Supervisor
  5. 《只管去做》-如何做靠谱的年度计划
  6. 二分函数lower_bound()
  7. 问题四十四:怎么用ray tracing画空间任意位置的圆环的任意片段
  8. 安卓显示视频画面的动画效果及代码
  9. ap计算机科学ab,AP微积分AB_AP科目介绍|AP考试网
  10. SpringCloud实战微服务之——Ribbon详解
  11. 设置linux服务器时间自动同步
  12. linux界面安装weblogic12c,Linux安装WebLogic12c
  13. A4. MTK开机流程
  14. UEA数据集和UCR数据集的处理
  15. java并发编程源码世界大师_求咕泡学院Java架构师第三期的完整版资料源码+视频,注(完整无解压密码)...
  16. 机器学习之---马尔可夫随机场实例
  17. Unable to find resource
  18. iPad与电脑端文件互传解决方案(基于nPlayer lite)
  19. 计算机毕业设计ssm人工智能辅修专业教学管理系统9xg0x系统+程序+源码+lw+远程部署
  20. 颅脑外伤护理查房PPT模板

热门文章

  1. 全球与中国湿式剃须刀市场深度研究分析报告
  2. 大点干!早点散----------深入剖析GFS分布式文件系统
  3. zookeeper中zoo.cfg配置文件参数解释,常用命令整理
  4. 什么是迁移学习 (Transfer Learning)?
  5. 了解OLE及ActiveX
  6. Android磁盘管理-之vold源码分析(2)
  7. HTML的导航栏的写法
  8. 花指令 用c语言,最新一批花指令
  9. 微信小程序收藏按钮五角星星图标动画效果实现
  10. mysql优化工具 MySQL Tuner