2020DCIC智慧海洋建设算法赛学习01-赛题北京及地理数据分析常用工具

2023-11-04


本系列的博客旨在学习2020DCIC智能算法赛-智慧海洋建设的优秀方案,对地理数据分析问题积累一些思路和经验。
作为这一系列博客的开篇,这篇博客主要内容包括对赛题的解析和对项目中会用到的一些常用的地理数据分析工具的简要介绍。

1 赛题背景

1.1 问题陈述

智慧海洋建设比赛是一个时序数据的分类问题,任务就是要通过给出的渔船轨迹的北斗数据判断渔船的生产作业行为。渔船的生产作业行为包括三类:拖网作业、围网作业和流刺网作业。

(1) 拖网作业

拖网作业是依靠渔船的动力拖动渔具将所经之处的鱼虾捕捞入网的一种捕捞方式,它的作业方式如下图所示:
在这里插入图片描述

(2) 围网作业

围网作业时渔船沿圆形的轨迹拖动网具在垂直方向上张开一个近似圆形的围壁,将围壁中的鱼群捕捞入网,它的作业方式如下图所示:在这里插入图片描述

(3) 流刺网作业

流刺网作业时渔船拖动长方形网片直线拉开一张大网,等待鱼群被网缠住,它的作业方式如下图所示:
在这里插入图片描述
根据各种生产作业方式的特点可以发现,不同作业方式的渔船轨迹是有区别的:拖网作业将所到之处的鱼群纳入网中,它的轨迹通常是较为随意没有特定规律的;围网作业渔船要拉成一张围壁,它的轨迹通常是一个闭合的曲线;流刺网作业要张开一张网面,它的轨迹通常是直线。因此,赛题的核心任务就是分析和处理渔船的位置时序。
比赛给出的训练数据格式如下图所示:
在这里插入图片描述

  • x:渔船在平面坐标系中的x轴坐标
  • y:渔船在平面坐标系中的y轴坐标
  • 速度:渔船当前的航行速度,单位节
  • 方向:渔船当前的船首方向,单位度
  • time:当前数据的上报时刻
  • type:渔船的生产作业类型

1.2 评价指标

评价指标如下:
S c o r e = F 1 拖 网 + F 1 围 网 + F 1 流 刺 网 3 Score = \frac{F1_{拖网}+F1_{围网}+F1_{流刺网}}{3} Score=3F1+F1+F1
也就是说,评价指标是三种类型的F1得分的均值,其中F1得分计算公式如下:
F 1 = 2 × P r e c i s i o n × R e c a l l P r e c i s i o n + R e c a l l F1 = \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进行采样的步骤如下:

  1. 连接曲线两端点A和B得到直线AB作为曲线AB的弦。
  2. 计算曲线上各点到弦AB的距离,得到距离最大的点C,其到弦AB的距离为d。
  3. 若d不超过阈值T,则可以认为弦AB就是曲线AB的近似,处理完毕。
  4. 若d大于阈值T,则以C为分割点,将曲线AB分为曲线AC和曲线CB,分别对这两段曲线执行步骤1~3。
  5. 将所有分割点连接起来,得到的折线就是对曲线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*sigma
    threshold2 = ymean + n * ystd  # 区间右端点mu+3*sigma
    judge = []
    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 = True
    while 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 even
        if bit < 4:
            bit += 1
        # 若达到五位,则将其转换为base32码
        else:
            geohash += base32[ch]
            bit = 0
            ch = 0
    return ''.join(geohash)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2020DCIC智慧海洋建设算法赛学习01-赛题北京及地理数据分析常用工具 的相关文章

  • Atlantis 【POJ - 1151】【扫描线模板讲解】

    题目链接 是第二次写这道题了 但是也加深了我对扫描线的印象了 具体什么是扫描线 我们就如是讲讲吧 扫描线就是为了方便处理有重的区间面积的方式 我们通过线段树的方式去优化它 可以做到更少的时间复杂度 对于一个二维平面 我们用一个平行于Y轴的线
  • conda遇到的问题

    在使用conda安装python时 使用conda install python 3 6 0出现以下错误 Solving environment failed CondaHTTPError HTTP 000 CONNECTION FAILE
  • cpp基础:对象和类

    1 类名首字母大写 Wakawaka 2 类接口 编写类的人提供的一个操作类成员的方法 3 通过关键字实现类成员的访问控制 4 封装 将实现细节和抽象分开被称为封装 如 h和 cpp文件分开 接口是实现封装的重要一环 5 默认访问权限pri
  • 《Linux C++项目必备》glog日志管理

    一 简介 Google Glog 是一个C 语言的应用级日志记录框架 提供了 C 风格的流操作和各种助手宏 二 下载 git clone https github com google glog git cd glog autogen sh

