【发布时间】:2013-03-16 06:38:48
【问题描述】:
我在 Scala 中使用 Weka(尽管语法几乎与 Java 相同)。我正在尝试使用 SimpleKMeans 聚类器评估我的数据,但聚类器不接受字符串数据。我不想聚集在字符串数据上;我只是想用它来标记点。
这是我正在使用的数据:
@relation Locations
@attribute ID string
@attribute Latitude numeric
@attribute Longitude numeric
@data
'Carnegie Mellon University', 40.443064, -79.944163
'Stanford University', 37.427539, -122.170169
'Massachusetts Institute of Technology', 42.358866, -71.093823
'University of California Berkeley', 37.872166, -122.259444
'University of Washington', 47.65601, -122.30934
'University of Illinois Urbana Champaign', 40.091022, -88.229992
'University of Southern California', 34.019372, -118.28611
'University of California San Diego', 32.881494, -117.243079
如您所见,它本质上是 x 和 y 坐标平面上的点的集合。任何模式的价值都可以忽略不计;这只是与 Weka 合作的一个练习。
这是给我带来麻烦的代码:
val instance = new Instances(new StringReader(wekaHeader + wekaData))
val simpleKMeans = new SimpleKMeans()
simpleKMeans.buildClusterer(instance)
val eval = new ClusterEvaluation()
eval.setClusterer(simpleKMeans)
eval.evaluateClusterer(new Instances(instance))
Logger.info(eval.clusterResultsToString)
我在simpleKMeans.buildClusterer(instance) 收到以下错误:
[UnsupportedAttributeTypeException: weka.clusterers.SimpleKMeans: 无法处理字符串属性!]
如何让 Weka 在进行集群时保留 ID?
以下是我为解决此问题而采取的其他几个步骤:
我使用 Weka Explorer 并将这些数据加载为 CSV:
ID, Latitude, Longitude
'Carnegie Mellon University', 40.443064, -79.944163
'Stanford University', 37.427539, -122.170169
'Massachusetts Institute of Technology', 42.358866, -71.093823
'University of California Berkeley', 37.872166, -122.259444
'University of Washington', 47.65601, -122.30934
'University of Illinois Urbana Champaign', 40.091022, -88.229992
'University of Southern California', 34.019372, -118.28611
'University of California San Diego', 32.881494, -117.243079
这就是我希望它在 Weka Explorer 中做的事情。 Weka 对点进行聚类并保留 ID 列以识别每个点。我会在我的代码中执行此操作,但我试图在不生成其他文件的情况下执行此操作。从Weka Java API 可以看出,Instances 仅将java.io.Reader 解释为 ARFF。
我也试过下面的代码:
val instance = new Instances(new StringReader(wekaHeader + wekaData))
instance.deleteAttributeAt(0)
val simpleKMeans = new SimpleKMeans()
simpleKMeans.buildClusterer(instance)
val eval = new ClusterEvaluation()
eval.setClusterer(simpleKMeans)
eval.evaluateClusterer(new Instances(instance))
Logger.info(eval.clusterResultsToString)
这适用于我的代码,并显示结果。这证明 Weka 正常工作,但由于我删除了 ID 属性,我无法真正将聚集点映射回原始值。
【问题讨论】:
-
我认为您的 ID 在从 CSV 加载时会转换为名义属性。您可以尝试的另一件事是将 ID 属性设置为类属性。或者手动将其转换为名义类型。
-
谢谢@Sentry,我可以确认这是正确的。我发布了我所了解的答案。
标签: scala cluster-analysis weka