c++svd算法_2020DCIC智能算法赛智慧海洋建设TOP1方案

2023-10-31

大家好,我是来自团队Pursuing the Past Youth的Ethan,天池ID是GrandRookie。和队友青禹小生、wbbhcb、Chauncy YAO经过2个多月的“征途”,最终在本届智能算法赛部分拿到了线上Top1的成绩。下面给出我们团队的完整解决方案。 赛题介绍 首先简单介绍下赛题,区别于之前做过的很多比赛主要偏向互联网的业务场景,本届比赛的选题则是围绕“智慧海洋建设,赋能海上安全治理能力现代化”。要求选手通过分析渔船北斗设备位置数据,具体判断出是拖网作业围网作业还是流刺网作业。 总结一下就是“轨迹(序列数据)+多分类”的任务,评估指标选用的是F1值,比较常规,就不多做介绍了。 数据探

我们团队习惯于从业务的角度出发去构造特征,但因为不具备海洋专业知识,比赛前期我们花了些时间查找了相关资料

2.1 渔船作业方式的定义

  • 拖网:拖曳渔具在海底或海水中前进,对鱼类进行捕捞的作业方式。

c1ff8e4ee4edc405bfe5aeb67d21f86a.png

  • 围网:使用网具包围鱼群进行捕捞的作业方式。

93e3abd7628b1138ec044a96118ac487.png

  • 刺网:将长带形的网列敷设于水域中,使鱼刺入网目或被网衣缠络后加以捕捞。

cf6e9d7cbcdc77c02e23e35e45cb266b.png

2.2 渔船作业过程中的三种状态

Anchored-off:船舶休息的点 Turning:船舶转弯的点 Straight-sailing:船舶航行的点

2d26dac65411f8ef64d07f286e8fd6f0.png

Kai Sheng, Zhong Liu, Dechao Zhou, Ailin He and Chengxu Feng(College of Electronic Engineering, Naval University of Engineering, Wuhan, Hubei,China). Research on Ship Classification Basedon Trajectory Features. THE JOURNAL OF NAVIGATION, Page 1 of 17. doi:10.1017/S0373463317000546

4210409fcb954c97e68e3b97f8c29cfe.png 特征工程

基于以上查找的两部分资料,我们就找到了构造本题特征工程的两个切入点:

1. 表征渔船的轨迹 2. 表征渔船不同状态下的信息

3.1 如何表征轨迹序列?

3.1.1 传统经纬度统计特征

常规的做法就是对渔船的经纬度序列做均值、方差、分位数、众数等统计,可以简单地刻画渔船的活动范围

mode_df = data.groupby(['渔船ID', 'lat', 'lon'])['time'].agg({'mode_cnt':'count'}).reset_index()mode_df['rank'] = mode_df.groupby('渔船ID')['mode_cnt'].rank(method='first', ascending=False)for i in range(1, 4):    tmp_df = mode_df[mode_df['rank']==i]    del tmp_df['rank']    tmp_df.columns = ['渔船ID', 'rank{}_mode_lat'.format(i), 'rank{}_mode_lon'.format(i), 'rank{}_mode_cnt'.format(i)]    data_ = data_.merge(tmp_df, on=['渔船ID'], how='left')
3.1.2 基于轨迹序列绝对和相对位置的复合向量编码

经纬度常规的统计特征对渔船轨迹信息的表征能力其实是有限的,这里我们设计了一种轨迹序列的编码方式(该方法可拓展至其他类型的轨迹序列数据),进一步刻画了轨迹的动态信息和渔船经过的每个点之间的联系。

55f958e5aaf4adcdd83e11c97d6e759c.png 输入层

渔船的轨迹序列

数据处理层1. Geohash7编码:Geohash其实是将地图拆分成了一个个矩形网格,当经纬度落入到某个网格内时,则使用网格的编码代替经纬度,相当于是一种聚类方式。这里我们不直接使用经纬度(细粒度)的好处就是可以提高特征的泛化能力。

8b915dd70c569dbb40cf2cb2d4845c1c.png

除此之外,我们还采用了全集下采样两种提取方式来提取Geohash7编码后的轨迹序列。下采样的好处是缓解渔船位置信息频繁上报而产生的噪音。

2. 梯度编码:轨迹序列的梯度是指的后一个位置相对于前一个位置的变化,目的是为了获取相对位置信息   

