Я реализовал команду Kmeans с помощью команды Scikit Learn и попробовал использовать коэффициент Elbow и Silhoutte, чтобы найти оптимальный K. Я планирую использовать статистику разрывов для дальнейшей проверки моих результатов.
def optimalK(data, nrefs=3, maxClusters=15):
gaps = np.zeros((len(range(1, maxClusters)),))
resultsdf = pd.DataFrame({'clusterCount':[], 'gap':[]})
for gap_index, k in enumerate(range(1, maxClusters)):
# Holder for reference dispersion results
refDisps = np.zeros(nrefs)
for i in range(nrefs):
# Create new random reference set
randomReference = np.random.random_sample(size=data.shape)
# Fit to it
km = KMeans(k)
km.fit(randomReference)
refDisp = km.inertia_
refDisps[i] = refDisp
km = KMeans(k)
km.fit(data)
origDisp = km.inertia_
# Calculate gap statistic
gap = np.log(np.mean(refDisps)) - np.log(origDisp)
# Assign this loop's gap statistic to gaps
gaps[gap_index] = gap
resultsdf = resultsdf.append({'clusterCount':k, 'gap':gap}, ignore_index=True)
return (gaps.argmax() + 1, resultsdf)
Однако мойГрафики для статистики разрыва растут, поэтому оптимальное количество кластеров всегда является конечной точкой для моего диапазона кластеров.Предположим, что я определяю диапазон кластеров от 1 до 10, тогда оптимальным будет 10.
Согласно веб-сайтам в Интернете и оригинальной статье, обходной путь заключается в реализации стандартной ошибки 1, в которой
GAP (K)> GAP (K + 1) - S (K + 1)
Может кто-нибудь объяснить мне, как реализовать это в приведенном выше коде?Я не знаю, как рассчитать S (k + 1), поскольку для этого необходимо найти стандартное отклонение эталонного распределения.
s(k+1) = sd(k+1)*square_root(1+(1/B))
B - количество копий образцов Монте-Карло.Я смотрю на разные сайты, но, похоже, они не реализовали статистику разрывов со стандартной ошибкой 1.