基于k-means聚类算法的城市出租车GPS时空分布特征分析

本文使用KMeans聚类算法分析城市出租车GPS数据,揭示不同时间点交通密集区域。通过数据预处理、聚类分析和特征分析,发现深圳主要的5-7个人群密集区域,并探讨了数据中的问题和解决方案。
摘要由CSDN通过智能技术生成

目录

前言:

一、研究目的

二、数据源

三、数据预处理

3.1 通用预处理

3.2 删除出租车数据中载客状态瞬间变化的记录

3.3 获取OD数据

3.4 判断每一辆出租车的OD数据中最靠近整点时刻的记录(采用字典形式储存)

3.5 将每一整点时刻出租车的经纬度信息导出成excel文件便于下一步操作

3.6 绘制散点图和GIS分布图查看效果

四、聚类分析

4.1 手工计算(不使用现成的库,使用1点时刻的数据进行测试)

4.2 使用sklearn库进行批量操作

五、数据特征分析

5.1 簇的数量

5.2 簇的分布状况

5.3 簇中的元素数量

5.4 簇的时间分布特征

小结

六、存在的问题

6.1 整点时刻出租车的GPS定位的插值问题

6.2 样本数量问题

6.3 样本时间问题

6.4 (老师点评补充)

七、代码展示

7.1 将数据整理切分成24个时间段

7.2 导入文件绘制散点图

7.3 不同K值选取的对比

7.4 KMeans的计算与可视化

致谢:

参考资料:


前言:

本文的内容是“城市大数据分析与应用”课程作业的部分展示,使用的是KMeans聚类算法

一、研究目的

        通过统计各个时间节点上出租车的GPS定位数据,分析各时间城市内不同地块的交通密集程度,为道路改建、城市公共空间节点处理提供理论支撑。通过统计各个时间节点上出租车的GPS定位数据,分析各时间城市内交通密集、人群密集的区域地块分布。为可能的道路改建、城市公共空间节点处理等提供理论支撑。

二、数据源

数据来源:https://people.cs.rutgers.edu/~dz220/data.html

这里是站内下载好的数据,可供下载https://download.csdn.net/download/qq_41904236/87670733?spm=1001.2014.3001.5503

        该表格中六列数据分别为:出租车的编号、时间、经度、纬度、是否空载(0-空载,1-载客)、实时速度。 

三、数据预处理

预处理目标:获取某一编号的车辆在整点时的经纬度,即获取数据的最终形态为[carID, time, longitude, latitude]

3.1 通用预处理

删除信息与前后数据相同的数据以减少数据量

如:某个体连续n条数据除了时间以外其他信息都相同,则可以只保留首末两条数据

transbigdata.clean_same(data, col=['VehicleNum', 'Time', 'Lng', 'Lat'])

3.2 删除出租车数据中载客状态瞬间变化的记录

transbigdata.clean_taxi_status(data, col=['VehicleNum', 'Time', 'OpenStatus'], timelimit=None)

3.3 获取OD数据

初始数据:

 处理后数据:

选择OD数据作为经纬度获取的基准

3.4 判断每一辆出租车的OD数据中最靠近整点时刻的记录(采用字典形式储存)

注意: 由于初始数据中时间均不是整点时刻,本次研究中是粗略地将最靠近整点时刻的时间点的经纬度作为目标经纬度,如果需要推断整点时刻的经纬度,则需要做插值运算,若采用线性插值,则会出现插值的点坐标不在道路上的情况(实际上这种情况下可以将该插值点投影到最近道路上,这里由于道路信息缺失未加以考虑)。

3.5 将每一整点时刻出租车的经纬度信息导出成excel文件便于下一步操作

3.6 绘制散点图和GIS分布图查看效果

 

四、聚类分析

4.1 手工计算(不使用现成的库,使用1点时刻的数据进行测试)

此处写了一段递归算法,使用KMeans聚类算法的原始定义进行迭代,其基本流程为:根据给定的K值随机选取原数据点作为初始质心(initCenters)——计算每个点到初始质心的距离,按照最近距离来划分簇——根据划分完成的簇计算新的质心(newCenters)——判断新的质心是否与初始质心一致,若一致,测结束递归,完成聚类;若不一致,则将新的质心赋给初始质心再次迭代。

randomNum = np.random.randint(0,len(xx),size=k)
initCenters = []
for i in randomNum:
    initCenters.append(xx[i])
# 计算每个点和初始中心点的距离
datalen = len(xx)
target = np.full(shape=datalen, fill_value=-1)
def updateCenters(initCenters, counter, limit):
    for i in range(len(xx)):
        dis = []
        for j in range(k):
            dis.append(distance(xx[i],initCenters[j]))
        target[i] = np.argmin(dis)
    newCenters = []
    for i in range(k):
        mean = []
        for j in range(len(xx)):
            if(target[j] == i):
                mean.append(xx[j])
        newCenters.append(np.mean(mean,axis=0))
    if(counter == 0):
        print('未收敛,当前迭代次数为:'+str(limit - counter))
        plt.scatter(x,y,c=target)
        plt.show()
    else:
        if(np.array(newCenters) == initCenters).all():
            print('已收敛,迭代次数为:'+str(limit - counter))
            plt.scatter(x,y,c=target)
            plt.show()
        else:
            counter = counter - 1
            initCenters = np.array(newCenters)
            updateCenters(initCenters, counter, limit)
updateCenters(init
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值