Здравствуйте и вновь добро пожаловать на занятия по теме «Кластерный анализ и машинное обучение без учителя на языке Python».
В этой части я попытаюсь дать визуальное представление того, что происходит при каждой итерации в методе k-средних. С технической точки зрения эта задача не требует особых изменений в предыдущем коде метода k-средних, поэтому если вы захотите сначала попробовать самостоятельно справиться с ней, то я настоятельно рекомендую в качестве упражнения так и сделать.
Мы собираемся нарисовать диаграммы рассеяния в сетке координат, в которой каждый подграфик будет представлять одну полную итерацию в методе k-средних. Суть того, что надо сделать, – это взять цветную диаграмму рассеяния из предыдущего кода и вставить её в основной цикл for, чтобы она прорисовывалась на каждой итерации. Чтобы убедиться, что мы не переписываем диаграмму рассеяния поверх предыдущей, нам необходимо настроить сетку координат и создать отдельный график для каждой точки в этой сетке.
В моём коде основные изменения находятся прямо перед основным циклом, где инициируется сеть координат в цвете:
…
for k in xrange(K):
M[k] = X[np.random.choice(N)]
grid_width = 5
grid_height = max_iter / grid_width
random_colors = np.random.random((K, 3))
plt.figure()
costs = np.zeros(max_iter)
for i in xrange(max_iter):
…
И изменения внутри основного цикла for, в результате которых текущие границы распределения кластеров раскрашиваются случайными цветами и выводится на экран диаграмма рассеяния до обновления.
…
costs = np.zeros(max_iter)
for i in xrange(max_iter):
colors = R.dot(random_colors)
plt.subplot(grid_width, grid_height, i+1)
plt.scatter(X[:,0], X[:,1], c=colors)
for k in xrange(K):
…
Все остальноё остаётся совершенно неизменным.
Запустим программу и посмотрим, что получится:
Итак, сначала видим наши три кластера.
Далее – распределение кластеров при каждой итерации. У нас их 10. Как видите, первая диаграмма вся раскрашена одним цветом. Почему так?
Потому что ещё не установлены границы охвата кластеров, а потому они все имеют одинаковое значение. Обратите внимание, что наибольшие изменения в границах охвата кластеров произошли на первых нескольких этапах, что логично – ведь это отвечает сильнейшему уменьшению функции стоимости.