【关于时间序列的ML】项目 3 :基于机器学习的地震预测模型

news2025/4/17 2:49:46

  🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​

📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】

​​

 🖍foreword

✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。

如果你对这个系列感兴趣的话,可以关注订阅哟👋

文章目录

基于机器学习的地震预测模型

数据可视化

拆分数据集

地震预测神经网络


在本文中,我将带您了解如何使用机器学习和 Python 编程语言为地震预测任务创建模型。预测地震是地球科学中尚未解决的重大问题之一。

随着技术使用的增加,许多地震监测站增加了,因此我们可以使用机器学习和其他数据驱动的方法来预测地震。

基于机器学习的地震预测模型

众所周知,如果一个地区发生灾难,很可能会再次发生。一些地区地震频繁,但这只是与其他地区相比的一个数量。

因此,根据以前的数据预测地震的日期和时间、纬度和经度并不是像其他事情那样遵循的趋势,它是自然发生的。

我将开始这项任务,通过导入必要的 Python 库来创建地震预测模型:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

现在让我们加载并读取数据集。我在这里使用的数据集可以在这里轻松下载

data = pd.read_csv("database.csv")
data.columns
Index(['Date', 'Time', 'Latitude', 'Longitude', 'Type', 'Depth', 'Depth Error',
       'Depth Seismic Stations', 'Magnitude', 'Magnitude Type',
       'Magnitude Error', 'Magnitude Seismic Stations', 'Azimuthal Gap',
       'Horizontal Distance', 'Horizontal Error', 'Root Mean Square', 'ID',
       'Source', 'Location Source', 'Magnitude Source', 'Status'],
      dtype='object')

现在让我们看看地震数据的主要特征,并创建一个具有这些特征的对象,即日期、时间、纬度、经度、深度、震级:

data = data[['Date', 'Time', 'Latitude', 'Longitude', 'Depth', 'Magnitude']]
data.head()
dateTimeLatitudeLongitudeDepthMagnitude
001/02/196513:44:1819.246145.616131.66.0
101/04/196511:29:491.863127.35280.05.8
201/05/196518:05:58-20.579-173.97220.06.2
301/08/196518:49:43-59.076-23.55715.05.8
401/09/196513:32:5011.938126.42715.05.8

由于数据是随机的,因此我们需要根据模型输入对其进行缩放。在此,我们将给定的日期和时间转换为以秒为单位的 Unix 时间和数字。这可以很容易地用作我们构建的网络的入口: 

import datetime
import time

timestamp = []
for d, t in zip(data['Date'], data['Time']):
    try:
        ts = datetime.datetime.strptime(d+' '+t, '%m/%d/%Y %H:%M:%S')
        timestamp.append(time.mktime(ts.timetuple()))
    except ValueError:
        # print('ValueError')
        timestamp.append('ValueError')
timeStamp = pd.Series(timestamp)
data['Timestamp'] = timeStamp.values
final_data = data.drop(['Date', 'Time'], axis=1)
final_data = final_data[final_data.Timestamp != 'ValueError']
final_data.head()
LatitudeLongitudeDepthMagnitudeTimestamp
019.246145.616131.66.0-1.57631e+08
11.863127.35280.05.8-1.57466e+08
2-20.579-173.97220.06.2-1.57356e+08
3-59.076-23.55715.05.8-1.57094e+08
411.938126.42715.05.8-1.57026e+08

数据可视化

现在,在我们创建地震预测模型之前,让我们在一张世界地图上可视化数据,该地图清楚地显示了地震频率更高的地方:

from mpl_toolkits.basemap import Basemap

m = Basemap(projection='mill',llcrnrlat=-80,urcrnrlat=80, llcrnrlon=-180,urcrnrlon=180,lat_ts=20,resolution='c')

longitudes = data["Longitude"].tolist()
latitudes = data["Latitude"].tolist()
#m = Basemap(width=12000000,height=9000000,projection='lcc',
            #resolution=None,lat_1=80.,lat_2=55,lat_0=80,lon_0=-107.)
x,y = m(longitudes,latitudes)

fig = plt.figure(figsize=(12,10))
plt.title("All affected areas")
m.plot(x, y, "o", markersize = 2, color = 'blue')
m.drawcoastlines()
m.fillcontinents(color='coral',lake_color='aqua')
m.drawmapboundary()
m.drawcountries()
plt.show()

拆分数据集

现在,要创建地震预测模型,我们需要将数据分为 Xs 和 ys,分别作为输入输入到模型中,以接收模型的输出。

这里的输入是时间戳、纬度和经度,输出是幅度和深度。我将把 xs 和 ys 分成训练和测试验证。训练集包含80%,测试集包含20%:

X = final_data[['Timestamp', 'Latitude', 'Longitude']]
y = final_data[['Magnitude', 'Depth']]
from sklearn.cross_validation import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print(X_train.shape, X_test.shape, y_train.shape, X_test.shape)

 (18727,3)(4682,3)(18727,2)(4682,3)

地震预测神经网络

