Как отметил в комментариях альваш, argmax
не дифференцируемо.Однако, как только вы вычислите его и назначите каждую точку данных в кластер, производная потерь по местоположению этих кластеров будет четко определена.Вот что делает ваш алгоритм.
Почему он работает?Если бы у вас был только один кластер (чтобы операция argmax
не имела значения), ваша функция потерь была бы квадратичной с минимальным значением средних точек данных.Теперь с несколькими кластерами вы можете видеть, что ваша функция потерь кусочно (в более высоких измерениях думать объемно) квадратичной - для любого набора центроидов [C1, C2, C3, ...]
каждая точка данных назначается некоторому центроиду CN
, а потеря локально квадратичный.Степень этого местоположения определяется всеми альтернативными центроидами [C1', C2', C3', ...]
, для которых присвоение, исходящее из argmax
, остается неизменным;в пределах этой области argmax
может рассматриваться как константа, а не функция, и, следовательно, производная от loss
четко определена.
Теперь, на самом деле, вряд ли вы сможете обработать argmax
как константа, но вы все равно можете рассматривать наивную производную «argmax-is-a-constant» как указывающую приблизительно на минимум, потому что большинство точек данных, вероятно, действительно принадлежат к одному кластеру между итерациями.И как только вы подобрались достаточно близко к локальному минимуму, так что точки больше не меняют свои назначения, процесс может сходиться к минимуму.
Другой, более теоретический способ взглянуть на это, это то, что вы делаетеаппроксимация максимизации ожидания.Обычно у вас будет шаг «вычислить назначения», который отражается argmax
, и шаг «свести к минимуму», который сводится к поиску минимизирующих центров кластеров с учетом текущих назначений.Минимум задается d(loss)/d([C1, C2, ...]) == 0
, который для квадратичной потери дается аналитически с помощью точек данных в каждом кластере.В вашей реализации вы решаете то же уравнение, но с шагом градиентного спуска.Фактически, если бы вы использовали схему обновления 2-го порядка (Ньютона) вместо градиентного спуска 1-го порядка, вы бы неявно воспроизводили именно базовую ЭМ-схему.