R에서 head / tail breaks 분류 알고리즘을 구현하려고합니다 ( 여기 참조 ). 비교적 새로운이 알고리즘은 고도로 치우친 데이터에 대해지도 제작에서 사용되는 다른 분류 방법에 비해 계산 비용이 덜 드는 대안입니다.
지금까지 비교적 성공한 Python ( 여기 참조 ) 코드를 템플릿으로보고 있습니다. 다음은 R로 구현 한 것입니다.
# fake data to classify
pareto_data <- c()
for (i in 1:100){
pareto_data[i] <- (1.0/i)^1.16
}
# head/tail breaks algorithm
ht <- function(data){
ln <- length(data)
mn <- mean(data)
res <- append(c(),mn) # this is where I was hopping to store my output
head <- subset(data,data>=mn)
while (length(head)>=1 & length(head)/ln <= 0.40){
print(res)
return(ht(head))
}
#return(res)
}
ht(pareto_data)
위의 코드를 실행 한 결과 다음을 인쇄 할 수있었습니다.
[1] 0.03849691
[1] 0.1779904
[1] 0.4818454
이 출력은 내가 템플릿으로 사용했던 원래 Python 코드를 실행하는 것과 거의 동일합니다. 그러나 벡터 또는 목록에 저장하는 데 성공하지 못했습니다.
이 문제를 극복하고 내 코드를 개선 할 수있는 힌트를 줄 수 있다면 정말 감사 할 것입니다 (특히 while
문장 의 조건에서 파이썬의 원래 코드와 정확히 동일하지는 않습니다 ).
알고리즘의 가능한 재귀 버전은 다음과 같습니다.
ht_breaks <- function(x){
ht_inner <- function(x, mu){
n <- length(x)
mu <- c(mu, mean(x))
h <- x[x > mean(x)]
if(length(h) > 1 && length(h)/n <= 0.4){
ht_inner(h, mu)
} else mu
}
ht_inner(x, NULL)
}
pareto_data <- (1.0/(1:100))^1.16
ht_breaks(pareto_data)
#[1] 0.03849691 0.17799039 0.48184535
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다