我在 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
将 a 解释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 属性,我无法真正将聚集点映射回原始值。