Używam Weka w Scala (chociaż składnia jest praktycznie identyczna z Java). Próbuję ocenić moje dane za pomocą klastrowania SimpleKMeans, ale klaster nie zaakceptuje danych ciągu. Nie chcę klastra na danych ciągu; Po prostu chcę go użyć do oznaczenia punktów.Weka, SimpleKMeans nie może obsłużyć atrybutów ciągów znaków
Oto dane używam:
@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
Jak widać, jest to w istocie zbiór punktów na współrzędnych X i Y samolotu. Wartość dowolnych wzorów jest znikoma; jest to po prostu ćwiczenie w pracy z Weka.
Oto kod, który daje mi problemy:
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)
otrzymuję następujący błąd na simpleKMeans.buildClusterer(instance)
:
[UnsupportedAttributeTypeException: weka.clusterers.SimpleKMeans: Nie można obsługiwać atrybuty ciąg]
Jak mogę przekonać firmę Weka do przechowywania identyfikatorów podczas łączenia w klastry?
Oto kilka innych kroków Brałem rozwiązywać to:
użyłem WEKA Explorer i załadować te dane jako 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
To co robi ja chcesz to zrobić w Weka Explorer. Weka zbiera punkty i przechowuje kolumnę ID, aby zidentyfikować każdy punkt. Zrobiłbym to w moim kodzie, ale próbuję to zrobić bez generowania dodatkowych plików. Jak widać z Weka Java API, Instances
interpretuje się tylko jako ARFF.
Próbowałem również następujący kod:
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)
to działa w moim kodu i wyświetla wyniki. Dowodzi to, że Weka działa w ogóle, ale odkąd usuwam atrybut ID, nie mogę naprawdę odwzorować klastrów na oryginalne wartości.
myślę, że identyfikator jest przekształcany nominalnej atrybutu po załadowaniu z CSV. Inną rzeczą, którą możesz spróbować, jest ustawienie atrybutu ID jako atrybutu klasy. Lub ręcznie przekonwertuj go na typ nominalny. – Sentry
Dzięki @Sentry, mogę potwierdzić, że to prawda. Wysłałem odpowiedź z tym, czego się dowiedziałem. –