特征编码层

1. Word2Vec:将渔船的轨迹序列当成文本,每个地点则是一个“词语”,使用Word2Vec进行向量表征。
def w2v_feat(df, group_id, feat, length):    print('start word2vec ...')    data_frame = df.groupby(group_id)[feat].agg(list).reset_index()    model = Word2Vec(data_frame[feat].values, size=length, window=5, min_count=1, sg=1, hs=1,                     workers=1, iter=10, seed=1, hashfxn=hashfxn)    data_frame[feat] = data_frame[feat].apply(lambda x: pd.DataFrame([model[c] for c in x]))    for m in range(length):        data_frame['w2v_{}_mean'.format(m)] = data_frame[feat].apply(lambda x: x[m].mean())    del data_frame[feat]    return data_frame

2. Node2Vec:把渔船经过的地点当成图中的“点”,而不同地点之间的关系则是“边”,使用Node2Vec进行向量表征。

3. TFIDF&CountVec:借鉴了文本的常用处理方法,提取了渔船轨迹序列中Geohash的频次信息。

def tfidf(input_values, output_num, output_prefix, seed=1024):    tfidf_enc = TfidfVectorizer()    tfidf_vec = tfidf_enc.fit_transform(input_values)    svd_enc = TruncatedSVD(n_components=output_num, n_iter=20, random_state=seed)    svd_tmp = svd_enc.fit_transform(tfidf_vec)    svd_tmp = pd.DataFrame(svd_tmp)    svd_tmp.columns = ['{}_tfidf_{}'.format(output_prefix, i) for i in range(output_num)]    return svd_tmp

输出层

轨迹序列Embedding向量

3.2 如何刻画渔船不同运行状态?

3.2.1 Anchored-off状态特征

这里粗略的认为当渔船的速度为0时,渔船处于停靠或是收网的状态。统计该状态下渔船所处的位置,可以让模型捕捉到不同作业方式下渔船停靠点或收网点的规律。

group_df = data[data['速度']==0].groupby(['渔船ID'])[col].agg(    {'锚点_'+col+'_mean': 'mean',     '锚点_'+col+'_max': 'max',     '锚点_'+col+'_min': 'min',     '锚点_'+col+'_nuniq': 'nunique',     '锚点_'+col+'_q1': lambda x: np.quantile(x, 0.10),     '锚点_'+col+'_q2': lambda x: np.quantile(x, 0.20),     '锚点_'+col+'_q3': lambda x: np.quantile(x, 0.30),     '锚点_'+col+'_q4': lambda x: np.quantile(x, 0.40),     '锚点_'+col+'_q5': lambda x: np.quantile(x, 0.50),     '锚点_'+col+'_q6': lambda x: np.quantile(x, 0.60),     '锚点_'+col+'_q7': lambda x: np.quantile(x, 0.70),     '锚点_'+col+'_q8': lambda x: np.quantile(x, 0.80),     '锚点_'+col+'_q9': lambda x: np.quantile(x, 0.90)}    ).reset_index()
3.2.2 Turning状态特征

将数值型的方向特征进行离散化处理后,统计渔船作业过程中不同方向的频次及比例。

data['方向'] = data['方向'].apply(lambda x:(int(round(x/30)))*30)degree_df = data.pivot_table(index='渔船ID',columns='方向',values='lat', dropna=False, aggfunc='count').fillna(0)degree_df.columns = [str(f)+'_方向_count' for f in degree_df.columns]degree_df.reset_index(inplace=True)
3.3.3 Straight-sailing状态特征

渔船的历史数据中存在大量的速度为0的记录,会对速度进行均值、方差等统计产生较大的影响。我们单独取速度大于0时的样本,再对速度构造统计特征,一方面去除速度为0的影响、另一方面刻画了渔船航行时的状态。

group_df = data[data['速度']>0].groupby(['渔船ID'])['速度'].agg({    '速度_mean_new': 'mean',    '速度_q10_new': lambda x: np.quantile(x, 0.10),    '速度_q20_new': lambda x: np.quantile(x, 0.20),    '速度_q30_new': lambda x: np.quantile(x, 0.30),    '速度_q40_new': lambda x: np.quantile(x, 0.40),    '速度_q50_new': lambda x: np.quantile(x, 0.50),    '速度_q60_new': lambda x: np.quantile(x, 0.60),    '速度_q70_new': lambda x: np.quantile(x, 0.70),    '速度_q80_new': lambda x: np.quantile(x, 0.80),    '速度_q90_new': lambda x: np.quantile(x, 0.90),}).reset_index()
4210409fcb954c97e68e3b97f8c29cfe.png 模型策略

