2014-09-02 5 views
2

데이터 세트는 다음과 같습니다.Excel Solver가 Matlab K-means에서 최고의 중심을 찾지 못하는 이유는 무엇입니까?

데이터 = [4 12; 5 10; 8 7; 5 3; 5 4; 2 11; 5 4; 3 8; 6 2; 7 4; 10 8; 8 9; 10 9; 항 반면

ctrs = [5.6000 3.4000; 3.5000 10.2500; 9.2000 9.0000] 

sumD = [6.4000; 13.7500; 18.8000] 

: 그것은 저 같이 무게 중심과 sumD (클러스터 내의 포인트 - 투 - 중심 거리의 합)을 제공

[idx,ctrs, sumD] = kmeans(Data,3) 

: 10-12]

는 그럼 진행 Excel 해법 (게시 된 기사에서), ctrssumD은 k = 3에 대해 다음과 같습니다.

ctrs = [5.21815716 3.66736761; 3.615385665 10.461533; 9.47841197 8.75055345] 

sumD = [5.151897802; 7.285383286; 8.573829765] 

(주의 :이 기사에서 저자는 [4 4; 5 12; 10 6]).

Excel에서는 더 정확하게 ctrs 값을 찾아보다 작은 sumD 값을 찾습니다. Matlab을 사용하여이 작업을 수행 할 수 없었습니다. 그래서 kmeans의 다른 매개 변수를 사용했습니다. 나는 'replicates'및 'options'(MaxIter)를 사용했고 3D 배열 시드가있는 경우에도 '시작'매개 변수를 사용하지 않았습니다. 나는 심지어 기사에서 Matlab에 동일한 초기 씨앗을 채택했습니다. 다음은 내가했으나 실패 무엇 :

첫째 :이 오류를 제공

opts = statset('MaxIter',100); 
Seed = [4 4; 5 12; 10 6]; 
[idx,ctrs] = kmeans(Data,3,'Replicates',50,'options',opts,'start',Seed) 

다음 '복제'매개 변수의 값과 일치해야합니다 '시작'배열의 세 번째 차원. 둘째

는 :

I는 첫 번째 페이지가 동일한 초기 시드 및 상기 나머지 (49)는 랜덤 페이지 50의 3 차원 배열을 만들었다.

T = rand(3,2,49); 

그 후, 나는이 같은 50 페이지 3D 배열 생성 :

Seed2 = cat(3,Seed,T); 

그런 다음 kmeans 사용 : 그러나

[idx,ctrs] = kmeans(Data,3,'Replicates',50,'options',opts,'start',Seed2) 

을 matlab에 준 경고 I는 임의의 페이지를 생성 첫 번째 복제 후 모든 복제본이 반복 1에서 생성 된 빈 클러스터로 인해 종료되었음을 나타냅니다. 또한 얻은 idx, ctrs 및 sumD 값은 이전과 동일합니다. 마치 위의 첫 번째 기능을 실행 한 것처럼 (즉 [idx,ctrs, sumD] = kmeans(Data,3)).

막혔습니다. 저는 MATLAB을 사용하여 기사에 실린 Excel 해석기의 결과를 검증하려고합니다. 기사에서 나온 14 개의 관측치에 적용된 동일한 알고리즘을 900+ 관측치의 더 큰 데이터 세트에 적용 할 것이기 때문입니다.

내가 뭘 잘못하고 있니? Excel Solver의 동일하거나 유사한 결과를 얻기 위해 코딩에서 수정해야 할 사항은 무엇입니까?

답변

0

Excel 수치가 정확하고 MATLAB kmeans가 정확한 결과를 제공하지 않는다는 것을 어떻게 확신 할 수 있습니까?아래의 빠른 MATLAB 스크립트와

, 나는이 무게 중심을 그려, 적어도 시각적으로 보이는이 대신 MATLAB의 kmeans을 사용자 정의하는 노력의 충분히 정확하지 않으면

enter image description here

Data = [4 12; 5 10; 8 7; 5 3; 5 4; 2 11; 5 4; 3 8; 6 2; 7 4; 10 8; 8 9; 10 9; 10 12]; 

plot(Data(:,1), Data(:,2),'ob','markersize', 10); 
axis([min(Data(:,1))-2, max(Data(:,1))+2, min(Data(:,2))-2, max(Data(:,2))+2]); 
hold on; 

[idx,ctrs, sumD] = kmeans(Data,3); 
plot(ctrs(:,1), ctrs(:,2), '*r', 'markersize', 10); 

올바른, kmean 함수를 정의 할 수 있습니다. 언젠가 전에 kmeans를 구현 했었고 matlab에 매개 변수를 미세 조정하도록 요청하는 것이 더 쉬워 보였습니다.

+0

OP는 상당히 작은 sumD로 솔루션을 얻었으며 Matlab이 찾지 못한 이유가 궁금합니다. 예를 들어 낮은 빨간색 별은 오른쪽 및 아래쪽으로 조금 더있을 수 있습니다. (그냥 내 눈을 판단) – Trilarion

+0

안녕 Anoop 및 Trilarion. 답변 해 주셔서 감사합니다. 예, 시각적으로 ctrs의 위치가 비슷합니다. Matlab은 Excel Solver와 동일한 클러스터링을 수행합니다. 그러나 Trilarion이 언급 한 것처럼 Matlab은 Matlab보다 Solver의 sumD 값이 작기 때문에 정확하지 않습니다. 그러나 정확한 ctrs가 필요합니다.이 알고리즘을 내 900+ 데이터 세트에 반영하면 데이터 세트가 크고 서로 가깝기 때문에 시각적으로 감지 할 수없는 많은 편차가 있기 때문입니다. 따라서 클러스터링이 잘못 될 수 있습니다. 기사 링크는 다음과 같습니다. http : //bit.ly/1CmNzBn –

1

차이점은 코딩이 아니라 사용 된 거리 측정의 선택에있는 것으로 보입니다. 이 문맥에서 "거리"를 정의하는 방법은 여러 가지가 있습니다.

MATLAB은 기본적으로 squared Euclidean distance을 사용합니다. 직접 MATLAB 결과로 이것을 계산하면 sumD 결과를 복제 할 수 있습니다. 그러나 제 시된 유클리드 거리 측정 값을 사용하면 결과는 sumD이됩니다.

유클리드 거리가 아닌 일반 (평행하지 않은) 거리를 사용하면 sumD와 동일한 결과가 나옵니다. 이 측정 값을 사용하면 MATLAB 결과는 sumD에 대해 더 높은 값을 반환합니다.

아무런 결과도 잘못되어 있지 않으므로 다른 방식으로 "올바른"정도를 측정하는 것입니다.