首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >改进DBSCAN算法

改进DBSCAN算法
EN

Stack Overflow用户
提问于 2015-12-04 19:40:03
回答 1查看 405关注 0票数 0

我试图自定义DBSCAN算法,以便它也将启动一个新的集群,如果只有x方向中的两点之间的距离大于某个数字,或者只有y方向中的两点之间的距离大于某个数字。但是,我在做这件事上有一些困难。

到目前为止,我的代码如下:

代码语言:javascript
运行
复制
     public void ComputeClusterDbscan(DatasetItem[] allPoints, double epsilon, int minPts, double[] currentpt, double[] nextpt, out HashSet<DatasetItem[]> clusters)
     {
        var allPointsDbscan = allPoints.Select(x => new DbscanPoint(x)).ToArray();

        int clusterId = 0;
        for (int i = 0; i < allPointsDbscan.Length - 1 ; i++)
        {
            int j = i + 1;
            DbscanPoint p = allPointsDbscan[i];
            if (p.IsVisited)
                continue;
            p.IsVisited = true;
            DbscanPoint[] neighborPts = null;
            RegionQuery(allPointsDbscan, p.ClusterPoint, epsilon, out neighborPts);

            //calculate distance between points in x and y directions
            double xDirection = Math.Abs(allPointsDbscan[j].ClusterPoint.X - allPointsDbscan[i].ClusterPoint.X);
            double yDirection = Math.Abs(allPointsDbscan[j].ClusterPoint.Y - allPointsDbscan[i].ClusterPoint.Y);
            if (xDirection > 0.299 | yDirection > 0.199)
            {
                //begin new cluster
            }

            if (neighborPts.Length < minPts)
                p.ClusterId = (int)ClusterIds.Noise;
            else
            {
                clusterId++;
                ExpandCluster(allPointsDbscan, p, neighborPts, clusterId, epsilon, minPts);
            }
        }
        clusters = new HashSet<DatasetItem[]>(
            allPointsDbscan
                .Where(x => x.ClusterId > 0)
                .GroupBy(x => x.ClusterId)
                .Select(x => x.Select(y => y.ClusterPoint).ToArray())
            );
    }
EN

回答 1

Stack Overflow用户

发布于 2015-12-05 11:37:32

您不需要修改DBSCAN就可以做到这一点。

三种解决办法:

  1. 缩放数据集,使x和y阈值可以相互比较,然后使用最大范数。也就是说,如果你有eps_x和eps_y,用1/eps_x乘以你的x坐标,用1/eps_y乘以y坐标,然后使用最大范数的eps=1。
  2. 使用加权最大范数
  3. 使用通用DBSCAN。例如,在ELKI实现中,很容易添加具有两个epsilon参数的新邻居谓词。以交叉口(neighbors_x,neighbors_y)为邻域。

实际上,所有这些方法都会改变"regionQuery“结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34096177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档