基于机器学习的台风灾害评估分析

  • Post author:
  • Post category:其他


世界气象组织定义:中心持续风速在12级至13级(即每秒32.7米至41.4米)的热带气旋为台风或飓风。

台风作为自然灾害之一

,形成于热带或副热带26℃以上广阔海面上的热带气旋,其巨大的破坏力主要由强风、暴雨和风暴潮三个因素造成,具有

突发性强,破坏力大

等特点。我国沿海城市在夏季经常会受到台风造成的经济影响、社会影响,对此我以机器学习相关算法拟定一个台风灾害评估分析的流程系统,为灾害有关管理部分提供智能决策支持。

大题流程如下

首先是收集台风造成影响的相关信息,例如造成经济损失、人口伤亡、转移

安置(万人)、受灾面积(万公顷)等等对社会的影响信息,还有一方面数据是台风的基本信息,例如风速、气压、风力等级等等。

将数据的属性值进行标准化(x-min/max-min)

使用K均值聚类分析、系统聚类分析、密度聚类(DBSCAN)分析三种算法对历史台风的数据进行聚类整合分类,并自定义灾害评估模型,分别设置影响等级。

当一个台风来临后,可利用knn算法对其进行预测评估,根据之前聚类分析的模型,得出相应的预测分类结果,借鉴相应类别的历史台风获取有效的决策信息,对防护措施进行完善部署。

其中有借用spss等相关软件进行实现算法

部分代码如下:

密度聚类(DBSCAN)

import pandas as pd
from sklearn.datasets import load_iris
from sklearn.cluster import DBSCAN
import xlrd
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
worksheet = xlrd.open_workbook('C:/Users/JayDen/Desktop/模型数据2.xls')
sheet = worksheet.sheet_by_name('Sheet1')
x=[]
for i in range(1,52):
    Typhoon_data=[sheet.row_values(i)[2]]+[sheet.row_values(i)[5]]+[sheet.row_values(i)[8]]+[sheet.row_values(i)[9]]
    x.append(Typhoon_data)
x = np.array(x)
x_db = DBSCAN(eps=20, min_samples=4).fit_predict(x)
# 统计每一类的数量
#counts = pd.value_counts(x_db, sort=True)
#print(counts)
nl = [i+1 for i in x_db]
print(nl)

KNN算法:

from numpy import *
import operator
import xlrd
def createDataSet():
    worksheet = xlrd.open_workbook('C:/Users/JayDen/Desktop/模型数据5.xls')
    sheet = worksheet.sheet_by_name('Sheet1')
    x = []
    labels=[]
    for i in range(1, 44):
        Typhoon_data = [sheet.row_values(i)[2]] + [sheet.row_values(i)[5]] + [sheet.row_values(i)[8]] + [
            sheet.row_values(i)[9]]
        x.append(Typhoon_data)
    group = array(x)
    for i in range(1, 44):
        labels.append(sheet.row_values(i)[12])
    return group, labels
def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]  # shape[0]表示矩阵有多少行 shape[1]表示矩阵有多少列
    diffMat = tile(inX, (dataSetSize,1)) - dataSet  # 计算Ai-Bi
    sqDiffMat = diffMat**2  #计算(Ai-Bi)^2
    sqDistances = sqDiffMat.sum(axis=1) # 计算(A0-B0)^2+...+(Ai-Bi)^2
    distances = sqDistances**0.5    # 计算((A0-B0)^2+...+(Ai-Bi)^2)^0.5 也就是欧式距离
    sortedDistIndicies = distances.argsort()    # 得到数组的值按递增排序的索引
    classCount = {}
    for i in range (k): #距离最近的k个点
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel, 0)+1    # 如果voteIlabels的key不存在就返回0
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]
a=float(input('请输入最高强度风速级别:'))
b=float(input('请输入登陆时风速级别:'))
c=float(input('请输入造成的直接经济损失:'))
d=float(input('请输入造成的死亡人数:'))
forecast_DATA=[a,b,c,d]
print("分析判断此次台风的影响等级为:"+str(classify0(forecast_DATA,createDataSet()[0],createDataSet()[1],3)))

举例预测:



版权声明:本文为qq_66183206原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。