网约车的车辆热点聚类1

类似Uber,需要处理处不同时间段的不同地区的订单热点区域,帮助进行网约车的及时调度处理

每个成交单Order中,都会有订单上车位置的起始经纬度:open_lat , open_lng

那么在这个时间段内,哪些地区是高密集订单区域,好进行及时的调度,所以需要得到不同地区的热力图

初期想法是基于经纬度做聚类操作,典型的聚类算法是K- means,一种基于层次的聚类操作:

但是注意,kmeans是不适合做车辆聚类的,因为未来哪些地方会有订单其实是位置的,而kmeans要求必须制定K值,这就相当于,我最终要分成多少个聚类,显示不合适;

因此,想到了基于密度的聚类,而且不需要制定类别数,还可以自动识别噪点的DBScan算法

dbscan算法的思路:

输入:样本集D=(x1,x2,...,xm),邻域参数(?,MinPts), 样本距离度量方式

    输出: 簇划分C. 

    1)初始化核心对象集合Ω=∅, 初始化聚类簇数k=0,初始化未访问样本集合Γ = D,  簇划分C = ∅
    2) 对于j=1,2,...m, 按下面的步骤找出所有的核心对象:

      a) 通过距离度量方式,找到样本xj的?-邻域子样本集N?(xj)
      b) 如果子样本集样本个数满足|N?(xj)|≥MinPts, 将样本xj加入核心对象样本集合:Ω=Ω∪{xj}
    3)如果核心对象集合Ω=∅,则算法结束,否则转入步骤4.

    4)在核心对象集合Ω中,随机选择一个核心对象o,初始化当前簇核心对象队列Ωcur={o}, 初始化类别序号k=k+1,初始化当前簇样本集合Ck={o}, 更新未访问样本集合Γ=Γ−{o}
    5)如果当前簇核心对象队列Ωcur=∅,则当前聚类簇Ck生成完毕, 更新簇划分C={C1,C2,...,Ck}, 更新核心对象集合Ω=Ω−Ck, 转入步骤3。

    6)在当前簇核心对象队列Ωcur中取出一个核心对象o′,通过邻域距离阈值?找出所有的?-邻域子样本集N?(o′),令Δ=N?(o′)∩Γ, 更新当前簇样本集合Ck=Ck∪Δ, 更新未访问样本集合Γ=Γ−Δ,  更新Ωcur=Ωcur∪(Δ∩Ω)−o′,转入步骤5.

    输出结果为: 簇划分C={C1,C2,...,Ck}

利用java代码实现dbscan:

package com.df.dbscan;
import java.util.ArrayList;

/**
 * Created by angel
 */
public class DBScan {
    private double radius;
    private int minPts;
    /**
     * @param radius 单位米
     * @param minPts 最小聚合数
     * */
    public DBScan(double radius,int minPts) {
        this.radius = radius;
        this.minPts = minPts;
    }

    public void process(ArrayList<Point> points) {
        int size = points.size();
        int idx = 0;
        int cluster = 1;
        while (idx<size) {
            Point p = points.get(idx++);
            //choose an unvisited point
            if (!p.getVisit()) {
                p.setVisit(true);//set visited
                ArrayList<Point> adjacentPoints = getAdjacentPoints(p, points);
                //set the point which adjacent points less than minPts noised
                if (adjacentPoints != null && adjacentPoints.size() < minPts) {
                    p.setNoised(true);
                } else {
                    p.setCluster(cluster);
                    for (int i = 0; i < adjacentPoints.size(); i++) {
                        Point adjacentPoint = adjacentPoints.get(i);
                        //only check unvisited point, cause only unvisited have the chance to add new adjacent points
                        if (!adjacentPoint.getVisit()) {
                            adjacentPoint.setVisit(true);
                            ArrayList<Point> adjacentAdjacentPoints = getAdjacentPoints(adjacentPoint, points);
                            //add point which adjacent points not less than minPts noised
                            if (adjacentAdjacentPoints != null && adjacentAdjacentPoints.size() >= minPts) {
                                //adjacentPoints.addAll(adjacentAdjacentPoints);
                                for (Point pp : adjacentAdjacentPoints){
                                    if (!adjacentPoints.contains(pp)){
                                        adjacentPoints.add(pp);
                                    }
                                }
                            }
                        }
                        //add point which doest not belong to any cluster
                        if (adjacentPoint.getCluster() == 0) {
                            adjacentPoint.setCluster(cluster);
                            //set point which marked noised before non-noised
                            if (adjacentPoint.getNoised()) {
                                adjacentPoint.setNoised(false);
                            }
                        }
                    }
                    cluster++;
                }
            }
            if (idx%1000==0) {
                System.out.println(idx);
            }
        }
    }

