Spark / PySpark — кластеризация GMM, возвращающая идеальную равновероятность и только 1 кластер

Я пытаюсь применить алгоритм кластеризации GMM (как в https://spark.apache.org/docs/latest/ml-clustering.html) в данном DataFrame следующим образом:

vector.show(1)

ID | Функции

33.0 | [0.0,1.0,27043.0,....]

type(vector)

pyspark.sql.dataframe.DataFrame

type(vector.select('features'))

pyspark.sql.dataframe.DataFrame

vector.printSchema()

корень

|-- id: double (nullable = true)

|-- признаки: вектор (обнуляемый = истина)

Затем я попробовал следующий код для создания кластеров:

from pyspark.ml.clustering import GaussianMixture
gmm = GaussianMixture().setK(5).setSeed(538009335).setFeaturesCol("features")
gmm_model = gmm.fit(vector)
gmm_model.gaussiansDF.show()
gmm_predictions = gmm_model.transform(vector)
gmm_predictions.show()

Это работает без каких-либо ошибок или проблем, но алгоритм, в конце концов, возвращает одно и то же среднее значение и ковариацию для всех кластеров и присваивает каждой строке/идентификатору один и тот же кластер 0 (вероятность всегда равна 0,2 для любого кластера ([0,2,0,2,0,2,0,2 ,0,2])).

Не могли бы вы знать, почему это дает мне такие результаты, пожалуйста?

NB: данные не несут ответственности за эту «плохую» кластеризацию: попробовав Kmeans с Scikit-learn и PySpark, я получаю «реалистичную» кластеризацию с Scikit-learn.

Спасибо заранее за вашу помощь.

С наилучшими пожеланиями


person Olscream    schedule 31.05.2019    source источник
comment
Попробуйте нормализовать данные перед кластеризацией. Я не удивлюсь, если у Spark будут какие-то числовые проблемы...   -  person Has QUIT--Anony-Mousse    schedule 31.05.2019
comment
Прежде всего большое спасибо за вашу помощь Anony-Mousse! Что касается вашей идеи, я попытался нормализовать данные L1 (как описано здесь: spark.apache.org/docs/2.2.0/ml-features.html#normalizer) и вернулся на этапе обучения: breeze.linalg.NotConvergedException: (как здесь: stackoverflow.com/questions/47340602/)   -  person Olscream    schedule 03.06.2019
comment
Если я попытаюсь обработать функции с помощью MinMaxScaler, кластеризация никогда не завершится (даже через 2 часа (тогда как без каких-либо методов масштабирования это занимает всего 5 минут)).   -  person Olscream    schedule 03.06.2019
comment
Вы уже столкнулись с этой проблемой?   -  person Olscream    schedule 03.06.2019


Ответы (1)


Я думаю, что основная причина плохой кластеризации заключается в том, что pyspark GMM использует только диагональную ковариационную матрицу, а не полную ковариационную матрицу. Матрица диагональной ковариации не учитывает ковариацию между признаками, присутствующими в наборе данных, и, таким образом, может привести к плохой кластеризации.

Вы можете проверить реализацию GMM в pyspark по адресу: https://github.com/apache/spark/blob/master/mllib/src/main/scala/org/apache/spark/ml/clustering/GaussianMixture.scala

Где, как и при реализации GMM Sklearn, по умолчанию они используют полную ковариационную матрицу, которая включает ковариацию между каждой из присутствующих функций, а не диагональную ковариационную матрицу.

person Ashu Kushwaha    schedule 10.03.2021