LightGBM Is All You Need!

本次比赛我们的最优模型仍然是熟悉的LightGBM模型,单模型线上F1值是0.9026,模型融合后可以达到0.9040,这两个成绩均能取得Top1的成绩。

遗憾的是我们在深度学习模型方面也做了尝试,例如将轨迹转化为二维图像,利用resnet识别、取出resnet最后的FC层为特征与其他特征合并一起等,但最终都失败了。﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌ 本次方案的开源代码(感谢青禹小生和Chauncy YAO的整理),欢迎大家star, 谢谢! e85d7d28116ec835511c9c692291327b.gif github地址: 青禹小生:https://github.com/juzstu/TianChi_HaiYang/Chauncy YAO:https://github.com/ycd2016/DCIC2020-IOC 更多精彩内容(请点击图片进行阅读) 5a98364dd6f7128d5709f9dd04a37bd5.png 141ff1c9dbb450c34e5f304800409c41.png 7b909d948c01cc82b0f5661a01d21e52.png 公众号: AI蜗牛车 保持谦逊、保持自律、保持进步

7bfca6b7a2b4b84cd90d6e745d100409.png

个人微信 备注: 昵称+学校/公司+方向 如果没有备注不拉群! 拉你进AI蜗牛车交流群

f59d3de572c834a36a903b674046d247.png

点个在看,么么哒!

