#python #pyspark #data-science #databricks
Вопрос:
Может кто-нибудь помочь мне понять, почему мой PCA получает разные результаты при каждом запуске? Я работаю в Pyspark, используя Databricks
Текущая реализация моего кода выглядит следующим образом
from pyspark.ml.feature import PCA
from pyspark.mllib.linalg import Vectors
pca = PCA(k=35, inputCol="scaled_features", outputCol="pcaFeatures")
model = pca.fit(df.select('scaled_features'))
result = model.transform(df.select('scaled_features'))
print(model.explainedVariance)
Если я запускаю этот код несколько раз, я получаю разные результаты для объясненной дисперсии
Разница довольно мала, но когда я пытаюсь выполнить кластеризацию K-средних после, разница сильно меняет результат.
Ответ №1:
PySpark — это распределенная вычислительная система, основанная на распределенных версиях алгоритмов k-Means и PCA. В распределенных версиях они могут быть недетерминированными и иметь ненулевые границы ошибок (см. Ссылки Внизу) из-за характера локализации данных и отсутствия универсального представления набора данных в качестве необходимых ограничений дизайна.
Каждый алгоритм разработан таким образом, что ни одна отдельная машина не имеет доступа ко всем данным одновременно, чтобы позволить наборам данных быть слишком большими для этого. На каждом этапе вычислений локальные сегменты данных используются для генерации данных для промежуточных результатов, которые затем перетасовываются по узлам с доступной емкостью. Какая запись сгруппирована с какой другой записью, может изменить результаты для PCA. Синхронизировать то, в каком порядке доступны машины, и какие элементы готовы к следующей итерации, непросто.
k-средние (даже на одной машине) также могут быть очень недетерминированными — они очень чувствительны к начальным начальным центроидам кластеров. Может помочь убедиться, что вы всегда начинаете с одних и тех же центроидов (но если это выполняется для изменяющихся функций PCA, это не поможет). Также следует учитывать тщательную настройку случайных начальных значений на каждой машине, чтобы они не сталкивались. Также может помочь гарантировать, что одни и те же данные назначаются одним и тем же разделам в начале выполнения с помощью сортировки / индексов. Все эти вещи вместе могут улучшить разницу между запусками, но есть много движущихся частей, которые все играют определенную роль.
https://www.cs.cmu.edu /~ninamf/документы/Распространяемые pcaandcoresets.pdf