机器学习-DBSCAN算法追踪新冠肺炎传播

2022/7/12 14:24:26

本文主要是介绍机器学习-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算法追踪新冠肺炎传播的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程