2020DCIC智慧海洋建设算法赛学习01-赛题北京及地理数据分析常用工具
序:
本系列的博客旨在学习2020DCIC智能算法赛-智慧海洋建设的优秀方案,对地理数据分析问题积累一些思路和经验。
作为这一系列博客的开篇,这篇博客主要内容包括对赛题的解析和对项目中会用到的一些常用的地理数据分析工具的简要介绍。
1 赛题背景
1.1 问题陈述
智慧海洋建设比赛是一个时序数据的分类问题,任务就是要通过给出的渔船轨迹的北斗数据判断渔船的生产作业行为。渔船的生产作业行为包括三类:拖网作业、围网作业和流刺网作业。
(1) 拖网作业
拖网作业是依靠渔船的动力拖动渔具将所经之处的鱼虾捕捞入网的一种捕捞方式,它的作业方式如下图所示:
(2) 围网作业
围网作业时渔船沿圆形的轨迹拖动网具在垂直方向上张开一个近似圆形的围壁,将围壁中的鱼群捕捞入网,它的作业方式如下图所示:
(3) 流刺网作业
流刺网作业时渔船拖动长方形网片直线拉开一张大网,等待鱼群被网缠住,它的作业方式如下图所示:
根据各种生产作业方式的特点可以发现,不同作业方式的渔船轨迹是有区别的:拖网作业将所到之处的鱼群纳入网中,它的轨迹通常是较为随意没有特定规律的;围网作业渔船要拉成一张围壁,它的轨迹通常是一个闭合的曲线;流刺网作业要张开一张网面,它的轨迹通常是直线。因此,赛题的核心任务就是分析和处理渔船的位置时序。
比赛给出的训练数据格式如下图所示:
- x:渔船在平面坐标系中的x轴坐标
- y:渔船在平面坐标系中的y轴坐标
- 速度:渔船当前的航行速度,单位节
- 方向:渔船当前的船首方向,单位度
- time:当前数据的上报时刻
- type:渔船的生产作业类型
1.2 评价指标
评价指标如下:
Score=F1拖网+F1围网+F1流刺网3Score = \frac{F1_{拖网}+F1_{围网}+F1_{流刺网}}{3} Score=3F1拖网+F1围网+F1流刺网
也就是说,评价指标是三种类型的F1得分的均值,其中F1得分计算公式如下:
F1=2×Precision×RecallPrecision+RecallF1 = \frac{2\times{Precision}\times{Recall}}{Precision+Recall} F1=Precision+Recall2×Precision×Recall
其中Precision是准确率,Recall是召回率。
2 地理数据分析常用工具
2.1 常用库
在分析地理数据的时候,常用的库如下:
- shapely:shapely库支持Point、LineString、LineRings、Polygon等几何对象以及它们之间的空间操作,使用方法可以参考它的官方文档。
- geopandas:geopandas库对pandas库进行扩展,在融合pandas数据类型的基础上提供了操作地理空间数据的高级接口,允许对几何类型进行空间操作,同时它依赖于matplotlib进行绘图,可以很方便地对地理数据进行可视化分析,可参考官方文档。
- Folium:Folium库可以生成动态交互的地图,能够在世界地图的基础上生成热力图、路径图等,并且可以随意拖动和缩放地图,方便进行地理数据的可视化,使用方法可参考官方文档。
- Kepler.gl:Kepler.gl库也是一个图形化的可视化工具,它相较于Folium使用更加遍历,可以直接读取csv、json、geojson格式的数据,生成数据的可视化图像,这个库特点在于可以无需编程,直接在界面上调节绘制出的可视化图像。
2.2 douglas-peucker算法
轨迹数据量通常是非常庞大的,在Kepler.gl中进行分析时处理速度慢且容易出现卡顿,可以采用douglas-peucker算法进行数据压缩。
douglas-peucker算法实际是一种数据采样算法,思路并不复杂。假设有一条曲线AB,设定一个阈值T,采用douglas-peucker算法对曲线AB进行采样的步骤如下:
- 连接曲线两端点A和B得到直线AB作为曲线AB的弦。
- 计算曲线上各点到弦AB的距离,得到距离最大的点C,其到弦AB的距离为d。
- 若d不超过阈值T,则可以认为弦AB就是曲线AB的近似,处理完毕。
- 若d大于阈值T,则以C为分割点,将曲线AB分为曲线AC和曲线CB,分别对这两段曲线执行步骤1~3。
- 将所有分割点连接起来,得到的折线就是对曲线AB的近似。
douglas-peucker算法可以直接通过shapely库的simplify方法实现,例如对一条折线进行压缩:
# 导入库
from shapely import geometry as geo# 由坐标点创建一个折线类型
line1 = geo.LineString([(0, 0), (1, -0.2), (2, 0.3), (3, -0.5), (5, 0.2), (7, 0)])
# 对折线line1进行数据压缩,其中simplify方法的第一个参数0.4就是设定的阈值
line1_simplify = line1.simplify(0.4, preserve_topology=False) # preserve_topology设为True时采用更慢的算法,设为False时采用更快的算法# 绘制压缩后的折线
print(line1)
print(line1_simplify)
line1_simplify
输出结果如下图所示:
2.3 异常值处理
由于海上的环境复杂,经常出现信号丢失或设备故障导致上报坐标错误、上报数据丢失、有些设备疯狂上报等问题,因此数据中会存在大量异常值,通常采用3-sigma算法来判断异常值,注意使用该算法的数据需服从正态分布。
从上图中可以看到,对于一个正态分布的数据,99.73%的数据都集中在[μ−3σ,μ+3σ][\mu-3\sigma, \mu+3\sigma][μ−3σ,μ+3σ]这一区间内,不在这一区间的可能性不超过0.3%,因此不在这一区间的数据即看作异常值。
实现代码如下:
# n=3时即为3-sigma算法
def sigma_data(data_y, n):ymean = np.mean(data_y) # 数据的均值ystd = np.std(data_y) # 数据的标准差threshold1 = ymean - n * ystd # 区间左端点mu-3*sigmathreshold2 = ymean + n * ystd # 区间右端点mu+3*sigmajudge = []for data in data_y:# 小于左端点或大于右端点的数据判断为异常值if (data < threshold1) | (data > threshold2):judge.append(True)else:judge.append(False)return judge
2.4 GeoHash算法
GeoHash算法用于对地理位置进行编码,例如对经纬度坐标(116.29513,40.04920)进行编码,GeoHash算法的步骤可分为三步:
(1) 将坐标转换为二进制
分别根据经纬度获得坐标的二进制表示。
经度的取值范围是[-180, 180],将其而分为[-180, 0]和[0, 180],坐标在右区间,记为1。再将右区间二分,将坐标所在的区间不断二分,直到达到所设定的精度。此时得到经度的二进制表示11010 01010 11001。
同理得到纬度的二进制表示10111 00011 11010。
(2) 将经纬度的二进制表示合并
二进制的偶数位放经度,奇数位放纬度,得到合并的二进制表示11100 11101 00100 01101 11110 00110。
(3) 根据Base32表进行编码
将二进制每五位转换为十进制表示,得到28 29 4 13 30 6,根据如下的Base32编码表将十进制数转换为对应的base32码。
于是最终得到的编码为wy4ey6。
GeoHash算法的实现代码如下:
def geohash_encode(latitude, longitude, precision=12):# 纬度和经度的取值区间lat_interval, lon_interval = (-90.0, 90.0), (-180.0, 180.0)# base32码base32 = '0123456789bcdefghjkmnpqrstuvwxyz'geohash = []bits = [16, 8, 4, 2, 1]# 当前二进制位bit = 0# 累计坐标二进制表示ch = 0# 判断奇偶位even = Truewhile len(geohash) < precision:# 若是偶数位,则记录经度的二进制表示if even:# 计算区间二分的中点mid = (lon_interval[0] + lon_interval[1]) / 2# 若在右侧区间,则记录为1,并重新设置经度区间if longitude > mid:ch |= bits[bit]lon_interval = (mid, lon_interval[1])else:lon_interval = (lon_interval[0], mid)# 若是奇数位,则记录纬度的二进制表示else:# 计算区间二分的中点mid = (lat_interval[0] + lat_interval[1]) / 2# 若在右侧区间,则记录为1,并重新设置纬度区间if latitude > mid:ch |= bits[bit]lat_interval = (mid, lat_interval[1])else:lat_interval = (lat_interval[0], mid)# 翻转奇偶位判断标志even = not evenif bit < 4:bit += 1# 若达到五位,则将其转换为base32码else:geohash += base32[ch]bit = 0ch = 0return ''.join(geohash)
2020DCIC智慧海洋建设算法赛学习01-赛题北京及地理数据分析常用工具相关推荐
- 2020DCIC智慧海洋建设算法赛学习02-数据分析
序: 这篇博客旨在对赛题数据做一些初步的探索,包括查看数据中的缺失值.异常值等,以及通过可视化来观察各个特征的分布情况,为之后进行特征工程提供一些思路. 1. 查看数据整体情况 对于一份数据集,首先要 ...
- 【算法竞赛学习】数字中国创新大赛智慧海洋建设-Task1地理数据分析常用工具
智慧海洋建设-Task1 地理数据分析常用工具 在地理空间数据分析中,常会用到许多地理分析的工具,在本模块中主要是针对常用的shapely.geopandas.folium.kepler.gl.geo ...
- 智慧海洋建设——Task1 地理数据分析常用工具学习心得
地理数据分析常用工具 一.shapely shapely是python中可以处理笛卡尔坐标系中几何对象(点.线.面)的一个库.其功能非常复杂,可以简化我们平时许多操作,下面来说一下我的一些学习理解. ...
- 智慧海洋建设-Task1地理数据分析常用工具
地理数据分析常用工具 安装geopandas的库时可以参考我的这篇文章<python库geopandas的安装方法>,https://blog.csdn.net/sjjsaaaa/arti ...
- 智慧海洋竞赛Task01:地理数据分析常用工具
智慧海洋竞赛Task01:地理数据分析常用工具 了解shapely和geopandas的基本功能 1. 掌握用python中的这两个库实现几何对象之间的空间操作方法 1.1 shapely库学习 ge ...
- 智慧海洋建设TOP_1方案学习笔记
文章目录 赛题 要求 数据 TOP1 解决方案 数据读取 特征工程 基本预处理 统计特征 基于轨迹序列绝对和相对位置的复合向量编码 Word2Vec 比赛来源:天池平台 智慧海洋建设 感谢大佬开源TO ...
- Datawhale 智慧海洋建设-Task1 地理数据分析常用工具
一.模块shapely,geopandas,folium,kepler.gl,geohash工具的使用 1.shapely的使用 shapely主要是做地理空间数据的分析, 库的导入 from sha ...
- 智慧海洋建设TOP方案借鉴学习与整理
文章目录 数据探索与预处理 渔船作业方式的定义 渔船作业过程中的三种状态 预处理 特征工程 统计特征 表征渔船的轨迹 POI信息 基于轨迹序列绝对和相对位置的复合向量编码 表征渔船不同状态下的信息 A ...
- Datawhale 智慧海洋建设-Task1
这是在datawhale组织里参加的一个组队学习,内容是海洋数据分析,第一章内容还未学完,后面学习完毕会及时补充整个笔记,这里说声抱歉 DataWahle Datawhale 智慧海洋建设-Task1 ...
最新文章
- 转载:薪资谈判应该避免的7个错误
- Institute for Manufacturing virtual check in part 1
- JavaSE之Java基础(1)
- shell字符串长度
- VB.NET数据库中插入数据
- 双硬盘安装ubuntu18.04踩坑及解决全过程
- 【工科数学分析】2021-10-07-工科数学分析叒复习(三)
- android horizontalscrollview 动画,Android horizontalscrollview使用教程
- 机器学习基础:概率论基础
- 《学会提问》之一——学会提出好问题
- Testin云测被评为“2018年度企业服务独角兽”
- 如何用计算机计算以2为底的对数,log以2为底3的对数计算器怎么写
- 大数据笔记--Hadoop(第五篇)
- 【python】numpy.percentile()函数
- Android camera2 同时打开两颗物理摄像头
- 破解神器Hashcat使用简介
- 汉诺塔(图文结合),超好理解
- mysql别名引号与引用问题
- 转载:为什么Linux不需要磁盘碎片整理
- JavaWeb开发了解