随机推荐

  • Matplotlib-绘制3D曲面-plot_surfaceh与plot_trisurf函数-数据结构

    Matplotlib 绘制3D曲面 plot surfaceh与plot trisurf函数 数据结构 3D平面绘制示例 plot surfaceh 网格采样点的生成函数np meshgrid 3D平面绘制示例 plot trisurf 3
  • Windows下nvm的安装与Idea内如何配置使用

    nvm node npm 区别 nvm nodejs 版本管理工具 类似于python的Miniconda 一个 nvm 可以管理很多 node 版本和 npm 版本 nodejs 是一个开源 跨平台的 JavaScript 运行时环境 n
  • 英伟达点开后显示无法连接服务器,解决win10提示“无法连接到 NVIDIA 检查您的互联网连接”的教程...

    nvidia控制面板是windows系统中自带的一个程序 我们一般会使用它来更新系统中的显卡驱动 有部分win10用户在使用这个软件的时候被系统提示 无法连接到 NVIDIA 检查您的互联网连接 但是该用户的网络是可以正常的使用的 别的软件
  • java中占位符的使用

    java中占位符的使用 SimpleDateFormat simple new SimpleDateFormat yyyy年MM月dd日 HH点mm分ss秒 String newDate simple format new Date Str
  • 国内常用镜像源

    国内常用镜像源 阿里云官方镜像站 https developer aliyun com mirror 清华大学开源软件镜像站 https mirrors tuna tsinghua edu cn 浙大镜像源 http mirrors zju
  • Segmentation with deep atlas prior

    文章目录 前言 一 Probabilistic Atlas 二 Deep Atlas Prior 三 Objective Function 四 Experiment Results 五 Analysis 前言 最近还是在看一些医学图像分割的
  • 大型网站架构核心要素之扩展性:可扩展架构

    前言 续上节大型网站架构核心要素性能之后 我们今天要讲的是第四个要素 扩展性 什么叫扩展性呢 简单的说就是在对现有系统影响最小的情况下 系统功能可持续扩展及提升的能力 讲扩展性之前 我先讲下扩展性和伸缩性的区别 因为这两个点经常有人会混淆
  • VUE-Router之解决 Navigating to current location (XXX) is not allowed

    VUE Router之解决 Navigating to current location index list2 is not allowed 错误代码 NavigationDuplicated name NavigationDuplica
  • 菠萝狗四足机器人使用手册

    菠萝狗手册 一 菠萝狗的组装和使用 1 1 各菠萝狗的操作步骤 1 2 具体教程 二 b站的视频教程 全集目录 第一章 入门导论 第二章 开源菠萝狗制造组装篇 第三章 边玩边了解四足基本理论知识 三 总体项目的介绍 四 交流群 一 菠萝狗的
  • error: No rule to make target 'image/资源.qrc', needed by 'debug/qrc_资源.cpp'. Stop

    使用Qt添加资源文件 出现上述错误 原因是把 qrc文件的位置放错了 根本原因是创建资源文件的时候路径选择错了 解决办法 1 将你所添加的资源文件删掉 直接在项目中 2 在文件中以记事本的方式打开 pro文件 删除所添加的资源信息 因为在项
  • CGAL 入门基础

    目录 一 点和线段基础操作 1 概述 2 整型坐标 3 浮点型坐标 二 点序列的凸包 1 在数组Array中提取凸包点 2 在向量Vector中提取凸包点 三 关于kernel和Traits类 四 概念与模型 本文是提供给了解c 和几何算法
  • Windows下jdk的下载和安装详细步骤及解决javac无法使用的问题

    Windows下jdk的下载和安装详细步骤及解决javac无法使用的问题 一 简介 其实我最开始安装jdk是为了学习Java 而学习Java的初衷是为了开发安卓APP 但是当我接触多了之后 我才发现 Java和安卓APP是两码事 安卓原生A
  • 项目中如何修改element-ui的默认样式

    Vue项目中 通常我们在写样式的时候为了避免全局污染 我们会给当前组件的样式加上scoped 让当前的样式只作用域当前组件 但是在写项目的时候会发现一个问题 当我们需要在局部组件中修改第三方组件库样式 而又不想去除scoped属性造成的组件
  • 人工智能各领域跨界能手——Transformer

    导读 Transformer源自于AI自然语言处理任务 在计算机视觉领域 近年来Transformer逐渐替代CNN成为一个热门的研究方向 此外 Transformer在文本 语音 视频等多模态领域也在崭露头角 本文对Transformer
  • 如何用SD-WAN实现多地组网?

    SD WAN技术可以通过虚拟化和自动化的方式 实现多地点之间的网络互联 以下是如何使用SD WAN实现多地组网的步骤 部署SD WAN设备 在每个地点部署SD WAN设备 并将设备连接到各自的局域网中 设备可以是物理设备或虚拟设备 这取决于
  • 糊里糊涂进了微盟Java内招群,抱着试试的想法投了简历,没想到面试通过了

    不久前登录QQ的时候忽然发现自己进了微盟内招群 我一脸懵逼不知道什么时候进入的 在里面划水了一段时间 抱着试一试的心态就投了简历 昨天进行了一面二面 然后就 就通过了 我也挺惊讶的 等着三面吧 把面试经验分享给大家 希望我们都能成功 一面5
  • Elasticsearch出现field expansion matches too many fields异常

    7 4 2的集群里面执行query string 语句时 异常信息 报了 reason field expansion matches too many fields limit 1024 got 15448 表示子查询数量大于1024 对
  • Java中的迭代器Iterator接口详解

    Iterator对象称为迭代器 设计模式的一种 主要用于遍历 Collection 集合中的元素 迭代器模式的定义为 提供一种方法访问一个容器 container 对象中各个元 素 而又不需暴露该对象的内部细节 迭代器模式 就是为容器而生
  • k8s发布模板

    deployment apiVersion apps v1 kind Deployment metadata labels app datasource config name name datasource config name nam
  • 2020DCIC智慧海洋建设算法赛学习01-赛题北京及地理数据分析常用工具

    序 本系列的博客旨在学习2020DCIC智能算法赛 智慧海洋建设的优秀方案 对地理数据分析问题积累一些思路和经验 作为这一系列博客的开篇 这篇博客主要内容包括对赛题的解析和对项目中会用到的一些常用的地理数据分析工具的简要介绍 1 赛题背景