采用 K-Means 聚类算法分析 GPS 轨迹

简介: 本文基于K-Means 聚类算法分析 GPS 轨迹,并给出数据集和详细代码

数据集来源Geolife

加载数据

importnumpyasnpimportmatplotlib.pyplotaspltimportpandasaspdimportosfrommatplotlib.colorsimportrgb2hexfromshapely.geometryimportMultiPointfromgeopy.distanceimportgreat_circlefromsklearn.clusterimportKMeansfromsklearn.clusterimportDBSCANuserdata='../Lab-work/Geolife Trajectories 1.3/Data/001/Trajectory/'filelist=os.listdir(userdata)
names= ['lat','lng','zero','alt','days','date','time']
df_list= [pd.read_csv(userdata+f,header=6,names=names,index_col=False) forfinfilelist]  
df=pd.concat(df_list, ignore_index=True)
print(df.head(10))
plt.plot(df.lat, df.lng)
         lat         lng  zero  alt          days        date      time
0  39.984198  116.319322     0  492  39744.245208  2008-10-23  05:53:06
1  39.984224  116.319402     0  492  39744.245266  2008-10-23  05:53:11
2  39.984211  116.319389     0  492  39744.245324  2008-10-23  05:53:16
3  39.984217  116.319422     0  491  39744.245382  2008-10-23  05:53:21
4  39.984710  116.319865     0  320  39744.245405  2008-10-23  05:53:23
5  39.984674  116.319810     0  325  39744.245463  2008-10-23  05:53:28
6  39.984623  116.319773     0  326  39744.245521  2008-10-23  05:53:33
7  39.984606  116.319732     0  327  39744.245579  2008-10-23  05:53:38
8  39.984555  116.319728     0  324  39744.245637  2008-10-23  05:53:43
9  39.984579  116.319769     0  309  39744.245694  2008-10-23  05:53:48
[<matplotlib.lines.Line2D at 0x17efc43eac8>]

39eBMn.png

K-Means

coords=df[['lat','lng']].valuesn_clusters=100cls=KMeans(n_clusters).fit(coords)
colors=tuple([(np.random.random(),np.random.random(), np.random.random()) foriinrange(n_clusters)])
colors= [rgb2hex(x) forxincolors]
fori, colorinenumerate(colors):
members=cls.labels_==iplt.scatter(coords[members, 0], coords[members, 1], s=60, c=color, alpha=0.5)
plt.show()

39mlYF.png

获取 K-Means 聚类结果

cluster_labels=cls.labels_num_clusters=len(set(cluster_labels) -set([-1]))
print('Clustered '+str(len(df_min)) +' points to '+str(num_clusters) +' clusters')
clusters=pd.Series([coords[cluster_labels==n] forninrange(num_clusters)])
print(clusters)
Clustered 9045 points to 100 clusters
0     [[40.014459, 116.305603], [40.014363, 116.3056...
1     [[39.975246000000006, 116.358976], [39.975244,...
2     [[40.001312, 116.193358], [40.001351, 116.1932...
3     [[39.984559000000004, 116.326696], [39.984669,...
4     [[39.964969, 116.434923], [39.964886, 116.4350...
                            ...                        
95    [[40.004549, 116.260581], [40.004515999999995,...
96    [[39.97964, 116.323856], [39.979701, 116.32396...
97    [[40.0009, 116.23948500000002], [40.000831, 11...
98    [[39.962336, 116.32817800000001], [39.96223300...
99    [[39.9663, 116.353677], [39.966291999999996, 1...
Length: 100, dtype: object

获取每个群集的中心点

defget_centermost_point(cluster):
centroid= (MultiPoint(cluster).centroid.x, MultiPoint(cluster).centroid.y)
centermost_point=min(cluster, key=lambdapoint: great_circle(point, centroid).m)
returntuple(centermost_point)
centermost_points=clusters.map(get_centermost_point)
lats, lons=zip(*centermost_points)
rep_points=pd.DataFrame({'lon':lons, 'lat':lats})
print(rep_points)
           lon        lat
0   116.306558  40.013751
1   116.353295  39.975357
2   116.190167  40.004290
3   116.326944  39.986492
4   116.438241  39.961273
..         ...        ...
95  116.256309  40.004774
96  116.326462  39.978752
97  116.232672  39.998630
98  116.328847  39.958271
99  116.358655  39.966451
[100 rows x 2 columns]

描绘中心点

fig, ax=plt.subplots(figsize=[10, 6])
rs_scatter=ax.scatter(rep_points['lon'][0], rep_points['lat'][0], c='#99cc99', edgecolor='None', alpha=0.7, s=450)
ax.scatter(rep_points['lon'][1], rep_points['lat'][1], c='#99cc99', edgecolor='None', alpha=0.7, s=250)
ax.scatter(rep_points['lon'][2], rep_points['lat'][2], c='#99cc99', edgecolor='None', alpha=0.7, s=250)
ax.scatter(rep_points['lon'][3], rep_points['lat'][3], c='#99cc99', edgecolor='None', alpha=0.7, s=150)
df_scatter=ax.scatter(df_min['lng'], df_min['lat'], c='k', alpha=0.9, s=3)
ax.set_title('Full GPS trace vs. DBSCAN clusters')
ax.set_xlabel('Longitude')
ax.set_ylabel('Latitude')
ax.legend([df_scatter, rs_scatter], ['GPS points', 'Cluster centers'], loc='upper right')
labels= ['cluster{0}'.format(i) foriinrange(1, num_clusters+1)]
forlabel, x, yinzip(labels, rep_points['lon'], rep_points['lat']):
plt.annotate(                                                
label,
xy= (x, y), xytext= (-25, -30),
textcoords='offset points', ha='right', va='bottom',
bbox=dict(boxstyle='round,pad=0.5', fc='white', alpha=0.5),
arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0'))
plt.show()

39n7CD.png

目录
相关文章
|
1月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
57 4
|
9天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
21天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
1月前
|
算法 数据挖掘
基于粒子群优化算法的图象聚类识别matlab仿真
该程序基于粒子群优化(PSO)算法实现图像聚类识别,能识别0~9的数字图片。在MATLAB2017B环境下运行,通过特征提取、PSO优化找到最佳聚类中心,提高识别准确性。PSO模拟鸟群捕食行为,通过粒子间的协作优化搜索过程。程序包括图片读取、特征提取、聚类分析及结果展示等步骤,实现了高效的图像识别。
|
28天前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
1月前
|
算法
PID算法原理分析及优化
【10月更文挑战第6天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
2月前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
41 1
|
1月前
|
算法 安全 Go
Python与Go语言中的哈希算法实现及对比分析
Python与Go语言中的哈希算法实现及对比分析
40 0
|
24天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
10天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。