    private ArrayList<Point> getAdjacentPoints(Point centerPoint,ArrayList<Point> points) {
        ArrayList<Point> adjacentPoints = new ArrayList<Point>();
        for (Point p:points) {
            //include centerPoint itself
            double distance = centerPoint.GetDistance(p);
            if (distance<=radius) {
                adjacentPoints.add(p);
            }
        }
        return adjacentPoints;
    }

}

我的处理方式:

所以,我只需要将数据从Hbase中查询出来,在封装好具体的需要数据,就可以推送到算法中,最后识别出结果

//查询Hbase操作
 val result = Controll.rowEndFilter2(tableName, startDate, endDate)
//将查询出来的数据组装成算法需要的结构
import scala.collection.JavaConversions._
    for (map <- result) {
      val lon = map.get("open_lng")
      val lat = map.get("open_lat")
      val begin_address_code = map.get("begin_address_code")
      points.add(new Point(lat.toDouble, lon.toDouble,begin_address_code))
    }
//算法处理
val dbScan = new DBScan(radius, density)
dbScan.process(points)
//将java的list转成scala的list
val point_List: List[Point] = JavaConverters.asScalaIteratorConverter(points.iterator()).asScala.toList
//得到每一个族下的坐标系
val groupData: Map[Int, List[Point]] = point_List.groupBy(line => line.getCluster)
//在将结果进一步处理发送出去即可

原文地址:https://www.cnblogs.com/niutao/p/10780175.html

时间: 2024-10-12 05:28:51

网约车的车辆热点聚类1的相关文章

网约车新政落地,易途8网约导游却成了新地图的钻探者

境外接送机与包车游中,就将境外网约导游的服务融入其中,既赋予了网约车不一样的内涵,也形成了和其他国内网约导游的"壁垒",形成了一种垂直极限+广阔蓝海的新体验. 文/张书乐 2016年11月1日,<网络预约出租汽车经营服务管理暂行办法>正式落地,除了网约车终于有了合法身份.城市里好像有点小堵.部分网约车司机做回"黑车"老本行.共享车变成了专车之类的议论外.一批做网约车的平台没工夫参加讨论,已经开始在网约车的其他路线上,开始了新一轮的夺命狂奔. 车+导游都网

网约车合法化,信息安全如何保障

现在的人出行,都开始坐网约车啦,相信最常用的就是滴滴打车等.但是在给生活带来便捷的同时,也要注意个人信息安全,不管是车主还是用户.有没有遇到APP上叫来一辆车,却发现注册信息和实际车辆不符?作为车主明明没有注册却显示个人身份证号码或车辆信息已被注册?这些疑点都给我们一些提示,您的信息可能已经被人盗用了.所以红线科技认为不管是用户还是商业平台都应该做好数据隐私保护. 最近,江西的王姓车主准备注册滴滴快车时发现证件号被占用,事情发生在5月30号左右,当王先生准备好所有个人信息数据按照APP上"快车车

共享经济=临时工,转正的网约车=出租车

网约车司机,基本上都和互助出行的共享原则不搭界,而是一路奔着钱途,做着专职司机或准专职司机的路线而去. 文/张书乐 刊载于<互联网经济>2016年11月刊 在中国,网约车从来就没有真正被赋予共享经济的灵魂.因为从一开始,它就奔着专门赚钱和专门从业的方向一路狂奔. 2016年11月1日,<网络预约出租汽车经营服务管理暂行办法>(以下简称<暂行办法>)正式落地,网约车如同过山车一般,经历了6年的竞争.质疑和争议,终于在中国正式成为了一门合法的生意.但同时,有了"身

