2014-10-29 8 views
0

두 개의 별개 카테고리 (각 카테고리에 대해 동일한 수의 요소로 나누어 짐)와 두 개의 연속 변수과 같이, 그들을 설명 :데이터 세트를 동일한 분산을 가진 두 개의 클러스터로 나눕니다.

ID | Category | Variable_1 | Variable_2 
-------------------------------------------- 
1 | Triangle | 4.3522  | 5.2321 
2 | Triangle | 3.6423  | 6.3223 
3 | Circle | 5.2331  | 3.2452 
4 | Circle | 2.6334  | 7.3443 
... | ...  | ...   | ... 

을 지금, 나는 각 세트의 평균은 2 차원 공간에 자리하고있는 곳과 관련하여 가능한 한 가깝게 일치하는 두 개의 새로운 세트로 내 데이터 집합을 분할 싶습니다 Variable_1Variable_2으로 정의된다. 즉, 두 세트 간의 거리는 가능한 한 근접해야합니다.

가능한 경우 (이것이 문제를 해결하는 데 더 복잡 할 수 있음을 이해하고 있으므로) 두 세트의 차이를 가능한 한 정확하게 일치시키고 싶습니다. 예를 들어, 전체 변수의 분산은 각 변수의 분산의 합으로 나타냅니다. 여기서 저는 여러분의 공간에 다른 차원을 추가하여 두 변수와 분산으로 구성된 전체 3D 공간에 가장 적합한 솔루션을 찾으려고한다고 생각합니다.

R에서 어떻게 이것을 수행 할 수 있습니까?

+0

정말로 좋아하는 소리 ** 클러스터링 **. 특히 2 클러스터로. 하지만 평등 - 총 차이 통계는 비표준입니다. http://en.wikipedia.org/wiki/K-means_clustering – smci

+0

@speldosa 참고로, 나는이 경우 k-means가 작동하지 않을 것이라고 생각합니다. 2 개의 centroid는 실제적으로 2 개의 sample의 수단이 될 것이고 그렇지 않다면 명백하게 동일하지 않을 수 있습니다. 그렇지 않으면 우리는 2 개의 cluster를 갖지 않을 것이기 때문입니다. 무게 중심이 가능한 한 멀리 떨어져 있으면 가장 좋습니다. [here] (http://home.deib.polimi.it/matteucc/Clustering/tutorial_html/kmeans.html)도 확인할 수 있습니다. 추신 나는 항상 토론을 위해 열려 있습니다 :) – LyzandeR

+0

@smci 미안, 위의 메시지는 당신에게 말했지만 speldosa가 아닙니다. :) 미안합니다. – LyzandeR

답변

1

이 문제에 접근하려고하는 방법은 위에서 언급 한 것처럼 variable1과 variable2 사이의 거리를 신경 써야합니다. 따라서 나는 distance라는 새로운 필드를 만들 것입니다. (나는 diff라는 이름 아래에 있습니다) 이것은 variable1-variable2로 계산됩니다. 그런 다음 해당 열을 기준으로 데이터 프레임을 정렬하고 행별로 데이터 프레임을 나눕니다. 즉, 홀수 행은 모두 pot1로 이동하고 모든 짝수 행은 pot2로 이동합니다. 이는 예로서 다음과 같은 코드로 설명된다 :

id<-1:2000 
a<-runif(2000,-100,100) 
b<-runif(2000,-200,200) 
mydf <- data.frame(id,a,b) 

mydf['diff'] <- mydf[['a']] - mydf[['b']] 
mydf<-mydf[with(mydf, order(diff)), ] 

head(mydf,20) 

출력 :

> head(mydf,20) #as you can see the dataframe is ordered by diff (ascending) 
     id   a  b  diff 
