秒懂算法 | 基于K-Means算法的汽车行驶运动学片段的分类

简介: 汽车在行进过程中会产生连续的一组数据,包含加速度,速度等参数,汽车形式运动学片段是指是从一个怠速开始到下一个怠速开始之间的运动行程,通常包括一个怠速部分和一个行驶部分。而怠速指的是汽车停止运动,但发动机保持最低转速运转的连续过程。行驶部分通常包含加速、巡航和减速三种运动模式。

640.jpg


如图1所示为汽车行进过程中产生的数据,图2为一个汽车行驶运动学的片段。

image.png

■ 图1 汽车行进中产生的数据

640.jpg


■ 图2 运动学片段


本文的任务是将汽车行进的数据切分为一个个的运动学片段,再对这些运动学片段进行分类,从而获得每一类运动学片段的代表片段,合成汽车工况。

01、基于K-Means的汽车行驶运动学片段分类

下面用K-Means来对运动学片段进行聚类。聚类时关键的一点在聚类数目的选取上,本文将采取两种方案来对聚类数目进行选取,如代码清单1所示。首先是定义并计算SSE的函数,并绘制出随着聚类数目变化,SSE变化的折线图。

代码清单1 绘制SSE变化曲线图函数

def getSSE(input):
    # 存储不同簇数的SSE值
    distortions = []
    for i in range(1, 11):
        km = KMeans(n_clusters=i, init="k-means++", n_init=10, max_iter=300, tol=1e-4, random_state=0)
        km.fit(input)
        distortions.append(km.inertia_)
    # 绘制结果
    plt.plot(range(1, 11), distortions, marker='o')
    plt.xlabel("Cluster_num")
    plt.ylabel("SSE")
    plt.show()

由于原始数据中,不同特征的量纲不尽相同,如果使用原始数据直接进行聚类,会存在量纲不一致的问题,即数字较大的特征会对模型产生较大影响,因此在进行聚类之前,还需要进行数据归一化的处理,如代码清单2修改main函数为

代码清单2 主函数1

if __name__ == "__main__":
    feature = cutPart()
    scaler = preprocessing.StandardScaler().fit(feature)
    feature = scaler.transform(feature)
    getSSE(feature)

运行main函数,可得SSE变化图如图3所示。

640.jpg


■ 图3 SSE随聚类数目变化折线图

如图3所示,随着聚类数目增多,并没有出现及其明显的手肘,但通过观察可得,当聚类数目为2或3时,误差下降的幅度是最为明显的,从4开始往后,基本上就处于线性递减的状态。因此,最优的聚类数目可能为2、3、4中的某一个。

下面通过轮廓图从另一个角度进行分析。首先是绘制轮廓图有关的函数,如代码清单2所示。

代码清单2 绘制轮廓图函数

def getSilehotte(input, n_cluster):
    km = KMeans(n_clusters=n_cluster, init="k-means++", n_init=10, max_iter=300, tol=1e-4, random_state=0)
    y_km = km.fit_predict(input, n_cluster)
    # 获取簇的标号
    cluster_labels = np.unique(y_km)
    silehoutte_vals = silhouette_samples(input, y_km, metric="euclidean")
    y_ax_lower, y_ax_upper = 0, 0
    y_ticks = []
    for i, c in enumerate(cluster_labels):
        # 获得不同簇的轮廓系数
        c_silhouette_vals = silehoutte_vals[y_km == c]
        c_silhouette_vals.sort()
        y_ax_upper += len(c_silhouette_vals)
        color = cm.jet(i / n_cluster)
        plt.barh(range(y_ax_lower, y_ax_upper), c_silhouette_vals, height=1.0, edgecolor="none", color=color)
        y_ticks.append((y_ax_lower + y_ax_upper) / 2)
        y_ax_lower += len(c_silhouette_vals)

    silehoutte_avg = np.mean(silehoutte_vals)
    plt.axvline(silehoutte_avg, color="red", linestyle="--")
    plt.yticks(y_ticks, cluster_labels + 1)
    plt.ylabel("Cluster")
    plt.xlabel("Silehotte_value")
plt.show()

该函数的输入为特征以及聚类数目,每个聚类数目可得一个轮廓图。如代码清单3修改main函数为

代码清单3 主函数2