现在我将创建一个神经网络来拟合训练集中的数据。我们的神经网络将由三个密集层组成,每个层有 16、16、2 个节点并重新读取。Relu 和 softmax 将用作激活函数:

from keras.models import Sequential
from keras.layers import Dense

def create_model(neurons, activation, optimizer, loss):
    model = Sequential()
    model.add(Dense(neurons, activation=activation, input_shape=(3,)))
    model.add(Dense(neurons, activation=activation))
    model.add(Dense(2, activation='softmax'))
    
    model.compile(optimizer=optimizer, loss=loss, metrics=['accuracy'])
    
    return model

现在我将使用两个或更多选项来定义超参数以找到最合适的:

from keras.wrappers.scikit_learn import KerasClassifier

model = KerasClassifier(build_fn=create_model, verbose=0)

# neurons = [16, 64, 128, 256]
neurons = [16]
# batch_size = [10, 20, 50, 100]
batch_size = [10]
epochs = [10]
# activation = ['relu', 'tanh', 'sigmoid', 'hard_sigmoid', 'linear', 'exponential']
activation = ['sigmoid', 'relu']
# optimizer = ['SGD', 'RMSprop', 'Adagrad', 'Adadelta', 'Adam', 'Adamax', 'Nadam']
optimizer = ['SGD', 'Adadelta']
loss = ['squared_hinge']

param_grid = dict(neurons=neurons, batch_size=batch_size, epochs=epochs, activation=activation, optimizer=optimizer, loss=loss)

现在我们需要找到上述模型的最佳拟合,并得到最佳拟合模型的平均测试分数和标准差:

grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1)
grid_result = grid.fit(X_train, y_train)

print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
    print("%f (%f) with: %r" % (mean, stdev, param))
Best: 0.957655 using {'activation': 'relu', 'batch_size': 10, 'epochs': 10, 'loss': 'squared_hinge', 'neurons': 16, 'optimizer': 'SGD'} 0.333316 (0.471398) with: {'activation': 'sigmoid', 'batch_size': 10, 'epochs': 10, 'loss': 'squared_hinge', 'neurons': 16, 'optimizer': 'SGD'} 0.000000 (0.000000) with: {'activation': 'sigmoid', 'batch_size': 10, 'epochs': 10, 'loss': 'squared_hinge', 'neurons': 16, 'optimizer': 'Adadelta'} 0.957655 (0.029957) with: {'activation': 'relu', 'batch_size': 10, 'epochs': 10, 'loss': 'squared_hinge', 'neurons': 16, 'optimizer': 'SGD'} 0.645111 (0.456960) with: {'activation': 'relu', 'batch_size': 10, 'epochs': 10, 'loss': 'squared_hinge', 'neurons': 16, 'optimizer': 'Adadelta'}

在下面的步骤中,最佳拟合参数用于同一模型以计算训练数据和测试数据的分数:

model = Sequential()
model.add(Dense(16, activation='relu', input_shape=(3,)))
model.add(Dense(16, activation='relu'))
model.add(Dense(2, activation='softmax'))

model.compile(optimizer='SGD', loss='squared_hinge', metrics=['accuracy'])
model.fit(X_train, y_train, batch_size=10, epochs=20, verbose=1, validation_data=(X_test, y_test))

[test_loss, test_acc] = model.evaluate(X_test, y_test)
print("Evaluation result on Test Data : Loss = {}, accuracy = {}".format(test_loss, test_acc))

所以我们可以在上面的输出中看到我们用于地震预测的神经网络模型表现良好。我希望您喜欢这篇关于如何使用机器学习和 Python 编程语言创建地震预测模型的文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/105191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Datawhale powerful-numpy《从小白到入门》学习笔记

Datawhale powerful-numpy《从小白到入门》学习笔记 持续更新中 文章目录Datawhale powerful-numpy《从小白到入门》学习笔记摘自官方文档的一些话What is NumPy?Why is NumPy Fast?Who Else Uses NumPy?一.创建和生成1.从python列表或元组创建从列表创建从元组创建2.使用ar…

基于ISO13209(OTX)实现引导诊断

在上篇文章《基于ISO13209(OTX)实现EOL下线序列》中,讲到了OTX的由来以及OTX在EOL中的实现案例,而本文将讲述OTX的另一个广阔应用场景——定义引导诊断序列。 一 何为引导诊断? 引导诊断,通常也称为“引导…

市面上有哪些自动生成报表的工具?

每到月末、季度、年底,就是企业里各营销、财务、运营、企管等各部门“摆数据、晒业绩”的时候,除了财务因为有规范的制度约束,在规则和工具上更有保障(最常见的就是在财务软件/ERP 里面自动生成三大周报)之外&#xff…

GoPass系列免杀基础(一)

Goby社区第 23 篇插件分享文章 全文共:7730 字 预计阅读时间:20 分钟 小板凳提示:过数字全家桶(开启晶核)、某绒、卡巴、WD、某管家、魔法保姆、机器人、橘子,全程新手简单版,欢迎师傅们来交流…

一个被迫毕业面试 30 家公司,终于上岸了的Java老前辈的经验分享!

