目录
3.4 判断每一辆出租车的OD数据中最靠近整点时刻的记录(采用字典形式储存)
3.5 将每一整点时刻出租车的经纬度信息导出成excel文件便于下一步操作
4.1 手工计算(不使用现成的库,使用1点时刻的数据进行测试)
前言:
本文的内容是“城市大数据分析与应用”课程作业的部分展示,使用的是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