说是无模型,其实还是有模型的,但相对于“传统”的车辆跟驰模型来说,没有用事先假设的模型来构建一个框架,然后用数据来校准模型的参数。采用的是从实测数据出发,先对数据进行聚簇分类,然后拟合分类中的数据,并训练SVM模型。
对数据进行聚簇分类,采用的是层次聚类的思想,从底层开始向上构建,用簇内聚合度和簇间分离度来评价聚类质量。对高维,大数据量的数据集也有较好的效率。对非凸数据簇也能很好的识别。嘿嘿,当然不是我自己想出来的,是参考陈黎飞的文章。
上面的层次聚类方法属于离线计算方法,不适合在仿真运行中使用,因此需要一个能够对分类很好识别的方法。SVM方法就是这样一个满足需求的好方法,能从分类数据中找出若干“支持向量”,使得结构风险最小。
用SVM在线识别出新的数据点属于哪个分类后,还要根据该分类中训练数据给出的规律求出新的数据点对应的加速度值。这个规律如何得到呢?当然是要用数据拟合的方法,由分类中的训练数据拟合出一个函数。如何拟合呢?还是SVM!SVM除了可以用来分类外,还能用于回归,也就是拟合啦~原理和分类时的类似,找出若干“支持向量”,用来勾画出拟合的函数。
在用libsvm进行SVM的编程时,发现文档中说SVM的参数选择对于分类和拟合的效果(精度)有很大的影响。默认的搜索参数的方法是所谓的“网格”(grid)方法,也就是在参数的取值空间内隔一段取一个值,构成一张网,在取值空间内这么一过滤,就能筛出好的参数值了!说白了,这就是暴力搜索,网格越密,越能搜出好的参数值,但是所消耗的时间也就越长!SVM用于分类要搜索c和g两个参数值,用于拟合要搜索c,g和p三个参数值,因为不知道可能的参数值取值范围多大合适,我就把取值范围放宽了一点,网格取密了一点,结果拟合的参数算了好几天也没算出个结果出来!!
最后决定采用PSO(粒子群优化)算法来搜索参数值。PSO算法比较简单,收敛速度快,但容易收敛于局部最优,因此有各种的改良版本。看了国内两位作者的极值扰动的改良版本,受到了启发,又做了一些改进,就用它了!
实测数据用的还是那次跑车的数据,看看效果如何。必须要指出的是,无模型车辆跟驰建模对于数据的要求很高,要求能尽量覆盖所有的情况,没有覆盖到的情况当然无法得出对应的分类,也就无法在仿真中遇到相应情况时提供合理的反应。这也就自然的引出了下面的工作:虚拟测试及数据采集系统的研究。
没有评论:
发表评论