Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >算法复现 | 使用KMEAN算法对印度洋台风路径进行分类

算法复现 | 使用KMEAN算法对印度洋台风路径进行分类

作者头像
郭好奇同学
发布于 2022-11-15 01:16:09
发布于 2022-11-15 01:16:09
1.9K01
代码可运行
举报
文章被收录于专栏:好奇心Log好奇心Log
运行总次数:1
代码可运行

点击下方公众号,回复资料,收获惊喜

以下全文代码和数据均已发布至和鲸社区,复制下面链接前往,可一键fork跑通:

https://www.heywhale.com/mw/project/6302faacf31025b7777230c9

本文根据《K-均值聚类法用于西北太平洋热带气旋路径分类》文献中的聚类方法,对印度洋的台风路径进行聚类分析。 其核心原理就是通过计算每条台风路径的经、纬向质心,以及经、纬、对角向的方差,作为聚类的依据,使用KMEAN算法将上述5个特征进行分类。 最后将分类后的结构进行可视化展示。

导入相关库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
import numpy as np
import glob
import cartopy
import cartopy.crs as ccrs
import cartopy.feature as cfeat
from cartopy.mpl.ticker import LongitudeFormatter,LatitudeFormatter
from cartopy.io.shapereader import Reader, natural_earth
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
from matplotlib.image import imread
import shapely.geometry as sgeom
import cartopy.io.shapereader as shpreader
import matplotlib.lines as mlines
from sklearn.cluster import KMeans

读取数据&相应预处理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
files = glob.glob(f'/home/mw/input/india_typhoon6005/indian/*/*')
df_list = []
i = 1
for f in files[:]:
    lines = open(f, 'r').readlines()
    max_line = max(lines, key=len)
    max_line_num = len(max_line.split(','))
    df = pd.read_csv(f, sep=',', header=None, error_bad_lines=False, names=range(max_line_num))

    df['count'] = i
    df = df[df.columns.drop('count').insert(0, 'count')]
    df = df.loc[:, :8].drop(columns=[0, 3, 4, 5])

    df.columns.values[:6] = ['count', 'num', 'time', 'lat', 'lon', 'speed']
    
    df['time'] = pd.to_datetime(df['time'], format='%Y%m%d%H')
    df['year'] = df['time'][0].year
    df['month'] = df['time'][0].month
    df['day'] = df['time'][0].day
        
    df['y'] = df['lat'].apply(lambda x: float(x[:-1]) / 10)
    df['x'] = df['lon'].apply(lambda x: float(x[:-1]) / 10)
    df['speed'] = df['speed'] * 0.514
    df['w'] = df['speed'] ** 0.5
    
    if (df['time'].iloc[-1] - df['time'].iloc[0]).days >= 1 and df['speed'].max() >= 17.2:
        df_list.append(df)
        i = i + 1
    
data = pd.concat(df_list)
data['w'] = data['w'].replace(0, np.nan)
data.dropna(axis='rows', how='any', inplace=True)
data.drop(columns=['lat', 'lon'], inplace=True)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data

根据文献设置相应特征

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tc = data
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tc['wx'] = tc['w'] * tc['x']
tc['wy'] = tc['w'] * tc['y']
tc
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tc['wx_sum'] = tc.groupby(['count'])['wx'].transform('sum')
tc['wy_sum'] = tc.groupby(['count'])['wy'].transform('sum')
tc['w_sum'] = tc.groupby(['count'])['w'].transform('sum')
tc['x_mean'] = tc['wx_sum'] / tc['w_sum']
tc['y_mean'] = tc['wy_sum'] / tc['w_sum']
tc['x_var'] = tc['wx_sum'] / tc['w_sum']
tc['x_var'] = (tc['x'] - tc['x_mean']) ** 2 * tc['w']
tc['y_var'] = (tc['y'] - tc['y_mean']) ** 2 * tc['w']
tc['xy_var'] = (tc['y'] - tc['y_mean']) * (tc['x'] - tc['x_mean']) * tc['w']
tc['x_var_sum'] = tc.groupby(['count'])['x_var'].transform('sum')
tc['y_var_sum'] = tc.groupby(['count'])['y_var'].transform('sum')
tc['xy_var_sum'] = tc.groupby(['count'])['xy_var'].transform('sum')
tc['x_var_mean'] = tc['x_var_sum'] / tc['w_sum']
tc['y_var_mean'] = tc['y_var_sum'] / tc['w_sum']
tc['xy_var_mean'] = tc['xy_var_sum'] / tc['w_sum']
tc
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tc_group = tc.groupby('count').mean()[['x_mean', 'y_mean', 'x_var_mean', 'y_var_mean', 'xy_var_mean']]
tc_group

运行算法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kmeans = KMeans(n_clusters=4, random_state=0)
kmeans.fit(tc_group)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
KMeans(n_clusters=4, random_state=0)

