机器学习-DBSCAN算法追踪新冠肺炎传播
作者:互联网
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import datetime as dt import warnings warnings.filterwarnings('ignore') from sklearn.cluster import DBSCAN #基于密度的聚类算法可以发现任意形状的聚类 #通过在数据集中寻找被低密度区域分离的高密度区域,将分离出的高密度区域作为一个独立的类别
# DBSCAN的优缺点: #优点:不需要用户先验地设置簇的个数,可以划分具有复杂形状的簇,还可以找出不属于任何簇的点。 # 可以对任意形状的稠密数据集进行聚类,相对的,K-Means之类的聚类算法一般只适用于凸数据集。 # 可以在聚类的同时发现异常点,对数据集中的异常点不敏感。 # DBSCAN 比凝聚聚类和 k 均值稍慢,但仍可以扩展到相对较大的数据集。 #缺点: 需要设置eps值
#导入相关数据并查看前5行 df = pd.read_json('livedata.json') df.head()
plt.figure(figsize=(8,6))#开画,设置画的大小 sns.scatterplot(x='latitude',y='longitude',data=df,hue='id') # 根据id进行区分 plt.legend(bbox_to_anchor= [1, 0.5]) # 调整示例的位置
#DBSCAN模型创建一个用于联系人跟踪的模型,该集群将通过过滤集群中的数据来帮助识别感染 def get_infected_names(input_name): #获得受感染的人的名字 epsilon = 0.0018288 # a radial distance of 6 feet in kilometers,设置eps model = DBSCAN(eps=epsilon, min_samples=2, metric='haversine').fit(df[['latitude', 'longitude']])#训练,metric使用haversine(经纬度距离计算公式) df['cluster'] = model.labels_.tolist() #将标签转为数组 input_name_clusters = [] #设置空列表 for i in range(len(df)): if df['id'][i] == input_name: # 如果id==input_name且不在input_name_clusters就添加 if df['cluster'][i] in input_name_clusters: pass else: input_name_clusters.append(df['cluster'][i]) infected_names = [] for cluster in input_name_clusters: if cluster != -1: ids_in_cluster = df.loc[df['cluster'] == cluster, 'id'] for i in range(len(ids_in_cluster)): member_id = ids_in_cluster.iloc[i] if (member_id not in infected_names) and (member_id != input_name): infected_names.append(member_id) else: pass return infected_names
print(get_infected_names("Erin")) epsilon = 0.0018288 # a radial distance of 6 feet in kilometers model = DBSCAN(eps=epsilon, min_samples=1, metric='haversine').fit(df[['latitude', 'longitude']]) labels = model.labels_ fig = plt.figure(figsize=(12,10)) sns.scatterplot(df['latitude'], df['longitude'], hue = ['cluster-{}'.format(x) for x in labels]) plt.legend(bbox_to_anchor = [1, 1]) plt.show()
标签:肺炎,DBSCAN,name,df,cluster,新冠,input,id 来源: https://www.cnblogs.com/158-174/p/16467637.html