python 如何对于海洋气象数据进行k-mean聚类

简介: python 中提供了 KMeans库,可以方便我们对数据进行相应的聚类分析。

python 中提供了 KMeans库,可以方便我们对数据进行相应的聚类分析。

下面举个对于气温数据进行聚类分析的例子,数据来自ERA-5,可以自行从官网下载。


数据内容如下所示:


45f67587c5ec4ad09ca4f6c4617a71db.png


1、聚类分析



首先是导入库:


from sklearn.cluster import KMeans


然后对数据进行一下处理:

1、转换一下数据维度顺序,将高度level放到第一维

2、对nan值数据进行掩膜,

3、经纬度、时间、高度的大小,构造聚类矩阵


import xarray as xr 
import numpy as np
path='D://t_data.nc'
ds=xr.open_dataset(path).sel(lat=slice(-20,20))
da=ds.transpose('level','time','lat','lon')  #转换一下数据维度顺序便于后续处理
time=da.time.data  #读取时间
lat=da.lat.data    #读取纬度
lon=da.lon.data    #读取经度
omega=da.t.data    #读取气温
w= omega.reshape(27,17*144*480)   #构建矩阵,27表示level层数,其他几项代表经纬度、时间的size
mask = np.isfinite(w[0,:])        #构建掩膜mask,判断是否有nan值
# # # # 依次循环将每一层得数据填入到零矩阵
# # 空矩阵k,便于后续聚类
k = np.zeros(((w[0,:][mask].shape[-1]),27))
# # 对于每一个高度层进行循环,填入每一层的非nan值数据
for i in range(27):
    k[:,i] = w[i,mask]

上面把矩阵构建好了,是个二维矩阵k,第2维表示高度层(level),第1维表示该层上所有的非nan值的数据,下面就可进行聚类了。K-means则是事先给定聚类数,这里的聚类数可以通过一些方法(SSE、轮廓系数)进行评估,以便选取适合的聚类数。


km=KMeans(n_clusters=6)   # 6表示聚类的个数,聚类容器
km.fit(k)   #进行聚类
label=km.labels_   #获取聚类的标签