今天分享一个朋友的经历,被“毕业”后的求职经历: 在老东家干了 6 年,发展一般,很想出去,但是一直没有合适的机会,只好一边准备面试一边学习。让我没有想到的是,突然收到了“毕业”通知&#x…

大数据Kudu(十):Flink操作Kudu

文章目录 Flink操作Kudu Flink操作Kudu Flink主要应用场景是流式数据处理上,有些公司针对流式数据使用Flink实时分析后将结果存入Kudu,例如快手公司。这里将实时计算的结果存入Kudu需要自定义Flink Kudu Sink。 场景:Flink实时读取Socket数据,将结果存入Kudu表t_flink_re…

详解OpenCV的椭圆绘制函数ellipse()

函数ellipse()用于在图像上绘制椭圆。 有两种原型,这里只列出常用的那种。 C原型如下: void cv::ellipse(InputOutputArray img,Point center,Size axes,double angle,double startAngle,double endAngle,const Scalar & color,int thickness 1,…

地统计插值学习心得(三)ArcGIS Pro与ArcMap软件中地统计分析的区别

前言 ArcMap中地统计分析由来已久,很多GIS专业的同学学习地统计内容都是在ArcMap软件中实现的,随着IT技术的发展,ArcGIS系列软件架构也发生了重大变化,传统的ArcMap软件已不太能够满足当前的应用需求,在此背景下,ESRI推出了64位的ArcGIS Pro桌面软件,来实现二三维一体化…

【关于时间序列的ML】项目 4 :使用机器学习预测迁移

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

【关于2022年卡塔尔世界杯】

2022卡塔尔世界杯最全面的看点和分析,相信一定有你感兴趣的一点,相信一定会有你感兴趣的,推荐点赞收藏~~ 2022年世界杯比以往任何时候都晚,因为卡塔尔太热了…… 然而,四年一度的世界杯终于……来了 今年的世界杯&am…

非零基础自学Golang 第14章 反射 14.1 反射定义

非零基础自学Golang 文章目录非零基础自学Golang第14章 反射14.1 反射定义14.1.1 反射的定义14.1.2 与其他语言的区别第14章 反射 我们常用的一个打印函数fmt.Println()可以打印任何类型的数据,但是它本身是怎么实现的呢? 解读源码可以看到&#xff0c…

人员定位系统如何实现对人、车、物的安全管控?

人员定位系统是采用物联网设计理念,通过结合定位基站、视频监控、人脸抓拍、巡更、门禁、道闸、梯控等系统,对管控区域工作人员、访客、巡检人员进行精细化、规范化、智能化理。 智慧安全的概念随着物联网技术的发展逐渐成为发展趋势,人员定位…

【Python机器学习】卷积神经网络Vgg19模型预测动物类别实战(附源码和数据集)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 典型神经网络 在深度学习的发展过程中,出现了很多经典的卷积神经网络,它们对深度学习的学术研究和工业生产斗起到了促进的作用,如VGG ResNet Inception DenseNet等等,很多实际…

偷偷告诉你!与其辞职,不如用Python做月入过万的副业兼职

我想辞职! 这是不是当下的你?在这个疫情当下的时代,许多打工人都有过这么一个想法,或许是因为工作待遇、亦或许是其他原因,但是却仍然屹立在工位上,有的甚至天天喊辞职,月月拿满勤。这是为什么…

阿里大牛解析微服务架构:Docker,Spring全家桶,分布式,数据库

前言 微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。你可以将其看作是在架构层次而非获取服务的类上应用很多SOLID原则。微服务架构是个很有趣的概念,它的…

【愚公系列】2022年12月 使用Jenkins实现程序的自动化发布

文章目录前言一、使用Jenkins实现程序的自动化发布1.安装Jenkins二、安装Gitee插件前言 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进…

如何用 Prometheus 和 Grafana 实现集群的监控预警

在读写、查询等高并发场景中,了解资源的使用情况能快速定位性能的瓶颈所在。本教程提供对多(或单)服务器及 DolphinDB 高可用集群(或单节点)资源的监控、告警、预警方案。本教程使用开源软件 Prometheus, Grafana 及对…

Git实战(四)| Git分支管理实操,搞定在线合并和本地合并

类似于SVN这种集中式版本管理,三年前刚来上海工作时候,在华为驻场上班,华为用的就是SVN,印象最深的就是那个小乌龟的图标;后来到外面工作,渐渐发现用Git的非常多,慢慢学习了解发现Git这种分布式…

5年Crud的我,啃完这份Java王者级核心宝典,成功入职阿里(P7)

我有话要说,请仔细看完 我发现一个现象,很多开发5年的程序员仍然停留在crud的阶段,这是什么原因?最主要的原因就是基础很差,尤其对于JVM和并发编程这方面掌握的比较差,而JVM和并发编程就是非常非常重要的基…

40问 深度挖掘Kafka,你能答上几个?

Kafka最初是由Linkedin公司开发的,是一个分布式的、可扩展的、容错的、支持分区的(Partition)、多副本的(replica)、基于Zookeeper框架的发布-订阅消息系统,Kafka适合离线和在线消息消费。它是分布式应用系…