我正在进行DBSCAN聚类,除了纬度经度之外我还有一个列,我希望看到聚类结果。例如,数据如下所示:
28.6029445 77.3443552 1
28.6029511 77.3443573 2
28.6029436 77.3443458 3
28.6029011 77.3443032 4
28.6028967 77.3443042 5
28.6029087 77.3442829 6
28.6029132 77.3442797 7
现在在minigui如果我将parser.labelindices
设置为2并运行任务,那么输出如下所示:
# Cluster: Cluster 0
ID=63222 28.6031295 77.3407848 441
ID=63225 28.603134 77.3407744 444
ID=63220 28.6031566667 77.3407816667 439
ID=63226 28.6030819 77.3407605 445
ID=63221 28.6032 77.3407616667 440
ID=63228 28.603085 77.34071 447
ID=63215 28.60318 77.3408583333 434
ID=63229 28.6030751 77.3407096 448
所以它仍然连接到我作为label
传递的第3列。我通过传递纬度和经度以及它完全相同来检查聚类结果。所以在某种程度上通过将列作为'标签'我可以在群集结果中使用lat long检索该列。
现在我想在我的java代码中使用它
// Setup parameters:
ListParameterization params = new ListParameterization();
params.addParameter(
FileBasedDatabaseConnection.Parameterizer.INPUT_ID,
fileLocation);
params.addParameter(
NumberVectorLabelParser.Parameterizer.LABEL_INDICES_ID,
2);
params.addParameter(AbstractDatabase.Parameterizer.INDEX_ID,
RStarTreeFactory.class);
但这是NullPointerException
。 MiniGui dbc.parser
默认为NumberVectorLabelParser
。所以这应该工作正常。我错过了什么?
答案 0 :(得分:3)
我将查看NPE,它应该返回更有用的错误消息。
最有可能的问题是,此参数的类型为List<Integer>
,即您需要传递列表。或者,您可以传递将被解析的String
。以下应该可以正常工作:
params.addParameter(
NumberVectorLabelParser.Parameterizer.LABEL_INDICES_ID,
"2");
请注意,文本编写器可能(我没有检查过)打印标签。因此,您无法将输出视为您认为数据集为3维的指示。
调试处理程序-resulthandler LogResultStructureResultHandler -verbose
应该为您提供类型输出:
java -jar elki.jar KDDCLIApplication -dbc.in dbpedia.gz \
-algorithm NullAlgorithm \
-resulthandler LogResultStructureResultHandler -verbose
应该产生这样的输出:
de.lmu.ifi.dbs.elki.datasource.FileBasedDatabaseConnection.load: 1941 ms
de.lmu.ifi.dbs.elki.algorithm.NullAlgorithm.runtime: 0 ms
BasicResult: Algorithm Step (main)
StaticArrayDatabase: Database (database)
DBIDView: Database IDs (DBID)
MaterializedRelation: DoubleVector,dim=2 (relation)
MaterializedRelation: LabelList (relation)
SettingsResult: Settings (settings)
在这种情况下,我的数据集是来自维基百科的坐标,每个都有一个名称。我有一个2维DoubleVector
关系,以及一个存储对象名称的LabelList
关系。