等代码运行结束就可以发现聚类成功了,数据被分为0、1、2、3、4、5六类数据,这里可以将聚类后的数据单独保存,以便后续数据处理,直接导入即可,不需要再聚类一次浪费时间。(ps:这里提醒一下,对于同一套数据进行多次聚类,会导致label的标签序号每次可能都不同,但是个数是不变的,所以建议聚类一次后没问题就直接保存!!


2、保存数据



保存数据,可以直接使用下面两种方法都行,保存为.npy或者.nc,看个人喜好。


### 直接保存为.npy格式
np.save("/label.npy",label)
### 保存为 .nc格式
# label = time*lat*lon
label_save = np.full((12*17*144), np.nan)
label_save[mask] = label
label_save = label_save.reshape(12,17,144)
# =============================================================================================
# save labels
label_nc = xr.Dataset(
    {
        "label":(("month","lat","lon"), label_save)
    },
    coords={
        "month":time,
        "lat":lat,
        "lon":lon,
    }
)
label_nc.attrs["long_name"] = "K-mean labels"
label_nc.to_netcdf("/Kmean6label.nc")


3、对于聚类的数据进行计算



聚类结束后,可以对于每一类数据进行计算,求平均值、标准差、绘制曲线等等。


# select  type of omega
label0 = np.array(np.where(label==0))
label1 = np.array(np.where(label==1))
label2 = np.array(np.where(label==2))
label3 = np.array(np.where(label==3))
label4 = np.array(np.where(label==4))
label5 = np.array(np.where(label==5))
# 
numlabel0=len(label0[0,:])
numlabel1=len(label1[0,:])
numlabel2=len(label2[0,:])
numlabel3=len(label3[0,:])
numlabel4=len(label4[0,:])
numlabel5=len(label5[0,:])
# 将二维数据转为一维
w0 = np.array([k[i,:] for i in label0]).squeeze()
w1 = np.array([k[i,:] for i in label1]).squeeze()
w2 = np.array([k[i,:] for i in label2]).squeeze()
w3 = np.array([k[i,:] for i in label3]).squeeze()
w4 = np.array([k[i,:] for i in label4]).squeeze()
w5 = np.array([k[i,:] for i in label5]).squeeze()
# calculate mean
w0_mean = np.nanmean(w0, axis=0)
w1_mean = np.nanmean(w1, axis=0)
w2_mean = np.nanmean(w2, axis=0)
w3_mean = np.nanmean(w3, axis=0)
w4_mean = np.nanmean(w4, axis=0)
w5_mean = np.nanmean(w5, axis=0)
# calculate std
w0_std = np.std(w0, axis=0)
w1_std = np.std(w1, axis=0)
w2_std = np.std(w2, axis=0)
w3_std = np.std(w3, axis=0)
w4_std = np.std(w4, axis=0)
w5_std = np.std(w5, axis=0)


4、聚类个数评估



主要有以下两种方法对于聚类个数的大小进行评估:

1、SSE(簇内误方差)–手肘法


  • SSE参数的核心思想就是计算误方差和,SSE的值越小,证明聚类效果越好,随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。


2、轮廓系数S


  • 局部轮廓系数最大(极大值),则该值为最优选择。对于下面的代码中,也就是说当s最大值所对应的k值,即为聚类的个数。


#  method 1
SSE = []
for i in range(1,11):
     km = KMeans(n_clusters=i)
     km.fit(k)
     #获取K-means算法的SSE
     SSE.append(km.inertia_)
plt.plot(SSE)
plt.show()
#  method 2
from sklearn.metrics import silhouette_score
S = []  # 存放轮廓系数
for i in range(2,10):
     kmeans = KMeans(n_clusters=i)  # 构造聚类器
     kmeans.fit(k)
     S.append(silhouette_score(k,kmeans.labels_,metric='euclidean'))
# plt.plot(S)
# plt.show()


                    一个努力学习python的海洋
                            水平有限,欢迎指正!!!
                              欢迎评论、收藏、点赞、转发、关注。
                              关注我不后悔,记录学习进步的过程~~
相关文章
|
7天前
|
数据采集 Python
如何用Python Selenium和WebDriver抓取LinkedIn数据并保存登录状态
本文介绍了使用Python Selenium和WebDriver库抓取LinkedIn数据的方法。首先,安装Selenium库和对应的WebDriver,然后配置爬虫代理IP以避免频繁请求被检测。接下来,设置user-agent和cookies以模拟真实用户行为,实现登录并保持状态。登录后,使用WebDriver抓取目标页面数据,如用户名、年龄、性别和简历信息。最后,强调了优化代码、处理异常和遵守使用条款的重要性,以提高效率并避免账号被封禁。
如何用Python Selenium和WebDriver抓取LinkedIn数据并保存登录状态
|
4天前
|
机器学习/深度学习 JSON API
【Python奇迹】FastAPI框架大显神通:一键部署机器学习模型,让数据预测飞跃至Web舞台,震撼开启智能服务新纪元!
【8月更文挑战第16天】在数据驱动的时代,高效部署机器学习模型至关重要。FastAPI凭借其高性能与灵活性,成为搭建模型API的理想选择。本文详述了从环境准备、模型训练到使用FastAPI部署的全过程。首先,确保安装了Python及相关库(fastapi、uvicorn、scikit-learn)。接着,以线性回归为例,构建了一个预测房价的模型。通过定义FastAPI端点,实现了基于房屋大小预测价格的功能,并介绍了如何运行服务器及测试API。最终,用户可通过HTTP请求获取预测结果,极大地提升了模型的实用性和集成性。
14 1
|
4天前
|
数据采集 数据可视化 算法
GitHub星标68K!Python数据分析入门手册带你从数据获取到可视化
Python作为一门优秀的编程语言,近年来受到很多编程爱好者的青睐。一是因为Python本身具有简捷优美、易学易用的特点;二是由于互联网的飞速发展,我们正迎来大数据的时代,而Python 无论是在数据的采集与处理方面,还是在数据分析与可视化方面都有独特的优势。我们可以利用 Python 便捷地开展与数据相关的项目,以很低的学习成本快速完成项目的研究。
|
5天前
|
数据采集 Java PHP
使用Python+requests简单实现模拟登录以及抓取接口数据
本文通过Python的requests库演示了如何实现模拟登录和抓取接口数据的过程,包括设置请求头、发送POST请求进行登录以及使用登录后的会话进行GET请求获取数据。
15 1
|
7天前
|
编解码 算法 Linux
Linux平台下RTSP|RTMP播放器如何跟python交互投递RGB数据供视觉算法分析
在对接Linux平台的RTSP播放模块时,需将播放数据同时提供给Python进行视觉算法分析。技术实现上,可在播放时通过回调函数获取视频帧数据,并以RGB32格式输出。利用`SetVideoFrameCallBackV2`接口设定缩放后的视频帧回调,以满足算法所需的分辨率。回调函数中,每收到一帧数据即保存为bitmap文件。Python端只需读取指定文件夹中的bitmap文件,即可进行视频数据的分析处理。此方案简单有效,但应注意控制输出的bitmap文件数量以避免内存占用过高。
|
6天前
|
数据采集 数据可视化 算法
GitHub星标68K!Python数据分析入门手册带你从数据获取到可视化
Python作为一门优秀的编程语言,近年来受到很多编程爱好者的青睐。一是因为Python本身具有简捷优美、易学易用的特点;二是由于互联网的飞速发展,我们正迎来大数据的时代,而Python 无论是在数据的采集与处理方面,还是在数据分析与可视化方面都有独特的优势。我们可以利用 Python 便捷地开展与数据相关的项目,以很低的学习成本快速完成项目的研究。 今天给小伙伴们分享的这份Python数据分析入门手册本着实用性的目的,着眼于整个数据分析的流程,介绍了从数据采集到可视化的大致流程。
|
7天前
|
数据采集 数据挖掘 数据处理
Python爬虫开发:爬取简单的网页数据
本文详细介绍了如何使用Python爬取简单的网页数据,以掘金为例,展示了从发送HTTP请求、解析HTML文档到提取和保存数据的完整过程。通过这个示例,你可以掌握基本的网页爬取技巧,为后续的数据分析打下基础。希望本文对你有所帮助。
|
2天前
|
消息中间件 SQL Java
实时数仓 Hologres产品使用合集之如何用python将kafka数据写入
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
|
4天前
|
JSON 缓存 安全
Python pickle 二进制序列化和反序列化 - 数据持久化
Python pickle 二进制序列化和反序列化 - 数据持久化
13 0
|
5天前
|
API Python
Python FastAPI 获取 Neo4j 数据
Python FastAPI 获取 Neo4j 数据
8 0