网约车新办法,出行改革会改善现状么

之前软件产品网跟各位讨论过,因为各种原因,网约车越来越难打,然后之前本来已经被网约车挤出市场的"黑车党",现在却又有些"死灰复燃"的感觉.而为了更好的服务乘客,布局市场,网约车当然不会坐以待毙,于是出现了新的功能模块,希望以此改变不被看好的现状. 据报道,滴滴就做出了相应的改革,其中一项就是,把快车拼车升级为"站点拼车".做出这项改动的原因有很多,但是滴滴方面认为:根据步行距离.时间.路况等信息数据判断出来的附近最适合的三到五个乘车点,并通过系统

人体姿态估计在网约车风控系统中的应用

网约车公司在运营过程中经常会遇到一个问题,就是如果司机不接单,却把车开出去接乘客,相当于开黑车.那么系统如何发现这种行为,其中就需要人体姿态估计. 相对于传统方法,只识别人体来数人数有一个问题,就是如果乘客之间发生遮挡,或者后排乘客没有露出面部,就会找不到乘客. 使用人体姿态估计的方法就可以在上述情况下也能清楚判断车内人数,并且为车内行为识别提供很好的数据预处理. 该方法对于接入公司平台的出租车公司有很大益处,通过该功能,出租车运营部门可以清楚地知道什么时候该车上有几个人和 正在做什么. 原文地

深圳网约车新政落地 要求车龄未满2年d

近日,韩国全国的可吸入颗粒物浓度一直维持在"差"的水平,令该国民众慨叹,"即使雨过之后也很难看到蓝天".韩国<中央日报>21日报道称,上个月,韩国环境部发表分析报告称,国内可吸入颗粒物的"国外影响"最大达到86%,实际上将中国指为"罪魁祸首".但该报援引多领域专家的观点说,在这个问题上,韩政府不应一味责怪中国.韩国环境部一直声称,来自中国的可吸入颗粒物的影响平时为30%至50%,在浓度高时为60%至80%.甚至有韩

酒后本已放弃抢劫 他却因一句话杀害网约车司机o

2016年,Laox在日本多次赞助体育活动,如全权冠名首届日本华侨华人马拉松接力赛,组织华人球迷迎接并助阵苏宁足球队来日参加亚冠赛等,促进了在日华侨华人团体之间的相互交流,助推了在日侨胞的健康意识及文体活动,也促进了中日体育交流,获得了华人社会的称赞.如果总统一家希望在公共区域.白宫一层或是历史人物的房间(如林肯的卧室)有所改动,他们必须参考白宫维护委员会的意见. 如果西方都接受印度作为一个核国家,并且对印巴搞核竞赛也觉得无所谓,那么中国就没必要非站出来死扛一些原则.而且印度能够得到的一些核便利

深圳网约车实施细则正式落地 设3年过渡期ph

"流放为奴" 土耳其媒体公布了嫌疑人的照片,并称是从警方获得的. "学完之后就飞出去谈,谈完回来再思考,我就当作是教学相长."渐渐地,曾宪章发现,老师有时甚至还会请他来讲授实际经验,而他也不再只是"技术宅",销售.财务.行政,都有所了解.再面对市场时,他已然更加自信从容.<英国房产投资指南>总编辑范慧勇接受采访时表示,受"脱欧"的不确定性影响,今年英国住宅市场将持续当前的低迷行情.机构大多预测今年英国平均房价上涨将

网传车易拍危在旦夕,其现金仅够支持一个月

近日,有知情人士爆料,国内老牌二手车电商车易拍的资金链已断裂,公司运营严重受阻,现正急于寻找接盘侠为其"续命".该爆料人还称,目前车易拍的每月真实交易量已不足千台,多数分公司已停运,账面现金只够支持一个月,如再无资金入账,恐怕最快月底就会宣告破产. 听到这个消息恐怕大多数人都会震惊,其实细细分析其中缘由不难发现早有先兆.早在去年,就有消息传出,车易拍内部大幅裁员"过冬",且为了寻求资本介入通过数据造假的行为掩盖交易量快速下滑的现状.而残酷的事实却是主打的同步拍和快易