Основное отличие состоит в том, что используются различные меры расстояния .
В Spark в качестве меры расстояния используется квадрат евклидов по сравнению со sklearn, который по умолчанию использует нормальное евклидово расстояние.
Причиной такого выбора меры расстояния в Spark является возможность более эффективного и параллельного вычисления. Части уравнения могут быть предварительно вычислены, уменьшая вычислительную сложность с O(N^2^*D)
, где N
- количество точек и D
их размерность, до O(C*D*N/W)
, где W
- количество рабочих, а C
количество кластеров (предполагается достаточно низким). Математический вывод Spark и реализация оценки силуэта описаны на github ( здесь ).
Доказательство:
Мы можем проанализировать пример в вопросе и вычислить оценки силуэтов вручную, используя как евклидово расстояние, так и евклидово расстояние в квадрате.
У нас есть кластер 1 с точками (1,1)
, (2,2)
и центром кластера на (1.5,1.5)
и кластером 2 с (3,3)
, (4,4)
и центром кластера на (3.5,3.5)
.
среднее значение для всех образцов. Поскольку четыре пункта в вопросе отлично отражены и имеется только два кластера, достаточно рассчитать балл для одного из этих кластеров (здесь я выбрал кластер 1).
Ниже a
- среднее расстояние внутри кластера (среднее расстояние до всех точек в одном кластере) и b
среднее расстояние между кластерами (среднее расстояние до всех точек в ближайшем кластере, что точка не принадлежит). Оценка рассчитывается как (b-a) / max(b,a)
.
Евклидово расстояние:
Точка (1,1)
:
-
a
= sqrt ((2-1) ^ 2 + (2-1) ^ 2) = sqrt (2) b
= (sqrt ((3-1) ^ 2 + (3) -1) ^ 2) + sqrt ((4-1) ^ 2 + (4-1) ^ 2))) / 2 = (sqrt (8) + sqrt (18)) / 2 = 3,5355 - балл = (3,5355 - кв. (2)) / 3,5355 = 0,6
Балл (2,2)
:
a
= кв. ((2-1) ^ 2 + (2-1) ^ 2) = sqrt (2) b
= (sqrt ((3-2) ^ 2 + (3-2) ^ 2 ) + sqrt ((4-2) ^ 2 + (4-2) ^ 2))) / 2 = (sqrt (2) + sqrt (8)) / 2 = 2,1213 - балл = ( 2.1213 - sqrt (2) / 2.1213 = 0,33333
Оценка силуэта = (0,6 + 0,33333) / 2 = 0,4666667
Квадрат евклидова расстояния :
Точка (1,1)
:
a
= (2-1) ^ 2 + (2-1) ^ 2 = 2 b
= ((3-1) ^ 2 + (3-1) ^ 2 + (4-1) ^ 2 + (4-1) ^ 2) / 2 = (8 + 18) / 2 = 13 - балл = (13 - 2) / 13 = 0,84615 * 109 1 *
Точка (2,2)
:
a
= (2-1) ^ 2 + (2-1) ^ 2 = 2 b
= ((3-2) ^ 2 + (3-2) ^ 2 + (4-2) ^ 2 + (4-2) ^ 2) / 2 = (2 + 8) / 2 = 5 - балл = (5 - 2) / 5 = 0,6
Силуэт = = 0,84615 + 0,6 / 2 = 0,723075