首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Elki GDBSCAN Java/Scala -如何修改CorePredicate

Elki GDBSCAN Java/Scala -如何修改CorePredicate
EN

Stack Overflow用户
提问于 2020-12-01 00:56:10
回答 1查看 112关注 0票数 0

elki中的通用dbscan (gdbscan)是如何在Java/Scala中实现的?我目前正在努力寻找一种在elki上实现加权dbscan的有效方法,以弥补加权dbscan的sklearn实现带来的低效。

我现在这么做的原因是因为sklearn在at级的数据集(在云上,在本例中就是我)上的集群上实现dbscan太糟糕了。

例如,我使用数据库创建函数和dbscan函数编写了以下代码,该函数读取数组的数组,并输出集群索引的索引。

代码语言:javascript
复制
/* Libraries imported from the ELKI library - https://elki-project.github.io/releases/current/doc/overview-summary.html */
import de.lmu.ifi.dbs.elki.algorithm.clustering.kmeans.KMeansElkan 
import de.lmu.ifi.dbs.elki.data.model.{ClusterModel, DimensionModel, KMeansModel, Model} 
import de.lmu.ifi.dbs.elki.data.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.minkowski.SquaredEuclideanDistanceFunction
import de.lmu.ifi.dbs.elki.distance.distancefunction.minkowski.EuclideanDistanceFunction
import de.lmu.ifi.dbs.elki.distance.distancefunction.NumberVectorDistanceFunction
import de.lmu.ifi.dbs.elki.algorithm.clustering.DBSCAN

// Imports for generalized DBSCAN
import de.lmu.ifi.dbs.elki.algorithm.clustering.gdbscan // Generalized dbscan function here required for weighted dbscan
import de.lmu.ifi.dbs.elki.algorithm.clustering.gdbscan.CorePredicate // THIS IS IMPORTANT TO GET GENERALIZED DBSCAN
import de.lmu.ifi.dbs.elki.algorithm.clustering.gdbscan.GeneralizedDBSCAN
import de.lmu.ifi.dbs.elki.utilities.ELKIBuilder

import de.lmu.ifi.dbs.elki.database.relation.Relation
import de.lmu.ifi.dbs.elki.datasource.DatabaseConnection
import de.lmu.ifi.dbs.elki.database.ids.DBIDIter
import de.lmu.ifi.dbs.elki.index.tree.metrical.covertree.SimplifiedCoverTree
import de.lmu.ifi.dbs.elki.data.{`type`=>TYPE} // Need to import in this way as 'type' is a class method in Scala
import de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.rstar.RStarTreeFactory // Important

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

def dbscanClusteringOriginalTest(data: Array[Array[Double]], distanceFunction: NumberVectorDistanceFunction[NumberVector] = SquaredEuclideanDistanceFunction.STATIC, epsilon: Double = 10, minpts: Int = 10) = {
  // Use the same `distanceFunction` for the database and DBSCAN <- is it required??
  val db = createDatabaseWeighted(data, distanceFunction)
  val rel = db.getRelation(TYPE.TypeUtil.NUMBER_VECTOR_FIELD) // Create the required relational database
  val dbscan = new DBSCAN[DoubleVector](distanceFunction, epsilon, minpts) // Epsilon and minpoints needed - either you define in the function input, or will use default values
  val result: Clustering[Model] = dbscan.run(db)
  var ClusterCounter = 0 // Indexing the number of datapoints allocated from DBSCAN

  result.getAllClusters.asScala.zipWithIndex.foreach { case (cluster, idx) =>
    println("The type is " + cluster.getNameAutomatic)
    /* Isolate only the clusters and store the median from the DBSCAN results */
    if (cluster.getNameAutomatic == "Cluster" || cluster.getNameAutomatic == "Noise") {
      ClusterCounter += 1
      val ArrayMedian =  Array[Double]()
      println(s"# $idx: ${cluster.getNameAutomatic}")
      println(s"Size: ${cluster.size()}")
      println(s"Model: ${cluster.getModel}")
      println(s"ids: ${cluster.getIDs.iter().toString}")
    }
  }
}

我可以让它非常高效地运行,但我目前正在努力研究如何使用gdbscan函数获得类似的效果。例如,有一个答案建议这可以通过修改ELKI上的CorePredicate (sample_weight option in the ELKI implementation of DBSCAN)来完成,但我不确定如何实现这一点。

如有任何建议,我们将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2020-12-02 08:47:26

实现您自己的GDBSCAN核心谓词。

而不是像标准实现中那样计算邻居,而是添加它们的权重。

然后,对DBSCAN进行加权。

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

https://stackoverflow.com/questions/65077844

复制
相关文章

相似问题

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