DBSCAN 用于按位置和密度对数据进行聚类
DBSCAN for clustering data by location and density
我正在使用 dbscan::dbscan 方法按位置和密度对我的数据进行聚类。
我的数据是这样的:
str(data)
'data.frame': 4872 obs. of 3 variables:
$ price : num ...
$ lat : num ...
$ lng : num ...
现在我使用以下代码:
EPS = 7
cluster.dbscan <- dbscan(data, eps = EPS, minPts = 30, borderPoints = T,
search = "kdtree")
plot(lat ~ lng, data = data, col = cluster.dbscan$cluster + 1L, pch = 20)
但结果一点都不令人满意,点没有真正聚类。
我想要很好地定义集群,像这样:
我也试过使用决策树分类器tree:tree效果更好,但我不知道它是否真的是一个很好的分类。
文件:
http://www.file-upload.net/download-11246655/file.csv.html
问题:
- 是否可以达到我想要的效果?
- 我使用的方法正确吗?
- 我应该多玩参数吗?如果是,与哪个?
这是使用全新的 HDBSCAN* 算法density-based聚类的结果。
使用 Haversine 距离,而不是欧氏距离!
它确定了一些 50 多个区域,这些区域 比周围环境 密度大得多。在此图中,一些簇看起来好像只有 3 个元素,但它们确实有更多。
最外面的区域,这些是根本不属于任何簇的噪声点!
(使用的参数:-verbose -dbc.in file.csv -parser.labelIndices 0,1 -algorithm clustering.hierarchical.extraction.HDBSCANHierarchyExtraction -algorithm SLINKHDBSCANLinearMemory -algorithm.distancefunction geo.LatLngDistanceFunction -hdbscan.minPts 20 -hdbscan.minclsize 20
)
OPTICS 是另一种 density-based 算法,结果如下:
同样,我们有一个 "noise" 带红点的区域一点也不密集。
使用的参数:-verbose -dbc.in file.csv -parser.labelIndices 0,1 -algorithm clustering.optics.OPTICSXi -opticsxi.xi 0.1 -algorithm.distancefunction geo.LatLngDistanceFunction -optics.minpts 25
该数据集的 OPTICS 图如下所示:
你可以看到有很多小山谷对应着星团。但是这里没有"large"结构
您可能正在寻找这样的结果:
但实际上,这是一种无意义而是随机将数据分成大块的方式。当然,它最大限度地减少了方差;但它根本不关心数据的结构。 一个簇中的点通常比不同簇中的点具有更少的共同点。只需查看红色、橙色和紫色簇之间边界处的点。
最后但同样重要的是,老朋友:具有完整链接的层次聚类:
和树状图:
(使用的参数:-verbose -dbc.in file.csv -parser.labelIndices 0,1 -algorithm clustering.hierarchical.extraction.SimplifiedHierarchyExtraction -algorithm AnderbergHierarchicalClustering -algorithm.distancefunction geo.LatLngDistanceFunction -hierarchical.linkage CompleteLinkageMethod -hdbscan.minclsize 50
)
还不错。完整链接也可以很好地处理此类数据。但是您可以合并或拆分这些集群中的任何一个。
您可以使用名为 Hullplot
的东西
在你的情况下
hullplot(select(data, lng, lat), cluster.dbscan$cluster)
我正在使用 dbscan::dbscan 方法按位置和密度对我的数据进行聚类。
我的数据是这样的:
str(data)
'data.frame': 4872 obs. of 3 variables:
$ price : num ...
$ lat : num ...
$ lng : num ...
现在我使用以下代码:
EPS = 7
cluster.dbscan <- dbscan(data, eps = EPS, minPts = 30, borderPoints = T,
search = "kdtree")
plot(lat ~ lng, data = data, col = cluster.dbscan$cluster + 1L, pch = 20)
但结果一点都不令人满意,点没有真正聚类。
我想要很好地定义集群,像这样:
我也试过使用决策树分类器tree:tree效果更好,但我不知道它是否真的是一个很好的分类。
文件:
http://www.file-upload.net/download-11246655/file.csv.html
问题:
- 是否可以达到我想要的效果?
- 我使用的方法正确吗?
- 我应该多玩参数吗?如果是,与哪个?
这是使用全新的 HDBSCAN* 算法density-based聚类的结果。
使用 Haversine 距离,而不是欧氏距离!
它确定了一些 50 多个区域,这些区域 比周围环境 密度大得多。在此图中,一些簇看起来好像只有 3 个元素,但它们确实有更多。
最外面的区域,这些是根本不属于任何簇的噪声点!
(使用的参数:-verbose -dbc.in file.csv -parser.labelIndices 0,1 -algorithm clustering.hierarchical.extraction.HDBSCANHierarchyExtraction -algorithm SLINKHDBSCANLinearMemory -algorithm.distancefunction geo.LatLngDistanceFunction -hdbscan.minPts 20 -hdbscan.minclsize 20
)
OPTICS 是另一种 density-based 算法,结果如下:
同样,我们有一个 "noise" 带红点的区域一点也不密集。
使用的参数:-verbose -dbc.in file.csv -parser.labelIndices 0,1 -algorithm clustering.optics.OPTICSXi -opticsxi.xi 0.1 -algorithm.distancefunction geo.LatLngDistanceFunction -optics.minpts 25
该数据集的 OPTICS 图如下所示:
你可以看到有很多小山谷对应着星团。但是这里没有"large"结构
您可能正在寻找这样的结果:
但实际上,这是一种无意义而是随机将数据分成大块的方式。当然,它最大限度地减少了方差;但它根本不关心数据的结构。 一个簇中的点通常比不同簇中的点具有更少的共同点。只需查看红色、橙色和紫色簇之间边界处的点。
最后但同样重要的是,老朋友:具有完整链接的层次聚类:
和树状图:
(使用的参数:-verbose -dbc.in file.csv -parser.labelIndices 0,1 -algorithm clustering.hierarchical.extraction.SimplifiedHierarchyExtraction -algorithm AnderbergHierarchicalClustering -algorithm.distancefunction geo.LatLngDistanceFunction -hierarchical.linkage CompleteLinkageMethod -hdbscan.minclsize 50
)
还不错。完整链接也可以很好地处理此类数据。但是您可以合并或拆分这些集群中的任何一个。
您可以使用名为 Hullplot
的东西
在你的情况下
hullplot(select(data, lng, lat), cluster.dbscan$cluster)