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

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

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

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

以下全文代码和数据均已发布至和鲸社区,复制下面链接前往,可一键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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
6万字解决算法面试中的深度学习基础问题
真的是千呼万唤始出来emmmm,去年春招结束写了篇面试的经验分享。在文中提到和小伙伴整理了算法岗面试时遇到的常见知识点及回答,本想着授人以渔,但没想到大家都看上了我家的 !但因本人执行力不足,被大家催到现在才终于想着行动起来分享给大家,笔者在这里给各位读者一个大大的抱歉,求原谅呜呜~~相信今年参加秋招的小伙伴们一定都拿到理想的offer啦,明年准备找工作的小盆友如果觉得本文还有些用可以收藏哈。
对白
2022/04/01
6230
6万字解决算法面试中的深度学习基础问题
决策树、随机森林、bagging、boosting、Adaboost、GBDT、XGBoost总结
决策树是一个有监督分类模型,本质是选择一个最大信息增益的特征值进行输的分割,直到达到结束条件或叶子节点纯度达到阈值。下图是决策树的一个示例图:
Ai学习的老章
2019/09/03
1.8K0
决策树、随机森林、bagging、boosting、Adaboost、GBDT、XGBoost总结
【动手学深度学习】多层感知机之权重衰减研究详情
启动jupyter notebook,使用新增的pytorch环境新建ipynb文件,为了检查环境配置是否合理,输入import torch以及torch.cuda.is_available() ,若返回TRUE则说明研究​​​​​​​环境配置正确,若返回False但可以正确导入torch则说明pytorch配置成功,但研究运行是在CPU进行的,结果如下:
SarPro
2024/06/06
1690
【动手学深度学习】多层感知机之权重衰减研究详情
正则化方法:L1和L2 regularization、数据集扩增、dropout
本文介绍了防止过拟合的一些方法,包括L1正则化、L2正则化、数据集扩增和早停等技术,以及这些方法如何有助于提高机器学习算法的性能。
码科智能
2018/01/02
2K0
正则化方法:L1和L2 regularization、数据集扩增、dropout
Coursera吴恩达《优化深度神经网络》课程笔记(1)-- 深度学习的实用层面
Andrew Ng的深度学习专项课程的第一门课《Neural Networks and Deep Learning》的5份笔记我已经整理完毕。迷路的小伙伴请见如下链接: Coursera吴恩达《神经网
红色石头
2017/12/28
1.6K0
Coursera吴恩达《优化深度神经网络》课程笔记(1)-- 深度学习的实用层面
【算法】正则化方法
小便邀请您,先思考: 1 正则化解决什么问题? 2 正则化如何应用? 3 L1和L2有什么区别? 正则化方法:防止过拟合,提高泛化能力 在训练数据不够多时,或者overtraining时,常常会导致o
陆勤_数据人网
2018/03/27
9370
【算法】正则化方法
「建模调参」之零基础入门数据挖掘
摘要:对于数据挖掘项目,本文将学习如何建模调参?从简单的模型开始,如何去建立一个模型;如何进行交叉验证;如何调节参数优化等。
Datawhale
2020/04/15
9760
「建模调参」之零基础入门数据挖掘
干货 | 深度学习之DNN的多种正则化方式
关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第二 【Python】:排名第三 【算法】:排名第四 前言 和普通的机器学习算法一样,DNN也会遇到过拟合的问题,需要考虑泛化,这里对DNN的正则化方法做一个总结。 DNN的L1与L2正则化 想到正则化,首先想到的就是L1正则化和L2正则化。(L1正则化和L2正则化原理类似,这里重点讲述DNN的L2正则化)而DNN的L2正则化通常的做法是只针对与线性系数矩阵W,而不针对偏倚系数b。假如我们的每个样本的损失函数是均方差损失函数,则所有的m个
昱良
2018/04/08
1.3K0
干货 | 深度学习之DNN的多种正则化方式
算法金 | 决策树、随机森林、bagging、boosting、Adaboost、GBDT、XGBoost 算法大全
决策树是一种简单直观的机器学习算法,它广泛应用于分类和回归问题中。它的核心思想是将复杂的决策过程分解成一系列简单的决策,通过不断地将数据集分割成更小的子集来进行预测。本文将带你详细了解决策树系列算法的定义、原理、构建方法、剪枝与优化技术,以及它的优缺点。
算法金
2024/06/25
6260
算法金 | 决策树、随机森林、bagging、boosting、Adaboost、GBDT、XGBoost 算法大全
【AI】浅谈使用正则化防止过拟合(下)
对于机器学习问题,我们最常遇到的一个问题便是过拟合。在对已知的数据集合进行学习的时候,我们选择适应度最好的模型最为最终的结果。虽然我们选择的模型能够很好的解释训练数据集合,但却不一定能够很好的解释测试数据或者其他数据,也就是说这个模型过于精细的刻画了训练数据,对于测试数据或者其他新的数据泛化能力不强。
sidiot
2023/08/30
4330
【AI】浅谈使用正则化防止过拟合(下)
长文!机器学习笔试精选 100 题【附详细解析】
机器学习是一门理论性和实战性都比较强的技术学科。在应聘机器学习相关工作岗位时,我们常常会遇到各种各样的机器学习问题和知识点。为了帮助大家对这些知识点进行梳理和理解,以便能够更好地应对机器学习笔试包括面试,红色石头将之前连载的一些笔试题进行整理,并额外增加了一些典型题目,汇总成 100 道选择题,每道题都有答案和详细的解析!建议收藏!
红色石头
2022/01/12
5.3K0
长文!机器学习笔试精选 100 题【附详细解析】
面试、笔试题集:集成学习,树模型,Random Forests,GBDT,XGBoost
分类和回归树(简称 CART)是 Leo Breiman 引入的术语,指用来解决分类或回归预测建模问题的决策树算法。它常使用 scikit 生成并实现决策树: sklearn.tree.DecisionTreeClassifier 和 sklearn.tree.DecisionTreeRegressor 分别构建分类和回归树。
流川疯
2022/05/10
1K0
面试、笔试题集:集成学习,树模型,Random Forests,GBDT,XGBoost
【深度学习】正则化入门
最近在看DeepLearning这本书,看到了正则化这一章做一个知识梳理。首先用一张思维导图做个总结。
Ai学习的老章
2019/04/10
5340
【深度学习】正则化入门
数据挖掘入门指南!!!
摘要:入门数据挖掘,必须理论结合实践。本文梳理了数据挖掘知识体系,帮助大家了解和提升在实际场景中的数据分析、特征工程、建模调参和模型融合等技能。
Datawhale
2020/04/21
9060
数据挖掘入门指南!!!
RF(随机森林)、GBDT、XGBoost面试级整理
由于本文是基于面试整理,因此不会过多的关注公式和推导,如果希望详细了解算法内容,敬请期待后文。   RF、GBDT和XGBoost都属于集成学习(Ensemble Learning),集成学习的目的是通过结合多个基学习器的预测结果来改善单个学习器的泛化能力和鲁棒性。   根据个体学习器的生成方式,目前的集成学习方法大致分为两大类:即个体学习器之间存在强依赖关系、必须串行生成的序列化方法,以及个体学习器间不存在强依赖关系、可同时生成的并行化方法;前者的代表就是Boosting,后者的代表是Bagg
机器学习AI算法工程
2018/03/15
6.3K0
【深度学习】正则化技术全面了解
正则化就是结构风险最小化策略的实现, 是在经验风险最小化的情况下加入一个正则化项或者罚项。
OpenCV学堂
2020/03/08
2K0
深度学习教程 | 深度学习的实用层面
本系列为吴恩达老师《深度学习专项课程(Deep Learning Specialization)》学习与总结整理所得,对应的课程视频可以在这里查看。
ShowMeAI
2022/04/14
1.4K0
深度学习教程 | 深度学习的实用层面
神经网络之防止过拟合
在机器学习和深度学习中,过拟合是指模型在训练数据上表现得非常好,但在新的、未见过的数据上表现不佳的现象。这是因为模型过于复杂,以至于它学习了训练数据中的噪声和细节,而不是数据的潜在分布。为了解决这个问题,正则化技术被引入,它通过在损失函数中添加一个惩罚项来对模型的复杂度进行限制。
@小森
2024/05/06
1780
神经网络之防止过拟合
算法金 | 奇奇怪怪的正则化
在机器学习中,过拟合是一个常见的问题,即模型在训练数据上表现很好,但在新数据上表现不佳。为了解决这个问题,正则化技术应运而生。
算法金
2024/06/21
1110
算法金 | 奇奇怪怪的正则化
查收一份附带答案的面经!
1.1.1 全量梯度下降(Batch gradient descent) 每次使用全量的训练集样本来更新模型参数,即θ=θ−η⋅∇θJ(θ)。 优点:每次更新都会朝着正确的方向进行,最后能够保证收敛于极值点(凸函数收敛于全局极值点,非凸函数可能会收敛于局部极值点), 缺点:在于每次学习时间过长,并且如果训练集很大以至于需要消耗大量的内存,并且全量梯度下降不能进行在线模型参数更新。
石晓文
2018/10/23
6970
查收一份附带答案的面经!
推荐阅读
相关推荐
6万字解决算法面试中的深度学习基础问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验