首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DBSCAN及其索引是否具有相同的距离函数?

DBSCAN及其索引是否具有相同的距离函数?
EN

Stack Overflow用户
提问于 2019-09-25 05:03:23
回答 1查看 184关注 0票数 0

是否要求DBSCAN及其索引具有相同的距离函数?如果不是,需要使用不同距离函数的情况是什么?

Scala代码如何创建DBSCAN和索引:

代码语言:javascript
复制
import de.lmu.ifi.dbs.elki.algorithm.clustering.DBSCAN
import de.lmu.ifi.dbs.elki.algorithm.clustering.gdbscan.parallel.ParallelGeneralizedDBSCAN
import de.lmu.ifi.dbs.elki.data.model.Model
import de.lmu.ifi.dbs.elki.data.{Clustering, DoubleVector, NumberVector}
import de.lmu.ifi.dbs.elki.database.{Database, StaticArrayDatabase}
import de.lmu.ifi.dbs.elki.datasource.ArrayAdapterDatabaseConnection
import de.lmu.ifi.dbs.elki.distance.distancefunction.NumberVectorDistanceFunction
import de.lmu.ifi.dbs.elki.distance.distancefunction.minkowski.SquaredEuclideanDistanceFunction
import de.lmu.ifi.dbs.elki.index.tree.metrical.covertree.SimplifiedCoverTree

def createDatabase(data: Array[Array[Double]], distanceFunction: NumberVectorDistanceFunction[NumberVector]): Database = {
  val indexFactory = new SimplifiedCoverTree.Factory[NumberVector](distanceFunction, 1.3, 20)
  // Create a database
  val db = new StaticArrayDatabase(new ArrayAdapterDatabaseConnection(data), java.util.Arrays.asList(indexFactory))
  // Load the data into the database
  db.initialize()
  db
}

def dbscanClustering(data: Array[Array[Double]], distanceFunction: NumberVectorDistanceFunction[NumberVector]): Unit = {
  // Use the same `distanceFunction` for the database and DBSCAN <- is it required??
  val db = createDatabase(data, distanceFunction)
  val dbscan = new DBSCAN[DoubleVector](distanceFunction, 0.01, 20)
  val result: Clustering[Model] = dbscan.run(db)
  println(s"Number of clusters: ${result.getAllClusters.size()}")
  result.getAllClusters.asScala.zipWithIndex.foreach { case (cluster, idx) =>
    println(s"# $idx: ${cluster.getNameAutomatic}")
    println(s"Size: ${cluster.size()}")
    println(s"Model: ${cluster.getModel}")
}
val inputData: Array[Array[Double]] = ???
dbscanClustering(inputData, SquaredEuclideanDistanceFunction)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-25 09:18:03

该索引只能用于加速度,如果它使用相同的距离函数。有些索引可以支持多个(但不是任意的)距离,例如R*-树可以支持所有的空间距离函数(尽管成功程度不同)。

显然,如果您构建一个索引来加速余弦距离,但是您要求欧几里得最近的邻居,该索引不能也不会被使用。

您不需要使用索引,但如果没有运行时,则为O(n平方);对于索引,它可以更快(取决于参数、维度等-在最坏的情况下,索引是开销)。

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

https://stackoverflow.com/questions/58091467

复制
相关文章

相似问题

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