if __name__ == "__main__":
    feature = cutPart()
    scaler = preprocessing.StandardScaler().fit(feature)
    feature = scaler.transform(feature)
    getSilehotte(feature, 2)
    getSilehotte(feature, 3)
    getSilehotte(feature, 4)

分别绘制聚类数目为2、3、4时的轮廓图帮助后期分析,运行脚本可得如图4、图5、图6所示。

640.jpg


■ 图4 聚类数目为2时轮廓图

640.jpg


■ 图5 聚类数目为3时轮廓图

640.jpg


■ 图6 聚类数目为4时轮廓图

如图4、图5、图6所示,当聚类个数为2时,轮廓系数表现不错,说明可以有效地聚类。当聚类数目上升到3时,第一类开始出现负值,即聚类效果开始下降,进一步上升到4时,出现了严重的数目不均等,第4类的数目远远小于前三类,基于对轮廓图的分析,可以选择聚类数目为2或者3。

倘若将运动学片段分为3类,并对每一类进行分析,可以发现这三类中,第1类平均速度最高,怠速时间比例最低,代表在畅通路段行驶的工况;第3类平均车速最低,怠速时间比例最高,代表拥堵路段行驶的工况;第2类代表一般工况。

对每一类按照距离聚类中心的距离从小到大进行排序,就可以得到每一类的典型运动学片段。在将这些运动学片段进行组合,就可以最终获得汽车行驶工况。

如图7所示为基于K-Means方法合成的汽车行驶工况。

640.jpg

■ 图7 合成代表工况

目录
相关文章
|
数据采集 机器学习/深度学习 算法
|
2月前
|
传感器 算法
船舶运动控制,PID控制算法,反步积分控制器
船舶运动控制,PID控制算法,反步积分控制器
|
3月前
|
机器学习/深度学习 Dragonfly 人工智能
基于蜻蜓算法优化支持向量机(DA-SVM)的数据多特征分类预测研究(Matlab代码实现)
基于蜻蜓算法优化支持向量机(DA-SVM)的数据多特征分类预测研究(Matlab代码实现)
114 0
|
2月前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
334 0
|
3月前
|
机器学习/深度学习 传感器 数据采集
【23年新算法】基于鱼鹰算法OOA-Transformer-BiLSTM多特征分类预测附Matlab代码 (多输入单输出)(Matlab代码实现)
【23年新算法】基于鱼鹰算法OOA-Transformer-BiLSTM多特征分类预测附Matlab代码 (多输入单输出)(Matlab代码实现)
316 0
|
4月前
|
存储 算法 数据安全/隐私保护
基于FPGA的图像退化算法verilog实现,分别实现横向和纵向运动模糊,包括tb和MATLAB辅助验证
本项目基于FPGA实现图像运动模糊算法,包含横向与纵向模糊处理流程。使用Vivado 2019.2与MATLAB 2022A,通过一维卷积模拟点扩散函数,完成图像退化处理,并可在MATLAB中预览效果。
|
4月前
|
机器学习/深度学习 人工智能 算法
AP聚类算法实现三维数据点分类
AP聚类算法实现三维数据点分类
171 0
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
1154 6
|
6月前
|
传感器 人工智能 算法
企业内训|智能调控系统算法与优化——某汽车厂商
5月9日,东北某市,TsingtaoAI团队为某汽车厂商的智能驾驶业务和研发团队交付“智能调控系统算法与优化”课程。 本课程系统化解析智能调控系统的核心算法原理与前沿优化技术,深度融合经典控制、现代控制及模型预测控制(MPC)三大理论体系,聚焦自动驾驶与工业自动化场景的实践需求。课程从硬件层(传感器、异构计算芯片、执行器)到软件层(闭环反馈、实时优化)逐层拆解系统架构,结合车辆横纵向控制等实际案例,详解PID参数整定、LQR最优控制、MPC多目标优化等关键技术。
169 16
|
10月前
|
机器学习/深度学习 算法 数据可视化
利用SVM(支持向量机)分类算法对鸢尾花数据集进行分类
本文介绍了如何使用支持向量机(SVM)算法对鸢尾花数据集进行分类。作者通过Python的sklearn库加载数据,并利用pandas、matplotlib等工具进行数据分析和可视化。
940 70