近些年,随着社会的发展和城市规模的不断拓展,城市人口不断增多,出租车与网约车的数量呈现直线上升的趋势,居民对出租车和网约车的需求量也越来越大。在出租车市场规模快速增长的同时,行业内的竞争也日益激烈,因此怎样进行更好地规划路线、降低出租车的空载时间与空载率,是平台提高运营效率、增加司机收益、减少乘客等待时间提高客户满意度的关键问题。出租车空载时间可以反应出租车资源的利用效率和司机收益状况。客流预测可以有效地指导司机进行合理的路线规划,辅助打车平台进行高效的资源调度。为出租车市场的调配提供指引方向,同时也可以极大地满足乘客的出行需求。

本文使用成都出租车GPS行车轨迹,使用K-means聚类对出租车客流热点区域进行聚类。更进一步组合LSTM和CNN模型进行较为客观的客流量预测数据统计,并通过深度学习将预测结果应用于实践之中对通过预测供需来为平台提前进行出租车调度提供数据支持,提升交通运行效率。

import folium
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import os
from tqdm import tqdm
days = []
path = 'data_small'
for file in tqdm(sorted(os.listdir(path))[:-8]):if os.path.splitext(file)[0][-5:]=='train':days.append(pd.read_csv(os.path.join(path, file)))
data = pd.concat(days)
def inCD(long, lat):size = len(long)isCD = pd.Series([False for i in range(size)])for i, (g, t) in enumerate(zip(long, lat)):if 103.88<=g<=104.53 and 30.05<=t<=31.08:isCD[i] = Truereturn isCD
data = data.loc[inCD(data.iloc[:, 3], data.iloc[:, 2])]
carry = data[data.iloc[:, 4]==1]
empty = data[data.iloc[:, 4]==0]
sample_for_cluster = carry.sample(100000)
from sklearn import cluster
kmean = cluster.KMeans(n_clusters=200)
kmean.fit(sample_for_cluster.iloc[:, 2:4].values)
centers = pd.Series(kmean.labels_)
center_count = centers.value_counts()
start = np.stack([kmean.cluster_centers_[i] for i in center_count[center_count>(len(centers)/100)].index])
kmean2 = cluster.KMeans(n_clusters=len(start), init=start)
classifier = kmean2.fit(sample_for_cluster.iloc[:, 2:4].values)
carry['class'] = classifier.predict(carry.iloc[:, 2:4].values)
hot_label = carry['class'].value_counts().argmax()
classified = carry[carry['class']==hot_label]
carry.groupby(['class']).count
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten, Reshape, Dropout, BatchNormalization
from tensorflow.keras.layers import LSTM, Conv1D, MaxPooling1D
from tensorflow.keras.optimizers import SGD
import tensorflow as tf
from datetime import datetime
import matplotlib.dates as mdates
def clean(df):series = pd.Series([1]*len(df), index=pd.to_datetime(df.iloc[:,5]))series_resample = series.resample('10T').sum()return pd.DataFrame({'time':series_resample.index, 'freq':series_resample.values})
df = clean(classified)
m = max(df['freq'])
s_date = pd.to_datetime('20140823')
train_data = df[df['time']<=s_date]['freq'].values
test_data = df[df['time']>=s_date]['freq'].values
test_data = test_data/m
train_data = train_data/m
train_n = len(train_data)
test_n = len(test_data)
LOOK_BACK = 6
train_x = np.array([train_data[k:k+LOOK_BACK] for k in range(train_n-LOOK_BACK+1)])
train_y = np.array(train_data[LOOK_BACK-1:])
train_x = tf.reshape(train_x, (-1, LOOK_BACK, 1))
test_x = np.array([test_data[k:k+LOOK_BACK] for k in range(test_n-LOOK_BACK+1)])
test_y = np.array(test_data[LOOK_BACK-1:])
test_x = tf.reshape(test_x, (-1, LOOK_BACK, 1))Model = Sequential()
Model.add(Conv1D(50, 3, activation='relu',input_shape=(LOOK_BACK, 1)))
Model.add(MaxPooling1D(2))
Model.add(LSTM(150))
Model.add(Dropout(0.1))
Model.add(BatchNormalization())
Model.add(Dense(1, activation='sigmoid'))
Model.compile(loss='mse', optimizer='Adam')
Model.fit(train_x, train_y, epochs=20, batch_size=16, verbose=1)mse = Model.evaluate(test_x, test_y)
print(f'average mean square error for model: {mse}')
predict_y = Model.predict(test_x)test_time = df[df['time']>=s_date]['time']
time_x = [x.strftime('%H:%M') for x in test_time]
xs = [datetime.strptime(d, '%H:%M') for d in time_x]
ys = test_y*m
yp = predict_y*mplt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
plt.gca().xaxis.set_major_locator(mdates.HourLocator())plt.plot(xs[LOOK_BACK-1:], ys)
plt.plot(xs[LOOK_BACK-1:], yp, 'r')
plt.gcf().autofmt_xdate()
plt.show()
incidents = folium.map.FeatureGroup()
sample_plot = classified.sample(5000)
for lat, lng, in zip(sample_plot.iloc[:, 2], sample_plot.iloc[:, 3]):incidents.add_child(folium.CircleMarker([lat, lng],radius=1,color='yellow',fill=True,fill_color='red',fill_opacity=0.4))
latitude, longitude = kmean2.cluster_centers_[hot_label][0], kmean2.cluster_centers_[hot_label][1]
san_map = folium.Map(location=[latitude, longitude], zoom_start=12)
san_map.add_child(incidents)
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent='user_agent')
location = geolocator.reverse([latitude, longitude])
print(location.address)
carry['class'] = kmean.predict(carry.iloc[:, 2:4].values)
carry.groupby(['class']).count()