查看算法输出结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(kmeans.labels_)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[2 2 0 0 2 3 0 2 3 0 3 2 0 2 2 2 2 2 2 3 3 2 2 3 2 2 1 2 3 2 2 2 2 2 3 2 2
 3 2 2 0 0 2 3 2 2 2 2 2 3 2 2 0 2 2 0 2 3 2 2 0 2 2 1 2 0 0 1 2 2 3 2 0 0
 3 2 2 2 3 2 2 1 2 2 2 2 2 0 0 2 3 3 3 3 2 2 3 2 3 2 2 2 2 2 1 2 3 3 3 3 2
 2 2 2 2 3 2 3 2 3 3 0 2 2 2 2 2 2 0 2 2 3 2 2 2 3 0 2 3 2 2 2 2 2 2 0 2 2
 2 3 2 2 3 3 2 0 3 2 3 3 0 2 3 2 2 3 2 2 0 2 0 2 2 3 2 3 2 3 2 3 3 3 2 3 2
 2 1 2 2 3 2 3 3 2 2 3 2 0 2 2 3 3 3 3 3 3 2 3 3 2 2]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(kmeans.cluster_centers_)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[[ 73.8071703   11.65878343  39.74780613   7.47642322 -11.02116106]
 [ 78.00734193  10.96868728 112.7133901    4.30306716  -2.60074766]
 [ 86.76754499  14.82524246   6.22982994   7.68770382  -0.54250094]
 [ 63.71074018  15.72378535   8.58366153   3.80791174  -1.27377464]]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tc_group['label'] = kmeans.labels_ + 1
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tc_group['label'].value_counts()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
3    121
4     59
1     25
2      6
Name: label, dtype: int64
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tc_group
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tc.set_index(['count'], inplace=True)
tc['label'] = tc_group['label']
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tc

将结果可视化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 分级设色
def get_color(w):
    if w <= 13.8:
        color='#FFFF00'
    elif 13.9<= w <= 17.1:
        color='#6495ED'
    elif 17.2 <= w <= 24.4:
        color='#3CB371'
    elif 24.5<= w <= 32.6:
        color='#FFA500'
    elif 32.7 <= w <= 61.3:
        color='#FF00FF'
    else:
        color='#DC143C'
    return color
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def create_map(title, extent):
    fig = plt.figure(figsize=(12, 8), dpi=400)
    ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())
    ax.imshow(
        imread('/home/mw/input/natural_earth8967/NE1_50M_SR_W.tif'),
        origin='upper', 
        transform=ccrs.PlateCarree(),
        extent=[-180, 180, -90, 90]
    )
    ax.set_extent(extent,crs=ccrs.PlateCarree())

    gl = ax.gridlines(draw_labels=False, linewidth=1, color='k', alpha=0.5, linestyle='--')
    gl.top_labels = gl.right_labels = False  
    ax.set_xticks(np.arange(extent[0], extent[1]+5, 5))
    ax.set_yticks(np.arange(extent[2], extent[3]+5, 5))
    ax.xaxis.set_major_formatter(LongitudeFormatter())
    ax.xaxis.set_minor_locator(plt.MultipleLocator(1))
    ax.yaxis.set_major_formatter(LatitudeFormatter())
    ax.yaxis.set_minor_locator(plt.MultipleLocator(1))
    ax.tick_params(axis='both', labelsize=10, direction='out')

    province = shpreader.Reader('/home/mw/input/cn_shp3641/Province_9.shp')
    ax.add_geometries(province.geometries(), crs=ccrs.PlateCarree(), linewidths=0.1,edgecolor='k',facecolor='none')

    a = mlines.Line2D([],[],color='#FFFF00',marker='o',markersize=7, label='D',ls='')
    b = mlines.Line2D([],[],color='#6495ED', marker='o',markersize=7, label='DD',ls='')
    c = mlines.Line2D([],[],color='#3CB371', marker='o',markersize=7, label='CS',ls='')
    d = mlines.Line2D([],[],color='#FFA500', marker='o',markersize=7, label='SCS',ls='')
    e = mlines.Line2D([],[],color='#FF00FF', marker='o',markersize=7, label='VSCS',ls='')
    f = mlines.Line2D([],[],color='#DC143C', marker='o',markersize=7, label='SuperCS',ls='')
    ax.legend(handles=[a,b,c,d,e,f], numpoints=1, handletextpad=0, loc='upper left', shadow=True)
    plt.title(f'{title} Typhoon Track', fontsize=15)
    return ax

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for label in tc_group['label'].value_counts().index[:]:
    tc_number = tc_group["label"].value_counts()[label]
    print(f'label:{label}, tc number:{tc_number}')
    
    one_type = tc[tc['label']==label].reset_index()
    ax = create_map(f'Type {label}', [40, 110, 0, 30])
    
    for num in one_type['count'].value_counts().index:
        df = one_type[one_type['count']==num]
        for i in range(len(df))[:1]:
            ax.scatter(list(df['x'])[i], list(df['y'])[i], marker='o', s=10, color='k')

        for i in range(len(df)-1):
            pointA = list(df['x'])[i],list(df['y'])[i]
            pointB = list(df['x'])[i+1],list(df['y'])[i+1]
            ax.add_geometries([sgeom.LineString([pointA, pointB])], color=get_color(list(df['speed'])[i+1]),crs=ccrs.PlateCarree(), linewidth=2)
    plt.savefig(f'track_type{label}_typhoon.png')
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
label:3, tc number:121
label:4, tc number:59
label:1, tc number:25
label:2, tc number:6

