2017-05-13 3 views
0

이것은 여러 번 발생하는 문제이며, 의사 솔루션을 염두에두고 있지만 영리한 것이 라기보다는 몬테카를로 방법입니다.Y에서 설명 된 분산을 최대화하기 위해 X를 클러스터하는 방법?

내가하려는 것은 본질적으로 연속 변수를 범주 변수로 변환하는 것이고 각 범주는 응답 변수에서 상당히 다른 평균을 갖습니다.

그래서 나이 그룹에 대한 우울증 비율을 모델링하려고한다고 가정 해 봅시다. 내 모델에서는 최대 N 개의 연령 그룹을 갖기를 원하며 각 그룹의 범위는 임의로 조정할 수 있습니다 (5-10, 11-27, 28-30, 31-64 ... 등). 문제는 N 그룹에서 우울 률의 설명 된 분산이 최대화 될 수있는 경계를 선택하는 방법입니다.

# Monte Carlo approach using iris dataset as an example 
n_clust = 5 

best_bounds = rep(0, n_clust) 
best_groups = NULL 
bestSSE = Inf 

X_var = iris$Petal.Length 
Y_var = iris$Sepal.Width 

min_x = min(X_var) 
max_x = max(X_var) 
range_x = max_x - min_x 

for (i in 1:10000){ 

    b = sort(runif(n_clust-1)) 
    b = cumsum(b/sum(b)) 
    bounds = min_x + b * range_x 
    groups = cut(X_var, breaks = c(-Inf,bounds,Inf)) 

    model = lm(Y_var~groups) 
    SSE = sum(model$residuals^2) 
    if (SSE < bestSSE){ 
    print(SSE) 
    best_bounds = bounds 
    best_groups = groups 
    bestSSE = SSE 
    } 
} 

g = aggregate(Y_var, list(best_groups), mean) 
names(g) = c("Cluster", "y_mean") 
g$Cluster=c(best_bounds) 

plot(X_var, Y_var, col='blue', pch=20) 
abline(lm(Y_var~X_var), col='darkgray', lty=2) 

for (i in 1:(nrow(g))){ 
    x0 = ifelse(i == 1, min_x-max_x, g[i-1,"Cluster"]) 
    x1 = ifelse(i < nrow(g), g[i,"Cluster"], 2*max_x) 
    segments(x0,g[i,"y_mean"],x1,g[i,"y_mean"], col='red') 
} 

R_cont = summary(lm(Y_var~X_var))$r.squared 
R_cat = summary(lm(Y_var~best_groups))$r.squared 
title(paste("R^2:", round(R_cont,4),"vs",round(R_cat,4))) 

Cluster X on Y

참고 : 나는 해석 만 예측 능력에 대해 걱정하지 않는다.

답변

0

클러스터링 관점에서 보지 않겠습니다. 대신 최적화 문제로 간주하십시오. 그런 다음 그라디언트 디센트를 사용하여 최적화하거나 다른 검색을 수행하십시오.

또 다른 옵션은 조각 별 선형 회귀이지만 실제로 "조각 별 일정 회귀"를 원할 수 있습니다.

+0

사실, 실제로는 최적화 문제입니다. 나는이 게시물을 만든 직후에 그렇게 보았습니다. 어떻게하면 R 및/또는 Python에서 이러한 접근 방식을 구현할 수 있을지에 대한 아이디어가 있습니까? 나는 문제를 정의하는 방법을 실제로 볼 수 없다. (주된 복잡성은 x 값을 어떻게 든 빈에 할당해야한다는 것이다.) 그리고 실제로,이 방법을 사용하여 자동 조각 별 회귀 분석을 만드는 것이 아이디어입니다. 그것만이 올바른 쓰레기통을 선택하기가 어렵습니다! – Corpsecreate

+0

나는 내가 만족할만한 좋은 해결책을 발견했다고 생각한다! sol = optim (rep (0.5, n_clust), sse_loss, lower = rep (0, n_clust), upper = rep (1, n_clust), method = "L-BFGS-B") – Corpsecreate