我试图在JAVA中使用ELKI来运行DBSCAN。为了测试,我使用了FileBasedDatabaseConnection。现在我想用自定义对象作为参数运行DBSCAN。
我的对象具有以下结构:
public class MyObject {
private Long id;
private Float param1;
private Float param2;
// ... and more parameters as well as getters and setters
}
我想使用List<MyObject>
作为数据库在ELKI中运行DBSCAN,但是只应考虑一些参数(例如,使用参数param1,param2和param4在对象上运行DBSCAN )。理想情况下,生成的集群包含整个对象。
有没有办法实现这种行为?
如果没有,我如何将对象转换为ELKI理解的格式,并允许我将生成的集群对象与我的自定义对象匹配(即,是否有一种以编程方式设置标签的简单方法)?
以下问题涉及featureVectors:Using ELKI on custom objects and making sense of results
这可能是我的问题的可能解决方案吗?如何从我的List<MyObject>
创建一个特征向量?
答案 0 :(得分:3)
ELKI采用模块化架构。
如果您需要自己的数据源,请查看datasource
包,并实现DatabaseConnection
(JavaDoc)接口。
如果您想处理MyObject
个对象(您上面分享的课程可能会对性能造成重大影响),那并不是特别难。您需要SimpleTypeInformation<MyObject>
(JavaDoc)来标识您的数据类型,为您的数据类型实现PrimitiveDistanceFunction
(JavaDoc)。
如果您的实际数据是花车,我建议您改用DoubleVector
或FloatVector
,并使用例如SubspaceEuclideanDistanceFunction
仅处理您要使用的属性。
对于这些数据类型和许多距离函数,可以使用R * -tree索引大大加快DBSCAN执行时间。
ELKI中的Cluster
(JavaDoc)从不存储点数据。它只存储点DBIDs
(Wiki)。您可以从数据库关系中获取点数据,或者使用例如offsets(Wiki)将它们映射回静态数据库的列表位置。