2014-07-21 1 views
3

이미지 클러스터링을위한 수정 된 k_mean 알고리즘을 구현하려고합니다. 즉 k- 평균과 매우 유사합니다. 차이점은 새 센터 계산에만 해당됩니다.이미지 클러스터링을위한 k- 평균 알고리즘 수정

사실 저는 클러스터 센터를 초기화하고 픽셀과 센터 사이의 거리를 계산했습니다. 이제는 최소 거리를 기반으로 픽셀을 클러스터에 할당해야하지만 여기서 문제는 픽셀을 클러스터에 할당하고 저장하는 방법입니다. 어떤 픽셀이 새로운 중심 계산을 위해 어느 클러스터에 속하는지 알 수 있습니까?

+0

여기서 프로그래밍 질문을 하시겠습니까? 그렇다면 더 자세한 정보를 제공해야합니다. 통계 질문 (k-means 클러스터링과 관련된 내용)을 묻는 경우 [statistics.se]에 질문해야합니다. – Joe

+0

죄송합니다. 내 실수는 잊어 버렸습니다. 그래, 프로그래밍 질문과 나는 matlab에 도움을 원한다. – lavi

+0

지금은 k- 평균 클러스터링을 수행하는 방법을 대략적으로 물어보기 때문에 좋은 프로그래밍 질문이 아닙니다. 여기서는 너무 광범위합니다. 코드에 대한 도움이 필요하면 도움이 필요한 시점에 대한 예제 데이터를 제공하고 파악하려는 내용과 어떤 프로그래밍 프레임 워크가 적합해야하는지 보여줍니다. – Joe

답변

1

당신은 이미 당신이 당신의 훈련 예 3 개 기능 (레드, 녹색, 블루)이 각각의 픽셀이 어디에 K-수단을 실행하려면, 말했다 재 작성 것. 나는 여러분이 이미 무언가를 결정한 것처럼 보일지라도, 먼저 0에서 16이나 0에서 255라고 말하기보다는 RGB 데이터를 0에서 1.0으로 정규화하여 거리 표준을 정의하는 것처럼 보이지만 결과를 비교할 수 있습니다. 색상의 깊이에 관계없이.

당신은 화소 1..m 주문 및 = (아래 참조) M : m X 3 행렬 X너비 X 높이 를 보관한다. X의 행에 각 픽셀을 할당하는 방법 (임의로 이미지 위치 (x, y)의 픽셀을 y * width + x 행으로 설정)

지금 당신은 단순히 IDX있는 픽셀이있는 중심에 속한 추적하기 위해 추가 미터 X 인덱스 벡터를 사용해야합니다.

idx = zeros(size(X,1), 1); 

for i = 1:size(X,1) 
    minNormSq = 0; 
    for j = 1:K 
     normSq = sum((X(i,:) .- centroids(j,:)).^2); 
     if j == 1 || normSq < minNormSq 
     minNormSq = normSq; 
     idx(i) = j; 
     end 
    end 
end 

나중에 새 중심 값을 assign a array to a boolean condition 계산 할 수있을 때.

for j = 1:K 
    inclusion = (idx == j); 
    centroids(j,:) = inclusion'*X; 
    centroids(j,:) = centroids(j,:)/sum(inclusion); 
end 
+0

이 코드는 내게 도움이 주셔서 감사하지만 제발 말해 줄 마지막 라인 두 번째 단락의? 실제로 나는 이미지 행렬을 [1 ..... m] 행렬로 재조정합니다. 여기서 m은 행입니다. * col이 잘못 되었습니까? 내가 m * 3 행렬에 저장하지 않으려면 – lavi

+0

@ lavi 일반적으로 트레이닝 세트는 샘플이 행이고 피쳐가 열인 벡터화를 돕기 위해 1 개의 큰 행렬에 저장됩니다. 따라서이 문제에서 *** X ***는 m x 3이 될 것입니다. 특정 순서로 픽셀을 할당 할 필요는 없습니다. 일관성을 유지해야합니다. – waTeim

+0

괜찮아. 알았어. centroid array 1D로 찍었습니다. 괜찮 니? – lavi