思考与改进(KNN算法)

来源:互联网 发布:真心话大冒险软件 编辑:程序博客网 时间:2024/06/08 20:03

思考与改进

论文题目:k-NearestNeighbors on Road Networks: A Journey in Experimentation and In-MemoryImplementation 

一、主要内容

K Nearest Neighbor问题是机器学习中的最经典、最简单,同时也相当重要的基础问题之一,其相关领域的算法很多。十分有趣的是,实际应用中效果较好的大多是那些思想简单,正确性很明显的算法。这也说明了算法简明性的重要意义。

本人通过阅读相关资料对KNN问题的一些算法有了一定了解,在此提出一些自己的想法和探索。

二、可能的改进

1.新的预处理方式

受到Incremental Euclidean Restriction(IER) 算法对IncrementalNetwork Expansion(INE)算法改进思路的启发,可以设计新的KNN算法预处理方式。初始情况下以目标节点q为圆心、与K相关的经验半径长度为半径,在搜索图中画圆,计算圆中包含的目标集合O中的节点个数,若小于K则将这些点全部加入解集合,然后放大圆的半径。若点的个数大于K,则用IER算法在这些可行定点中继续筛选,直到解集合包含K个节点为止。

以上预处理保证了IER算法中的候选解集合一定包含优化解,避免了IER算法的最差情况;画圆可以理解为处理与目标节点q欧氏距离小于一定值的顶点,这点处理起来也很快捷方便;最差情况下每次加入解集合一个顶点,需要画K次圆,但是通过调整每次画圆的半径大小可以避免这种情况,甚至可以引入二分法不断放大和缩小圆的半径大小,来求解。

2.针对复杂街区的对策

如果实际问题抽象出的图形包含复杂街区,则顶点与顶点之间的距离将无法再使用欧式距离来准确衡量,很多基于欧式距离的算法将失效。此时可以将图抽象成点阵,只在同一行或同一列的点之间连线(如果存在倾斜的道路,将这样的线上的点相连)。同时为了避免边过于稠密,可以设置抽象的中间点,将所有共线的点连在抽象点上,抽象点之间连线。此时的图形再使用优先队列优化过的INE算法计算时,效果将事半功倍。

以上处理解决了复杂街区问题,并利用中间点去除了图中很多冗余的边,使得优先队列中重复入队出队的顶点数量大大下降,因而有较好的效果。

3.算法的综合应用

简单的算法经常会有意想不到的效果。INE算法本身针对于数据规模较小的问题具有良好的时空复杂度,所以可以对输入数据规模进行初步判断来决定是否使用INE算法。此外,针对特殊的稀疏图,可以引用DisBrw算法,充分发挥优先队列的优化作用。而大规模数据可以使用稳定的G-tree算法,同时针对数据分布选择不同的哈希表。

0 0