轨迹聚类DBSCAN方法代码

轨迹聚类

#encoding:utf-8
# 导入包
import os
import matplotlib
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScaler
import numpy as np

# 获取需要遍历的文件夹中的所有数据名
filename_list = []
for filename in os.listdir('data'):
    filename_list.append(filename)
# 获取所有的数据并合并成一个dataframe
dataframe_all = pd.DataFrame()
for filename in filename_list:
    dataframe = pd.read_excel('data/'+filename,usecols = [1,2,3,6,7,8])
    dataframe_all = dataframe_all.append(dataframe)

# 根据原始绘图结果可以看到,存在两个异常点,大致分布为LAT小于28.84,在前面数据处理的时候删除这两个异常点,重新绘图
# 如果换数据的话,该异常点不一定存在,直接对其进行处理即可
dataframe_all = dataframe_all[~(dataframe_all['LAT'] <= 28.84)]
# 通过观察,如果船speed<10,说明船没有行进,对于研究目标来说属于无效数据,予以删除。
dataframe_all = dataframe_all[~(dataframe_all['SAILSPEED'] <= 10)]

# 提取所有的经纬度
position = []
for i in dataframe_all.values:
    position.append(i.tolist()[1:3])


# # 先绘制一下图,查看一下轨迹的基本分布
# x = []
# y = []
# for i in position:
#     x.append(i[0])
#     y.append(i[1])
# plt.scatter(x,y,s=0.1)
# plt.show()


# 数据标准化处理,这一步是防止算法参数由于输入数据不同而被迫调整
scaler = StandardScaler()
scaler.fit(position)
X_scale = scaler.transform(position)
position = np.array(X_scale)
# DBSCAN聚类,这里面的eps,min_sample参数人为调整
# 一般来说min_samples小,异常点少,但是过少会让算法认定所有数据都正常而无法聚类,eps小,聚的类多
db = DBSCAN(eps=0.046, min_samples=30).fit(position)
# 获得每个点对应的聚类结果的标签
title = db.labels_
# 表示标签一共有哪几种,即分了几类
title_list = list(set(list(title)))
print(title_list)
# 统计各参数组合下的聚类个数(-1表示异常点)
n_clusters = len([i for i in set(db.labels_) if i != -1])
# 异常点的个数,如果异常点个数过多,则说明聚类效果不是特别好
outliners = np.sum(np.where(db.labels_ == -1, 1,0))
# 统计每个簇的样本个数
stats = pd.Series([i for i in db.labels_ if i != -1]).value_counts().values
print(n_clusters,outliners,stats)
# 将每个点对应的聚类结果标记在dataframe数据表后
dataframe_all['title'] = title
print(dataframe_all)

# 提取所有的经纬度
position2 = []
for i in dataframe_all.values:
    position2.append(i.tolist()[1:3])


x = []
y = []
for i in position2:
    x.append(i[0])
    y.append(i[1])

plt.scatter(x,y,c=title,s = 0.1)
plt.show()







你可能感兴趣的:(聚类,python)