1732 1732 -95.96522 198.1666 -294.1318 
187 187 -94.24905 196.9341 -291.1831 
338 338 -95.31069 194.9997 -290.3104 
231 231 -91.98249 194.0672 -286.0497 
1513 1513 -97.01006 183.5874 -280.5974 
715 715 -94.53303 185.1026 -279.6356 
145 145 -99.73511 178.2460 -277.9811 
979 979 -87.73586 190.0489 -277.7848 
1165 1165 -85.53447 187.6254 -273.1598 
1243 1243 -94.75502 176.8572 -271.6122 
1208 1208 -77.32021 189.1589 -266.4791 
1826 1826 -92.23949 171.6341 -263.8736 
167 167 -98.84123 163.6960 -262.5372 
1283 1283 -76.54766 185.8721 -262.4197 
1391 1391 -72.04732 189.9422 -261.9896 
322 322 -77.53867 183.4744 -261.0131 
75  75 -88.04799 171.9066 -259.9546 
882 882 -65.11661 193.8533 -258.9699 
1119 1119 -77.59978 181.2392 -258.8390 
1624 1624 -81.81879 175.9795 -257.7983 

이제 dataframe 분할 :

samplea_1<-NULL 
samplea_2<-NULL 
sampleb_1<-NULL 
sampleb_2<-NULL 
id_1<-NULL 
id_2<-NULL 
diff_1<-NULL 
diff_2<-NULL 
for (i in 1:nrow(mydf)) { 
    if(i%%2==0) { 
    samplea_1 <- append(samplea_1,mydf$a[i]) 
    sampleb_1 <- append(sampleb_1,mydf$b[i]) 
    id_1  <- append(id_1,mydf$id[i]) 
    diff_1 <- append(diff_1,mydf$diff[i]) 
    } else { 
    samplea_2 <- append(samplea_2,mydf$a[i]) 
    sampleb_2 <- append(sampleb_2,mydf$b[i]) 
    id_2  <- append(id_2,mydf$id[i]) 
    diff_2 <- append(diff_2,mydf$diff[i]) 
    } 
} 

sample1<-data.frame(samplea_1,sampleb_1,id_1,diff_1) 
sample2<-data.frame(samplea_2,sampleb_2,id_2,diff_2) 
summary(sample1) 
summary(sample2) 

출력 :

> summary(sample1) 
    samplea_1   sampleb_1    id_1   diff_1   
Min. :-99.2058 Min. :-199.519 Min. : 1.0 Min. :-291.183 
1st Qu.:-47.5615 1st Qu.:-100.917 1st Qu.: 495.8 1st Qu.:-105.851 
Median : 1.3997 Median : 7.004 Median : 980.5 Median : -1.333 
Mean : 0.7047 Mean : 2.044 Mean : 991.0 Mean : -1.340 
3rd Qu.: 50.4087 3rd Qu.: 101.678 3rd Qu.:1482.8 3rd Qu.: 99.381 
Max. : 99.8470 Max. : 199.833 Max. :2000.0 Max. : 291.797 
> summary(sample2) 
    samplea_2   sampleb_2    id_2   diff_2   
Min. :-99.7351 Min. :-199.9494 Min. : 2.0 Min. :-294.132 
1st Qu.:-48.4339 1st Qu.: -99.7880 1st Qu.: 509.8 1st Qu.:-106.338 
Median : -1.4627 Median : 6.8745 Median :1024.0 Median : -1.425 
Mean : -0.7104 Mean : 0.9099 Mean :1010.0 Mean : -1.620 
3rd Qu.: 48.1663 3rd Qu.: 94.7360 3rd Qu.:1513.2 3rd Qu.: 99.334 
Max. : 99.9496 Max. : 199.8544 Max. :1996.0 Max. : 288.840 

을 diff 열이 alm을 볼 수 있습니다. ost 동일한 의미는 약간 직관적입니다. 왜냐하면 우리가 해당 컬럼에 따라 데이터 프레임을 정렬했기 때문입니다. 그러나 볼 수 있듯이, 컬럼 samplea와 sampleb에서 거의 같습니다. 이것은 diff가 a와 b에서 파생 되었기 때문에 발생하지만 각 열 a와 b에 대한 분산이 얼마나 큰지에 따라 결과가 덜 정확합니다.

희망 하시겠습니까?

+0

내가 다른 것을 생각해 내지 않으면 백업 솔루션으로 활용할 수 있습니다. 감사! – Speldosa

+0

쿨! 도와 줄 수있어서 기뻐 :) – LyzandeR