61511a80f811e6cdaf7d531dd1103320.gif
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++svd算法_2020DCIC智能算法赛智慧海洋建设TOP1方案 的相关文章

  • 【cocos creator 3.x】精灵图片不显示

    精灵图片不显示 现象 原因 解决方案 现象 在cocos creator 3 2版本的使用中遇到了精灵图片无法展示的几个场景 在prefab某个node下Sprite的图片无法显示 动态加载prefab时 某些节点的图片无法显示 原因 图片
  • JAVA关键字详解

    JAVA关键字详解 1 final数据 1 gt 对于基本类型前加以final修饰 表示被修饰的变量为常数 不可以修改 一个既是static有是final的字段表示只占据一段不能改变的存储空间 2 gt final用于对象应用时 final
  • tp5 数组进行分页

    首页引入文件 use think paginator driver Bootstrap
  • ES Aggs count distinct group by聚合排序查询

    ES Aggs count distinct group by聚合排序查询 1 kibana query hits限制了10000条 添加 track total hits true query 2 查询返回特定字段 source incl
  • string类的模拟实现

    namespace swx string需要考虑完善的增删查改 class string public typedef char iterator typedef const char const iterator const iterat
  • git 生成ssh key操作

    1 在终端输入 ssh keygen t rsa C taoxx 注 username为你git上的用户名 如果执行成功 返回 Generating public private rsa key pair Enter file in whi
  • 【java】【SSM框架系列】【五】【完】MyBatisPlus

    目录 一 MyBatisPlus简介 1 1 入门案例 1 2 MyBatisPlus概述 二 标准数据层开发 2 1 标准数据层CRUD功能 2 1 1 标准数据层CRUD功能 2 1 2 lombok 2 2 分页功能 2 3 开启My
  • 老曹眼中的CRM 图解

    CRM 是企业 以客户为中心 价值观的核心体现之一 各种2B的应用都无可避免 而企业应用具有一定的复杂性 理解CRM系统也不是轻而易举的事情 在老码农的眼中 CRM 系统可能是这样的 业务组成 业务单元的组成是第一位 业务单元是企业的实在需
  • 1496. Path Crossing

    typedef pair
  • 【OpenGL】OpenGL入门之纹理(Texture)

    目录 纹理 纹理环绕方式 纹理过滤 多级渐远纹理 Mipmap 加载与创建纹理 stb image h 生成纹理 应用纹理 纹理单元 参考 纹理 在此之前 我们已经可以为每个顶点添加颜色来增加图形的细节 从而创建出有趣的图像 但是 如果想让
  • 基于uiautomator的android脚本录制记录

    最近有个项目大概需求是 根据服务端发送的指令 去执行一些特定的操作采集数据后并上传给服务器 前后搞了10来天 总算是搞出来了 现在记录下 省的以后忘记 给以后有类似需求的小伙伴多点资料 有啥问题可以联系我QQ 442947949 带上备注
  • 函数的返回值-接收返回元组函数的方式

    def measure 测量温度和湿度 print 测量开始 temp 39 wetness 50 print 测量结束 元组 可以包含多个数据 因此可以使用元组让函数一次返回多个值 如果函数返回的类型是元组 小括号可以省略 return
  • 在QMap中嵌套QList

    刚接触QT的QMap比较困惑 看这名字以为是二维数组 因为我把QList当作一维数组来用了 事实上也确实可以 但只当一维数组太浪费了 可参考别的资料 cpp view plain copy QMap
  • 面试时,发现公司有这8个现象,建议你慎重考虑

    爱开发 陪伴你一起成长 快年底 相信有不少朋友有跳槽的念头 今天我们来聊一聊面试的一些话题 面试时 我们有机会对公司的情况做一下了解 比如和面试官交流 我们大致能了解到公司的一些基本情况 这些情况比我们在去面试前更为准确 程序员面试时 发现
  • Spark RDD之Key-Value类型操作详解

    partitionBy案例 1 作用 对pairRDD进行分区操作 如果原有的partionRDD和现有的partionRDD是一致的话就不进行分区 否则会生成ShuffleRDD 即会产生shuffle过程 2 需求 创建一个4个分区的R
  • 了解链接是什么?

    链接是将各种代码和数据片段收集并且组合成为一个单一文件的过程 这个文件可以被加载到内存并且执行 链接可以执行于编译时 也就是在程序被加载器加载到内存并且执行 甚至在执行于运行的时候 也就是由应用程序来执行 在早期的计算机系统中 链接是手动执
  • OrCAD中DRC的使用简要说明

    OrCAD中DRC的使用简要说明 1 DRC的使用 Scope entire 检查所有设计 selection 检查选中部分 Mode 理解Mode需要先理解instance 实例 和occurrences 事件 这是OrCAD中非常重要的
  • 单元测试框架(JUnit和Unittest)

    单元测试就是针对最小功能单元编写测试代码 1 JUnit Unit 是一个 Java编程语言的单元测试框架 java程序最小的功能是方法 单元测试就是针对java方法的测试 测试单元中的每个方法必须可以独立测试 方法间不能有任何依赖 1 1
  • 浅谈多路复用select、epoll

    一 多路复用技术 在理解多路复用之前了解一下IO阻塞 IO非阻塞有利于理解IO多路复用 可以想象成父进程为董事长 其雇佣秘书 内核 帮助你监听读写缓冲区 常见的有select poll epoll 这里只谈一下select和epoll po

