世界气象组织定义:中心持续风速在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 版权协议,转载请附上原文出处链接和本声明。