Статистика разрыва - отличный способ сделать это; Tibshirani, Hastie & Walther (2001).
http://stat.ethz.ch/R-manual/R-devel/library/cluster/html/clusGap.html - соответствующий пакет R.
Идея состоит в том, что он выполняет последовательную проверку гипотезы кластеризации ваших данных для K = 1,2,3, ... против нулевой гипотезы случайного шума, которая эквивалентна одному кластеру. Его особая сила заключается в том, что он дает вам достоверную информацию о том, есть ли K = 1, то есть нет ли кластеров.
Вот пример, я проверял некоторые астрономические данные несколько дней назад, как это происходит, а именно из транзитного опроса экзопланет. Я хотел знать, какие доказательства существуют для (выпуклых) кластеров. Мои данные «транзит»
library(cluster)
cgap <- clusGap(transit, FUN=kmeans, K.max=kmax, B=100)
for(k in 1:(kmax-1)) {
if(cgap$Tab[k,3]>cgap$Tab[(k+1),3]-cgap$Tab[(k+1),4]) {print(k)};
break;
}
Со статистикой разрыва вы ищете первое значение K, где тест «проваливается», то есть статистика разрыва значительно уменьшается. Приведенный выше цикл выведет такой ak, однако простое построение cgap даст вам следующий рисунок:
посмотрите, как в Gap наблюдается значительный провал от k = 1 до k = 2, что означает, что фактически нет кластеров (то есть 1 кластер).
Вы также можете попробовать более новый метод: A. Kalogeratos и A.Likas, Dip-means: метод инкрементальной кластеризации для оценки количества кластеров , NIPS 2012.
Идея состоит в том, чтобы использовать статистическую проверку гипотез для унимодальности на векторах, содержащих сходство / расстояние между одной точкой и остальными точками множества. Тестирование проводится с использованием теста погружения Хартиган-Хартиган , Ann. Statist. 13 (1): 70-84.
Метод начинается со всего набора данных в виде одного кластера и постепенно разбивает его до тех пор, пока гипотеза об унимодальности отвергается (то есть присутствует более одного кластера).
Таким образом, этот метод будет указывать, есть ли в данных более одного кластера (ваш вопрос), но он может также обеспечить окончательную кластеризацию.
Здесь вы можете найти код в Matlab .
источник
Предположим, я рассматриваю тот же пример,
Как я могу подразделить элементы кластеров, соответствующие лучшему кластерному решению, основываясь на статистике максимального разрыва? Так что я могу использовать его для дальнейшего анализа на каждом из кластеров.
Я знаю, что есть команда с именем subset. Нет проблем с использованием этой команды, когда мы указали нужное количество кластеров. Но как его подмножество, когда мы хотим подмножество на основе оптимального k, полученного с использованием промежутка (короче говоря, подмножество элементов кластеров, если есть цикл)
источник