2012-06-08 3 views
6

Я пытаюсь построить локоть к означает, используя код ниже:К означают нахождение локтя, когда локоть участок является гладким кривой

load CSDmat %mydata 
for k = 2:20 
    opts = statset('MaxIter', 500, 'Display', 'off'); 
    [IDX1,C1,sumd1,D1] = kmeans(CSDmat,k,'Replicates',5,'options',opts,'distance','correlation');% kmeans matlab 
    [yy,ii] = min(D1');  %% assign points to nearest center 

    distort = 0; 
    distort_across = 0; 
    clear clusts; 
    for nn=1:k 
     I = find(ii==nn);  %% indices of points in cluster nn 
     J = find(ii~=nn);  %% indices of points not in cluster nn 
     clusts{nn} = I;   %% save into clusts cell array 
     if (length(I)>0) 
      mu(nn,:) = mean(CSDmat(I,:));    %% update mean 
      %% Compute within class distortion 
      muB = repmat(mu(nn,:),length(I),1); 
      distort = distort+sum(sum((CSDmat(I,:)-muB).^2)); 
      %% Compute across class distortion 
      muB = repmat(mu(nn,:),length(J),1); 
      distort_across = distort_across + sum(sum((CSDmat(J,:)-muB).^2)); 
     end 
    end 
    %% Set distortion as the ratio between the within 
    %% class scatter and the across class scatter 
    distort = distort/(distort_across+eps); 

     bestD(k)=distort; 
     bestC=clusts; 
end 
figure; plot(bestD); 

Значение bestD (в пределах кластера дисперсии/между кластерной дисперсией) являются

[ 
0.401970132754914 
0.193697163350293 
0.119427184084282 
0.0872681777446508 
0.0687948264457301 
0.0566215549396577 
0.0481117619129058 
0.0420491551659459 
0.0361696583755145 
0.0320384092689509 
0.0288948343304147 
0.0262373245283877 
0.0239462330460614 
0.0218350896369853 
0.0201506779033703 
0.0186757121130685 
0.0176258625858971 
0.0163239661159014 
0.0154933431470081 
] 

Код адаптирован для Lihi Zelnik-Manor, март 2005 года, Caltech.

Соотношение участков в пределах дисперсии кластера между дисперсией кластера представляет собой плавную кривую с коленом, гладким, как кривая, график bestD данных, приведенных выше. Как найти колено для таких графов?

+5

Не могли бы вы также поделиться сюжетом? –

+1

Возможный дубликат [поиск лучшей точки компромисса на кривой] (http://stackoverflow.com/questions/2018178/finding-the-best-trade-off-point-on-a-curve) – Amro

+1

См. [ как-ду-я-определения-к-когда-с помощью-к-средства-кластеризация] (http://stackoverflow.com/questions/1793532/how-do-i-determine-k-when-using-k-means -кластеризация) на SO. – denis

ответ

0

Я думаю, что лучше использовать только ваш «внутри класса искажений» в качестве параметра оптимизации:

%% Compute within class distortion 
muB = repmat(mu(nn,:),length(I),1); 
distort = distort+sum(sum((CSDmat(I,:)-muB).^2)); 

Используйте эту без деления этого значения на «distort_across». Если вычислить «дериватив» этого:

unexplained_error = within_class_distortion; 
derivative = diff(unexplained_error); 
plot(derivative) 

Производной (к) показывает, сколько необъяснимая ошибка уменьшилась путем добавления нового кластера. Я предлагаю вам прекратить добавлять кластеры, когда уменьшение этой ошибки меньше, чем в десять раз больше, чем вы получили.

for (i=1:length(derivative)) 
    if (derivative(i) < derivative(1)/10) 
     break 
    end 
end 
k_opt = i+1; 

На самом деле метод, чтобы получить оптимальное количество кластеров зависит от приложения, но я думаю, что вы можете получить хорошее значение к, используя это предложение.

 Смежные вопросы

  • Нет связанных вопросов^_^