我很难理解OPTICS聚类算法中的订购概念。
如果有人对命令进行逻辑和直观的解释,并解释res$order
在以下代码中的作用,以及可得到性图(可以通过命令'plot(res )')。
library(dbscan)
set.seed(2)
n <- 400
x <- cbind(
x = runif(4, 0, 1) + rnorm(n, sd=0.1),
y = runif(4, 0, 1) + rnorm(n, sd=0.1)
)
plot(x, col=rep(1:4, time = 100))
res <- optics(x, eps = 10, minPts = 10)
res
res$order
plot(res)
res $ order提供以下输出:
[1] 1 363 209 349 337 301 357 333 321 321 285 253 241 177 153 57 257 29 77 169 105 293 229 145 181 385 393 377 377 317 381 185 117117 [33] 101 9 73 237 397 369 365 273 305 245 249 309 157 345 213 205 97 49 33 41 193 149 17 83 389 25 121 329 5 161 341 217 [65] 189 141 85 53 225 313 289 261 221 173 69 61 297 125 81 133 129 197 109 137 59 93 165 89 21 13 277 191 203 379 399 375 [97] 351 311 235 231 227 71 11 299 271 291 147 55 23 323 219 275 47 263 3 367 331 175 87 339 319 251 247 171 111 223 51 63 [129] 343 303 207 151 391 359 287 283 215 143 131 131 115 99 31 183 43 243 199 79 27 295 67 347 255 239 195 187 139 107 39 119 179 [161] 395 371 201 123 159 91 211 355 103 327 95 7 167 35 267 155 387 383 335 315 315 259 135 15 113 279 373 4 353 265 127 45 37 [193] 19 276 224 361 260 288 336 368 348 292 268 252 120 108 96 96 32 32 340 156 388 372 356 332 304 220 188 168 136 124 56 236 [225] 28 244 392 184 76 380 232 100 116 112 256 72 8 280 64 52 208 172 152 148 360 352 192 192 144 144 284 216 48 84 92 36 20 [257] 212 272 264 200 128 80 180 364 196 12 132 40 324 308 176 164 68 316 312 384 300 344 328 248 204 140 296 24 320 228 60 44 [289] 233 65 400 376 240 163 104 396 307 75 14 325 269 262 234 382 294 206 198 374 310 362 318 318 386 330 330 278 210 298 282 122 98 [321] 34 26 174 142 46 6 62 118 190 202 114 322 286 38 242 394 342 266 162 130 30 182 2 74 314 290 246 194 170 126 158 378 [353] 350 254 226 214 70 18 10 366 354 186 150 86 306 102 338 346 134 250 138 94 78 390 274 274 58 42 258 66 90 146 370 222 218 [385] 326 82 110 270 334 178 166 398 22 50 238 106 154 302 230 54
和'plot'生成了一个我无法发布的可达性图,因为这是我在StackExchange上遇到的第一个问题...但是如果您运行R代码,就可以轻松获得它。
答案 0 :(得分:0)
这是对数据集的重新排序(排列),因此附近的点通常按顺序靠近。
答案 1 :(得分:0)
R包中包含详细说明。
library("dbscan")
vignette("dbscan")
请参阅第 2.2节。 OPTICS:确定聚类结构的订购点
OPTICS提供增强的排序。该算法以 点并扩展其邻域,例如DBSCAN,但它探索了 从最低到最高核心距离的顺序排列的新点。命令 在其中探索点以及每个点的核心和 可达距离是该算法的最终结果。
答案 2 :(得分:0)
我一直在同一个问题上挣扎,经过一番研究,我认为我终于了解了它是如何工作的。
我现在将添加维基百科提供的pseudocode,我对此进行了解释,以作一些解释:
OPTICS(DB, eps, MinPts)
for each point p of DB
p.reachability-distance = UNDEFINED
for each unprocessed point p of DB
N = getNeighbors(p, eps)
mark p as processed
output p to the ordered list # ordered list = final result
# if p is a core point (has at least minPts in the specified radius)
if (core-distance(p, eps, Minpts) != UNDEFINED)
Seeds = empty priority queue
# update the reachability-distance for every neighbour
update(N, p, Seeds, eps, Minpts)
# seeds will have the neighbours wich reachability-distance was updated
# with the selected core point
for each next q in Seeds
N' = getNeighbors(q, eps)
mark q as processed
output q to the ordered list # ordered list = final result
# if the neighbor is a core point, grow the cluster as DBSCAN does
if (core-distance(q, eps, Minpts) != UNDEFINED)
update(N', q, Seeds, eps, Minpts)
update(N, p, Seeds, eps, MinPts)
coredist = core-distance(p, eps, MinPts)
# for every neighbor
for each o in N
if (o is not processed)
new-reach-dist = max(coredist, dist(p,o))
if (o.reachability-distance == UNDEFINED) // o is not in Seeds
o.reachability-distance = new-reach-dist
Seeds.insert(o, new-reach-dist)
else // o in Seeds, check for improvement
if (new-reach-dist < o.reachability-distance)
o.reachability-distance = new-reach-dist
Seeds.move-up(o, new-reach-dist)
从该伪代码中,我得到以下信息:
现在,了解什么是可达距离至关重要。另外,从Wikipedia,我们有:
据我所知,可达距离是从每个点到其最近的核心点的距离。
如果我们看一下伪代码,现在将非常清楚:当一个点的最终可达距离非常大时,这意味着该点距离最近的核心点很远,因此它不会属于任何集群。这就是为什么可到达性图中的峰值表示群集之间的分离……这些峰值表示异常值。实际上,离群值是指可达距离大于指定的epsilon的那些点(它们不在任何核心点附近)。
关于为什么山谷代表集群,这必须与集群增长的方式有关。记住DBSCAN是如何工作的,沿着一连串直接连接的核心点扩展集群...使用OPTICS相同,同时还要考虑到跟踪添加到当前集群的每个点的可达距离。考虑一下簇的形成方式,以了解山谷的含义。