如何用DBSCAN结合出租车GPS数据识别乘客热点?求Python实现代码
出租车乘客热点识别:DBSCAN结合GPS数据的Python实现
核心逻辑
利用DBSCAN的密度聚类特性,从出租车GPS数据的上下客点(尤其是下客点,对应乘客目的地)中识别高密度区域,这些区域就是乘客热点。
依赖库安装
先确保安装必要工具包:
pip install pandas numpy scikit-learn matplotlib
完整代码实现
import pandas as pd import numpy as np from sklearn.cluster import DBSCAN from sklearn.preprocessing import StandardScaler import matplotlib.pyplot as plt # ---------------------- 1. 数据加载与预处理 ---------------------- # 替换为你的GPS数据路径(CSV格式,需包含经度lon、纬度lat、上下客状态status) # 假设status字段:1=下客,0=空载,2=载客(可根据你的数据定义调整) df = pd.read_csv('taxi_gps_data.csv') # 筛选下客点(如果需要包含上客点,可改为df[df['status'].isin([1, 2])]) target_points = df[df['status'] == 1][['lon', 'lat']].values # 标准化数据(DBSCAN对距离敏感,标准化能避免经纬度数值差异影响聚类) scaler = StandardScaler() scaled_points = scaler.fit_transform(target_points) # ---------------------- 2. DBSCAN聚类 ---------------------- # 参数说明: # eps: 邻域半径(标准化后的值,对应实际距离可通过scaler反推;若用原始经纬度+haversine距离,需转弧度) # min_samples: 邻域内最少点数,值越大聚类越严格,过滤零散点效果越好 dbscan = DBSCAN(eps=0.001, min_samples=20) cluster_labels = dbscan.fit_predict(scaled_points) # 将聚类结果合并回原数据 result_df = df[df['status'] == 1].copy() result_df['cluster_id'] = cluster_labels # 过滤噪声点(cluster_id=-1表示不属于任何聚类的零散点) hotspot_points = result_df[result_df['cluster_id'] != -1] # ---------------------- 3. 结果可视化与输出 ---------------------- # 绘制热点分布图 plt.figure(figsize=(12, 8)) # 灰色点:所有下客点 plt.scatter(result_df['lon'], result_df['lat'], c='lightgray', s=3, label='All Dropoff Points') # 彩色点:识别出的热点 plt.scatter(hotspot_points['lon'], hotspot_points['lat'], c=hotspot_points['cluster_id'], cmap='coolwarm', s=8, label='Passenger Hotspots') plt.xlabel('Longitude') plt.ylabel('Latitude') plt.title('Taxi Passenger Dropoff Hotspots') plt.legend() plt.show() # 计算并输出每个热点的中心坐标(取聚类内所有点的经纬度均值) hotspot_centers = hotspot_points.groupby('cluster_id')[['lon', 'lat']].mean() print("识别到的乘客热点中心:") print(hotspot_centers)
参数调整技巧
- eps值调整:
- 若用标准化后的数据:eps=0.001对应原始经纬度的差异约为(scaler.scale_ * 0.001),可根据实际地理距离换算(1度经/纬度≈111公里)
- 若直接用原始经纬度计算球面距离,需设置
metric='haversine',并将经纬度转为弧度,eps设为实际距离/地球半径(如100米=0.1公里,eps=0.1/6371≈1.57e-5)
- min_samples值调整:
- 城市核心区域可适当调大(如30),过滤小范围零散点;郊区可调小(如10),避免漏识别小众热点
内容的提问来源于stack exchange,提问作者zhengkoala
相关产品推荐
相关产品推荐