随机推荐

  • 【持续更新中】Unity常见问题及其解决

    目录 导出游戏时需要选择空的文件夹 CS0103错误 使用的变量名或者方法名并不存在于当前上下文中 CS1061错误 尝试调用方法或访问不存在的类成员 Unity怎么点都没反应 可能是进入了死循环 CS0428错误 类型转换错误 CS165
  • 编写自己的springboot starter

    一 编写自己的springboot starter 可能已经过时了 仅建议参考 引入对应的依赖 编写实现类 编写配置文件读取类 主要注解是 ConfigruationProperties 配置的值例如 example a 编写自动装配类 编
  • 《Deep Residual Learning for Image Recognition》论文学习

    Deep Residual Learning for Image Recognition 文章地址 Deep Residual Learning for Image Recognition arXiv 1512 03385 ResNet G
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 利用SpringBoot简单快速搭建WEB项目入门

    我们在WEB应用开发过程中 我们常常用到的语言是JAVA语言 作为WEB应用中的霸主级别中 的存在 却常常被嘲讽 人生苦短 我用python 是python程序员们引以为傲的格言 人们经常 将JAVA与时代新宠Python作比较 至今网上还
  • 用Python每天自动给女朋友免费发短信,谁说程序员不懂浪漫?

    前言 之前发过一篇文章 用 Python 制作的给父母天气预报提醒的小工具天气变冷了 给父母制作一个天气提醒小助手 这篇文章我同步到博客上之后 有读者在评论区留言 对于部分微信没有网页版接口 导致无法实现这个功能 这位读者建议 建议用发短信
  • Linux自动删除tomcat日志文件

    查看Linux启动的所有crontab crontab l 编辑crontab crontab e bin sh export LANG zh CN export WEB HOME webhome find dir path dir pru
  • 【渗透测试】Struts2系列漏洞

    目录 S2 001 1 漏洞原理 2 影响版本 3 验证方法 S2 005 1 漏洞原理 2 影响版本 3 验证方法 无回显 4 验证方法 有回显 S2 007 1 漏洞原理 2 影响版本 3 漏洞验证 S2 008 1 漏洞原理 2 影响
  • k8s 探针

    1 前言 Kubernetes探针 Probe 是用于检查容器运行状况的一种机制 探针可以检查容器是否正在运行 容器是否能够正常响应请求 以及容器内部的应用程序是否正常运行等 在Kubernetes中 探针可以用于确定容器的健康状态 如果容
  • CSDN账号等级提升规则

    2023最新 大家登录CSDN主要有两种需求 一是获取资源 另一种是发放资源 CSDN大约从2022年开始 不断调整等级规则 CSDN账号达到4级才能有资格上传付费资源 我搜索发现CSDN账号可能因实名的原因 没有买卖的 本文主要介绍3个内
  • 使用uni.share在IOS上分享不显示图片的问题

    问题背景 使用uni app跨平台 编译运行到ios上 发现分享图文的时候 图片无法显示 在安卓上分享正常 uni分享朋友圈api地址 uni share provider weixin scene WXSenceTimeline type
  • 寻找凸包

    问题 点集 Q 的凸包 convex hull 是一个最小的凸多边形 P Q 中的每个点或在 P 的边界上或 在 P 的内部 我们用 CH Q 表示点集 Q 的凸包 问题定义 输入 平面上的点集 Q 输出 Q 的凸包 CH Q a 请给出一
  • CreateEvent人工重置事件对象

    include
  • 基于springboot的在线考试系统

    本系统和现在有的考试系统有以下几种优势 a 和现在有的系统比较起来 本系统有科目 章节 老师 学生 班级等信息的管理 还有批阅试卷查看已批阅试卷等 传统的考试系统划分并不细 业务功能简单 b 和学校的考试系统还有外面的考试系统比较起来 本系
  • 【配置文档】配置使用CGAL库的经验分享

    诸多经验贴都建议参考CGAL官方网站的步骤一步一步配置 因为我懒得看英文所以找的都是中文博客和问答 结果走了不少弯路 这里开一篇经验贴 记录错误也方便以后的查阅 本文是基于VS2017的配置和使用 这里是CGAL的使用手册 文章目录 一 需
  • Python案例篇2-pycharm import cx_Oracle模块引发的No module named ‘custom_exceptions‘

    一 问题描述 最近在自学python 然后用到Oracle数据库 于是开始学习cx Oracle模块 代码 import cx Oracle dbConnect host cx Oracle makedsn mylocalhost mypo
  • Linux防火墙查看及白名单添加

    一 临时白名单添加 执行即生效 重启防火墙后失效 查看防火墙状态 service iptables status 查看白名单列表 sudo iptables nL 添加白名单 sudo iptables I INPUT m state st
  • Spring AOP 源码分析 - 拦截器链的执行过程

    1 简介 本篇文章是 AOP 源码分析系列文章的最后一篇文章 在前面的两篇文章中 我分别介绍了 Spring AOP 是如何为目标 bean 筛选合适的通知器 以及如何创建代理对象的过程 现在我们的得到了 bean 的代理对象 且通知也以合
  • java:无法从静态上下文中引用非静态方法

    编辑以下代码 public class t public int i public void fun public static void main String args i 3 fun 编译 javac t java 得到以下报错 原因
  • c++svd算法_2020DCIC智能算法赛智慧海洋建设TOP1方案

    大家好 我是来自团队Pursuing the Past Youth的Ethan 天池ID是GrandRookie 和队友青禹小生 wbbhcb Chauncy YAO经过2个多月的 征途 最终在本届智能算法赛部分拿到了线上Top1的成绩 下