2017-12-06 44 views
2

amap 패키지의 Kmeans 기능에서 경고 메시지를 처리하는 솔루션을 찾고 있습니다. 경고 메시지는 다음과 같습니다.K-means 기능에서 "빈 클러스터"경고를 어떻게 처리 할 수 ​​있습니까?

empty cluster: try a better set of initial centers.

어쨌든 신호를받을 수 있습니까? 그렇다면이 오류 메시지가 발생했을 때 알 수 있고 문제를 처리 할 수 ​​있습니까? (예 : 반환 값이있을 때까지 알고리즘을 실행하면 빈 클러스터가 없음)

멋진 재현 가능한 예제를 만드는 것은 어렵습니다. 그러나,이 추악한하지만 기능과 함께 제공 : 당신이 터미널에서이 작업을 실행하면

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) 

, 그것은 당신에게 내가 이야기하고 경고 메시지를 보낼 수 있습니다.

참고 :이 문제를 해결하기위한 나의 생각은 경고의 신호를 포착하고 해결 방법을 실행하는 것입니다. 그러나, 나는 아마도

+0

옵션 하나 :'options (warn = 2); tryCatch (expr = {Kmeans ((time.series), centers = centers, iter.max = 99)}, error = function (e) "잡힌 오류")'. – joran

+0

또는 기본 옵션 :'tryCatch (expr = {Kmeans ((time.series), centers = centers, iter.max = 99)}, warning = function (e) "Caught warning")' – joran

+0

...또는 경고와 함께'시도 <- 시도 (expr = {Kmeans (time.series), 센터 = 센터, iter.max = 99}}, 침묵 = TRUE) '클래스를 확인한 다음'시도'및 그만해라. – joran

답변

1

?options에서 (... warn을 찾기 위해 긴 방법을 아래로 스크롤) 그렇게 할 수있는 방법을 아무 생각이 :

경고 메시지의 처리를 설정합니다. 경고가 음수이면 모두 경고가 무시됩니다. warn가 0 (기본값)이면 최상위 함수가 반환 될 때까지 경고가 저장됩니다. 경고 메시지가 10 개 이하로 표시되면 메시지가 표시되고 그렇지 않은 경우 메시지가 여러 개 표시되었다는 메시지가 인쇄됩니다. last.warning이라는 객체가 만들어져 이라는 경고를 통해 인쇄 할 수 있습니다. warn이 하나 인 경우 경고는 으로 인쇄됩니다. warn이 2 이상이면 모든 경고는 이 오류로 바뀝니다.

options(warn = 2) 
:

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

아니면 모든 경고를 설정할 수는 통해 오류 에스컬레이션 될 : 그래서 tryCatch를 사용

당신은 경고를 잡기에 물건을 할 수있는 warning 핸들러 함수를 지정할 수 있습니다

을 참조하십시오.

options(warn = 2) 
attempt <- try(expr = {Kmeans((time.series), centers = centers, iter.max = 99)},silent = TRUE) 
> class(attempt) 
[1] "try-error" 
: 많은 사람들이 tryCatch을 선호하는 것 같다하지만 그런

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

, 나는 종종 내가 표현을 실행 한 후 if...else 블록의 일종을 수행하려는 경우 나에게 쉽게 느낀다 try의 명확성을 좋아한다

그렇다면 if 명세서에서 class(attempt)을 확인하고 (선호되는 방법은 inherits(attempt,"try-error")을 확인하는 것입니다) 그에 따라 처리하십시오.