Различные оценки силуэта при использовании sklearn и Spark - PullRequest
2 голосов
/ 26 марта 2020

Когда я вычисляю оценку силуэта с теми же данными и теми же значениями прогноза при использовании Spark и sklearn, я получаю разные результаты.

Вот код, используемый для Spark:

>>> prediction.show()
+---+---+---------+----------+
|  a|  b| features|prediction|
+---+---+---------+----------+
|  1|  1|[1.0,1.0]|         1|
|  2|  2|[2.0,2.0]|         1|
|  3|  3|[3.0,3.0]|         0|
|  4|  4|[4.0,4.0]|         0|
+---+---+---------+----------+

>>> from pyspark.ml.evaluation import ClusteringEvaluator
>>> evaluator = ClusteringEvaluator()
>>> silhouette = evaluator.evaluate(prediction)
>>> silhouette
0.7230769230769223

Вот код, используемый для sklearn:

>>> from sklearn.cluster import KMeans
>>> from sklearn import metrics
>>> x=[[1,1],[2,2],[3,3],[4,4]]
>>> prediction = KMeans(n_clusters=2,max_iter=1000,random_state=123).fit_predict(x)
>>> prediction
array([1, 1, 0, 0], dtype=int32)
>>> silhouette = metrics.silhouette_score(x, prediction)
>>> silhouette
0.46666666666666673

Как показано выше, оценки очень разные, хотя входные данные совпадают. Почему это так?

1 Ответ

4 голосов
/ 26 марта 2020

Основное отличие состоит в том, что используются различные меры расстояния .

В 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

...