查看原文
其他

高斯混合模型判定交通拥堵状态

武辛 地学分析与算法 2022-05-17


K-Means是聚类算法中一个常用的方法,是一种非监督学习方法。该方法是从杂乱的数据中找到k个簇。该方法简单,但是依然存在一些缺点,如:1.K-Means方法在划分簇时通常是呈圆形,但是,如果数据的实际分布可能为椭圆形时,K-Means方法效果可能不佳。2. 无法得到每个样本被划分到每个簇的概率。高斯混合模型却能够有效克服这两个缺点。因此,今天将介绍高斯混合模型,并采用该模型来判定道路拥堵状态。
高斯混合模型(Gaussian Mixed Model,GMM)也是一种常见的聚类算法,与K均值算法类似,同样使用了EM算法进行迭代计算。高斯混合模型假设每个簇的数据都是符合高斯分布(又叫正态分布)的,当前数据呈现的分布就是各个簇的高斯分布叠加在一起的结果。


1交通流参数在交通流理论中,有三个参数来描述交通流:1.交通流量(Flow): 是单位时间内通过道路指定断面的车辆数(辆/h);
2.交通流速度(Speed): 即交通流的流速(m/s);
3.交通流密度(Density): 是单位道路长度内的车辆数(辆/公里).
这三者的关系为:
Flow = Speed * Density
如图,当道路车辆数较少时(即不拥堵状态, Free flow),车速通常较大;随着车辆增多(崩溃阶段, Breakdown), 密度变大,车速会降低,但是流量依旧增大;当流量达到最大流量时,道路车辆再增加,密度变大,车辆速度继续降低,流量开始降低;当密度过大(即拥堵状态, Congested),此时,速度低,流量低。

根据Polson et al.(2017)的研究,定义了三种交通流转换状态(Free flow, Breakdown, Recovery), 如下图:

因此,我们将交通状态分为(不拥堵,中间态(包含崩溃和恢复阶段),拥堵),并采用高斯混合模型对Flow-Speed数据进行交通状态判定。

2数据展示

此数据集包含交通流速度和交通流量数据,是某段道路一个月所有周一两分钟一个间隔的采样数据,其3D柱状图如下:

将速度-流量划分网格,柱子高度表示频数,颜色越深的部分表示频数越大。可以比较明显的看出三种状态,代码如下:
# author: geo_data_analysis@163.comdef show3D_Frequency(x, y): fig = plt.figure() ax = fig.add_subplot(111, projection = '3d')
# 划分格网统计频数 hist, xedges, yedges = np.histogram2d(x, y, bins=(50,30), normed = True) xedges = xedges + (xedges[1] - xedges[0]) / 2 yedges = yedges + (yedges[1] - yedges[0]) / 2 xpos, ypos = np.meshgrid(xedges[:-1], yedges[:-1], indexing="ij") r_xpos = xpos.ravel() r_ypos = ypos.ravel()
dx = xedges[1] - xedges[0] dy = yedges[1] - yedges[0] dz = hist.ravel()
ax.bar3d(r_xpos, r_ypos, np.zeros(len(r_ypos)), dx, dy, dz, zsort='average') max_z = max(dz) CS = ax.contourf(xpos, ypos, dz.reshape((len(xpos), -1)), zdir='z', offset = -max_z, cmap=cm.coolwarm) #cm.coolwarm viridis levels = CS.levels[::2] CS2 = ax.contour(xpos, ypos, dz.reshape((len(xpos), -1)), levels = levels, zdir='z', offset = -max_z, colors = 'r', linewidths=(2,), origin = "lower")
cbar = fig.colorbar(CS) cbar.ax.set_ylabel('Frequency') cbar.add_lines(CS2)
ax.set_xlabel('SPEED') ax.set_ylabel('FLOW') ax.set_zlim(-max_z) ax.view_init(27, -135)
ax.set_zlabel('Frequency')
plt.show()
3密度估计

对柱状图进行密度估计,如图:


4状态判定

因此我们可以根据Speed-Flow数据来判定该道路此时的拥堵状态:

代码如下:
# author: geo_data_analysis@163.comdef GMM_Predict(x, y): # 训练 X_train = np.array([x, y]).T gmm = mixture.GaussianMixture(n_components = 3, max_iter = 1000000) gmm.fit(X_train)
# 预测类别 labels = gmm.predict(X_train)
# 预测每类的概率 pre_Y = gmm.predict_proba(X_train) print(pre_Y)
# 画图 plt.scatter(X_train[:, 0], X_train[:, 1], c = labels, s=40, cmap = 'viridis'); plt.show()

参考文献:
Polson, N. , & Sokolov, V. . (2017). Bayesian particle tracking of traffic flows. IEEE Transactions on Intelligent Transportation Systems, 1-12.
如需源码,请后台回复: "高斯混合"



说说线性规划

泰勒图的MATLAB实现

Python爬取高德地图--瓦片图

ArcPy批量定义投影和批量投影转换

机器人局部规划算法--DWA算法原理

数据分享GIMMS NDVI 3gv1(1982-2015)

ArcGIS时间滑块实现车辆轨迹动态展示

GPS数据处理---在野外采样寻点中的应用

更多精彩推荐,敬请关注我们


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存