问题讨论

本次复现的工作其实并没有全部完成,在确定台风分类数量上只是随机选择了一个数,但实际文献中是给了一个确定分类个数的方法的:

在这里是抛砖引玉,感兴趣的盆友们可以自行fork本项目,添加后续解决方案。

❝参考文献:K-均值聚类法用于西北太平洋热带气旋路径分类 ❞

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 好奇心Log 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python绘图 | 多种台风路径可视化实现方法
中国气象局(CMA)的台风最佳路径数据集(BST),BST是之后对历史台风路径进行校正后发布的,其经纬度、强度、气压具有更高的可靠性,但是时间分辨率为6小时,部分3小时,这一点不如观测数据。下载地址:http://tcdata.typhoon.org.cn/
郭好奇同学
2020/10/29
1.1K1
Python可视化 | CMA热带气旋最佳路径数据集读取与绘制
以前在简书分享过一个路径绘制的方法,然而对于更多情况的路径绘制来说(比如台风路径),每次的路径长度都是不一致的,同时也需要从一个数据文件里很复杂的读取。这次分享一个可以方便读取CMA热带气旋最佳路径数据集的方法。
郭好奇同学
2021/05/28
2.6K1
Python可视化 | CMA热带气旋最佳路径数据集读取与绘制
Python绘制气象实用地图(附代码和测试数据)
前面的推文对于常用的Python绘图工具都有了一些介绍,在这里就不赘述了。本文主要就以下几个方面:“中国区域绘图”、“包含南海”、“兰伯特投影带经纬度标签”、“基于salem的mask方法”、“进阶中国区域mask方法”、“进阶省份mask方法”。对日常的实用需求能够在一定程度上满足。后续就Python在气象常用的统计方法(显著性检验)、合成分析、多变量叠加绘图再进行推送,敬请期待!
MeteoAI
2019/08/12
16.2K3
Python绘制气象实用地图(附代码和测试数据)
Python 绘制山体阴影+雷达图
本文旨在利用Python编程语言,将山体阴影与雷达速度产品相结合,以探索其可视化效果 环境:python 3.9
用户11172986
2024/06/20
1750
Python 绘制山体阴影+雷达图
Python气象绘图实例-我们一起画台风(代码+数据)
前段时间袭击中国的超强台风“利奇马”,以及这两天袭击美国的五级飓风“多利安”,让我们感受到了大自然的力量。所以,今天分享一个简单的Python实例,也算是延续前面python气象绘图系列(点击链接1;点击链接2),与大家交流如何选择合适的色标来绘制台风云顶亮温展示台风的部分特征。配色方案借鉴了GOES-16 Data[1]数据的处理方法。我们此次针对于中国区域进行一个展示,数据选取GridSat-B1 CDR(数据下载地址)[2]. A climate quality, long term dataset of global infrared window brightness temperatures. 1981-present (updated quarterly)。
MeteoAI
2019/09/05
5.3K3
Python气象绘图实例-我们一起画台风(代码+数据)
如何用Python绘制炫酷的立体地形图
众所周知,Python的matplotlib是一个非常全面的制图库,它不仅可以绘制图表、地图,还可以绘制3D效果图,试想一下,如果你在画图的时候,可以将立体地形图作为底图,那逼格噌一下子就上来了,今天我就来教大家画一个立体地形图,啥也不说,咱先上效果图:
自学气象人
2023/06/21
1.1K1
如何用Python绘制炫酷的立体地形图
数据处理 | EOF用法及可视化实例
EOF分析在气象分析中十分常见,幸运的是有前辈已经利用Python实现了EOF分析并且发布在github。
郭好奇同学
2021/05/28
2.8K0
数据处理 | EOF用法及可视化实例
GPM 卫星三级产品的简单可视化
之前GPM数据写了下载教程,现在简单试试可视化,毕竟是nc格式数据(下载可选),用起来相对简单
用户11172986
2024/06/20
1890
GPM 卫星三级产品的简单可视化
重磅!Python台风路径还能这样画
读者来信,想优化一版台风路径绘制 在检索了半天终于找到一个库,tcmarkers。
用户11172986
2024/06/20
4380
重磅!Python台风路径还能这样画
气象绘图——白化杂谈
什么是白化?我在一年前也是头一次接触到这个词语,其实就是将你不需要的部分的等值线、等值线填色、风场、流场等挖去。目前气象领域流行的是花式利用地图shp文件进行操作,达到白化的目的。
自学气象人
2023/06/21
1.3K0
气象绘图——白化杂谈
Python气象绘图教程(十三)—Cartopy_4
本节提要:关于子图的一些问题、使用path添加示意框线、Cartopy台风实例本土化
气象学家
2020/06/17
9.8K2
Python气象绘图教程(十三)—Cartopy_4
台风路径可视化 | 强台风“天兔”移动轨迹图(Chiikawa版)
大家好!最近,2024年第25号台风天兔引起了网友们的广泛关注,因为它有一个特别的名字——“ウサギ”(Usagi),直译过来就是“兔子”。其本义是指天兔星座。 由于这个名字与《Chiikawa》漫画中的可爱角色“乌萨奇”(Usagi)同名,网友们亲切地称其为“乌萨奇台风”。这不仅增加了台风话题的趣味性,也让许多人对这次台风产生了更多的关注。
用户11172986
2024/11/25
4600
台风路径可视化 | 强台风“天兔”移动轨迹图(Chiikawa版)
用Python绘制《天气学原理和方法》插图
最近天气学原理需要绘制课本插图来做 翻转课堂,因此整理了课本第四章几个典型图片的画法和代码,共需要的人使用。
气象学家
2022/01/18
1.8K0
用Python绘制《天气学原理和方法》插图
python教程 | 最标准的地图调用方式(国家测绘局提供数据)
天地图是国家测绘地理信息局建设的地理信息综合服务网站,是国家地理信息公共服务平台的公众版。 与常用的谷歌地图、腾讯地图、百度地图、微软地图、必应地图相比,天地图有什么不同呢?主要体现在数据的权威性和准确性。天地图发布的国界线、九段线等是准确无误的;另外国内只有天地图影像的坐标是无偏移的,其余地图的坐标都进行过加密处理。 Cartopy是一个基于Python的制图模块,其提供了加载在线地图的功能,那么如何添加调用天地图服务功能呢? 其实前期已有相关的工作,但是由于天地图服务升级,原先的方法都不再适用,这里给出的是最新的调用方法。
bugsuse
2020/10/09
4.9K0
python教程 | 最标准的地图调用方式(国家测绘局提供数据)
Python兰伯特投影中国区域等值线图(含南海小地图)
自定义兰伯特投影: 原作者:“坎坷”大佬 PlateCarree (无坐标转换)作图: 代码调试作者:气象水文科研猫 注:因小编时间有限,代码未进行精简。 import numpy as np i
bugsuse
2021/01/04
7.6K1
Python兰伯特投影中国区域等值线图(含南海小地图)
气象常用库 | cartopy常用用法总结
10.在上一题基础上,添加国境线,并指定线宽为0.1(不推荐使用,因为该默认参数会使得我国部分领土丢失)
自学气象人
2022/11/14
1.6K0
气象常用库 | cartopy常用用法总结
利用Python对气象降水场做EOF分析
链接 | https://www.yxybiubiubiu.com/2020/06/01/f1-5-1-1/
MeteoAI
2020/06/29
7.9K3
利用Python对气象降水场做EOF分析
聊一聊我常用的6种绘制地图的方法
今天来讲一讲在日常工作生活中我常用的几种绘制地图的方法,下面我将介绍下面这些可视化库的地图绘制方法,当然绘制漂亮的可视化地图还有很多优秀的类库,没有办法一一列举
周萝卜
2021/12/08
3.8K0
聊一聊我常用的6种绘制地图的方法
WRF domain 绘制改进
prompt: color photo of a detailed topographic map —c 10 —ar 2:3
用户11172986
2024/06/20
2140
WRF domain 绘制改进
Python绘制地图专用库(Cartopy)
地图绘制 大家在绘制栅格地图的时候有可能还在使用ArcGIS进行出图,但是ArcGIS出图比较慢,而且批量出图的时候又比较麻烦。 今天给大家介绍一个Python中用于地图绘制的库,Cartopy,这个库跟basemap非常相似,不过basemap现在已经不再更新。所以大家使用Python绘制地图还是使用Cartopy比较好。 Cartopy简介 Cartopy是一个Python软件包,用于地理空间数据处理,以便生成地图和其他地理空间数据分析。 网址:https://scitools.org.uk/carto
GIS与遥感开发平台
2022/04/29
2.7K0
Python绘制地图专用库(Cartopy)
推荐阅读
相关推荐
python绘图 | 多种台风路径可视化实现方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验