结果展示:

模型

MAE        RMSE     MAPE(%)

LSTM        11.5899   23.5917   12.5509

CNN-LSTM      7.3052   15.5747    8.2243

CNN-DNN      16.5264  26.5896   18.2564

SVR         20.5898   30.5698   22.5896

进行消融试验后通过上表显示组合模型要比单独的LSTM模型预测效果优异,各类误差均为最小,其预测的MAE为7.3052,RMSE为15.5747,MAPE为8.2243%。此评价标准的建立进一步显示了该模型在客流预测的优越性。可以充分说明CNN取证捕捉站点间空间相关关系再加上LSTM的时间预测使预测模型相对精确。

K-means聚类后的LSTM-CNN出租车热点区域客流预测相关推荐

  1. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  2. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  3. k means聚类算法_K-Means 聚类算法 20210108

    说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...

  4. 基于小波分解与LSTM的城市轨道短时客流预测

    1.文章信息 文章题为<A novel prediction model for the inbound passenger flow of urban rail transit>,是一篇 ...

  5. k means聚类算法_一文读懂K-means聚类算法

    1.引言 什么是聚类?我们通常说,机器学习任务可以分为两类,一类是监督学习,一类是无监督学习.监督学习:训练集有明确标签,监督学习就是寻找问题(又称输入.特征.自变量)与标签(又称输出.目标.因变量) ...

  6. 基于K均值聚类的葡萄酒品种判别

    特别注意:主要思路.程序和分析过程来源于:https://www.kaggle.com/xvivancos/tutorial-clustering-wines-with-k-means.本文在此基础上 ...

  7. 机器学习(十四):K均值聚类(kmeans)

    k均值聚类方法是一种无监督机器学习技术,用于识别数据集中的数据对象集群.有许多不同类型的聚类方法,但k -means是最古老和最平易近人的方法之一.这些特性使得在 Python 中实现k -means ...

  8. cnn 预测过程代码_【交通+AI】使用CNN+LSTM实时出租车出行预测(上)

    这篇论文主要讲述了使用成都的出租车轨迹数据进行建模后生成出行强度图,使用CNN和LSTM进行学习之后通过反卷积生成出行强度预测图.非常适合上手这个领域,主要有两点原因:第一 出租车出行强度只包含了上车 ...

  9. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

最新文章

  1. Apache htaccess 重写假设文件存在!
  2. opencv阈值分割类型
  3. python 中evaluationcontext是什么_Pytorch evaluation每次运行结果不同的解决
  4. 微信小程序电子画板canvas2d签名小程序插件绝对可用
  5. 法律应是站在加密和隐私这面的……
  6. python模块xlwt怎么用不了_python中使用 xlwt 操作excel的常见方法与问题
  7. 关于回调函数的那点事
  8. Red Hat Enterprise Linux 8.0 正式版镜像下载
  9. [阅读笔记] Java 7 新特性
  10. Hive中排序和聚集
  11. javafx css_JavaFX技巧13:研究Modena CSS文件
  12. 花式模拟【栈结构】做“日志分析”(洛谷P1165题题解,Java语言描述)
  13. python 网页爬虫作业调度_第3次作业-MOOC学习笔记:Python网络爬虫与信息提取
  14. Unity2 学习 制作和动态加载预制体
  15. 用inno 打包程序 学习之路(转载)
  16. 记住不要把Bitmap往List等集合放
  17. 巧用eXeScope修改win2000外观
  18. 不用花钱,免费查看CAD图纸的好用看图软件
  19. oracle12c cdb修改,Oracle 12c nocdb转换成cdb
  20. c语言实验报告(四) 从键盘输入字符串a和字符串b,并在a串中的最小元素(不含结束符)后面插入字符串b....

热门文章

  1. 【Python】uiautomation+openai构建基于chatGPT的微信聊天机器人
  2. oracle vba 数组_vba 创建数据库
  3. knn(k近邻算法)——matlab
  4. 软考和华为认证哪个好?更利于求职?
  5. 如何用树莓派借用计算机的显示屏,笔记本电脑当作树莓派的显示器
  6. SQL 流程控制语句 之五 RETURN语句介绍
  7. SDN 技术指南(一):架构概览
  8. 正则表达式练习(Regex Golf)
  9. MyBatis插件开发原理
  10. tcp float数据传输问题