2017-12-06 5 views
2

Ich suche nach einer Lösung, um eine Warnmeldung zu behandeln, von der Kmeans Funktion von amap Paket. Die Warnmeldung lautet wie folgt:Wie kann ich eine "leere Cluster" Warnung in K-Means-Funktion behandeln?

empty cluster: try a better set of initial centers.

Gibt es trotzdem könnte ich ein Signal bekommen, so könnte wissen, wann diese Fehlermeldung ausgelöst wird, und dann das Problem behandeln? (z. B .: Ausführen des Algorithmus, bis die Rückgabe erfolgt, hat keinen leeren Cluster)

Es ist ziemlich schwierig, ein schönes reproduzierbares Beispiel für mich zu erstellen. Aber ich kam mit dieser hässlichen, aber funktional:

library(amap) 

numberK = 20 
ts.len = 7 

time.series <- rep(sample(1:8000, numberK, replace = TRUE),ts.len) 
time.series <- rep(rbind(time.series, time.series), 30) 
time.series <- matrix(time.series, ncol = ts.len) 

centers <- matrix(sample(1:3000, numberK*ts.len), ncol = ts.len) 

Kmeans((time.series), centers = centers, iter.max = 99) 

Wenn Sie dies auf Sie Terminal laufen, könnte es die Warnmeldung senden ich rede.

Hinweis:Meine Gedanken zur Lösung dieses Problems fangen das Signal der Warnung, und führen Sie dann die Lösung. Allerdings habe ich keine Ahnung, wie kann ich tue dies möglicherweise, dass

+0

Eine Option: 'Optionen (warn = 2); tryCatch (expr = {KMeans ((time.series), center = center, iter.max = 99)}, error = function (e) "Fehler erfasst") '. – joran

+0

Oder mit den Standardoptionen: 'tryCatch (expr = {KMeans ((time.series), Zentren = Zentren, iter.max = 99)}, Warnung = Funktion (e)" Caught Warnung ")' – joran

+0

...oder mit Warnungen als Fehler, versuchen Sie <- try (expr = {Kmeans ((time.series), center = center, iter.max = 99)}, silent = TRUE) 'und überprüfen Sie dann die Klasse' versuch' und verzweige das. – joran

Antwort

1

Von ?options (Scrollen einem langen Weg nach unten warn zu finden ...):

den Umgang mit Warnmeldungen setzt. Wenn Warnung negativ ist, werden alle Warnungen ignoriert. Wenn warn null ist (der Standardwert) werden die Warnungen gespeichert, bis die Top-Level-Funktion zurückkehrt. Wenn 10 oder weniger Warnungen signalisiert wurden, werden sie gedruckt, andernfalls wurde eine Nachricht ausgegeben, die besagt, wie viele Signale signalisiert wurden. Ein Objekt namens last.warning wird erstellt und kann über die Funktion Warnungen gedruckt werden. Wenn Warnung eins ist, werden Warnungen gedruckt, wie sie auftreten. Wenn Warnung zwei oder größer ist, werden alle Warnungen in Fehler umgewandelt.

mit tryCatch So können Sie eine warning-Handler-Funktion angeben, Sachen zu tun, um eine Warnung auf Fang:

options(warn = 2) 
:

> tryCatch(expr = {Kmeans((time.series), centers = centers, iter.max = 99)}, 
     warning = function(e) "Caught warning") 
[1] "Caught warning" 

Oder Sie können alle Warnungen eingestellt über eskaliert Fehler zu

wie in den Dokumenten beschrieben. Dann

> tryCatch(expr = {Kmeans((time.series), centers = centers, iter.max = 99)}, 
      error = function(e) "Caught error") 
[1] "Caught error" 

Obwohl viele Menschen scheinen tryCatch zu bevorzugen, Ich mag oft die Ausführlichkeit von try, die mir leichter fühlt, wenn ich irgendeine Art von if...else Block tun wollen, nachdem der Ausdruck ausgeführt wird:

options(warn = 2) 
attempt <- try(expr = {Kmeans((time.series), centers = centers, iter.max = 99)},silent = TRUE) 
> class(attempt) 
[1] "try-error" 

So können Sie überprüfen, class(attempt) in einer if Anweisung (der bevorzugte Weg ist zu überprüfen inherits(attempt,"try-error")) und tun Sie die Sachen entsprechend.

Verwandte Themen