Spark ML StandardScaler и Sklearn StandardScaler (with_std=True и with_mean=False)
Я пытаюсь переписать функцию с sklearn на spark ml, которая включает StandardScaler. Я пытаюсь установить его на единицу дисперсии, установив with_std=True и with_mean=False. Однако результаты Sklearn и Spark ML не совпадают. Дисперсия равна одной с реализацией от sklearn, в то время как она составляет ~0,80, а не 1 с Spark ML.
sklearn
#baseline vector pdf
a b
0 3 5
1 7 11
2 13 17
#translate origin to baseline_vectors' center
translate = StandardScaler(with_mean=False, with_std=True).fit(baseline_vectors_pdf)
baseline_translated = translate.transform(baseline_vectors_pdf)
# output:
array([[0.7299964 , 1.02062073],
[1.70332492, 2.2453656 ],
[3.16331771, 3.47011047]])
Spark ML
df = spark.createDataFrame([(3,5),(7,11),(13,17)], ["a", "b"])
vecAssembler = VectorAssembler(inputCols=["a", "b"], outputCol="features")
df = vecAssembler.transform(df)
scaler = StandardScaler(inputCol="features", outputCol="scaledFeatures",
withMean=False,withStd=True)
scalerModel = scaler.fit(df)
transformed_df = scalerModel.transform(df)
transformed_df.take(3)
# output:
[Row(a=3, b=5, features=DenseVector([3.0, 5.0]), scaledFeatures=DenseVector([0.596, 0.8333])),
Row(a=7, b=11, features=DenseVector([7.0, 11.0]), scaledFeatures=DenseVector([1.3908, 1.8333])),
Row(a=13, b=17, features=DenseVector([13.0, 17.0]), scaledFeatures=DenseVector([2.5828, 2.8333]))]
Я провел некоторые ручные вычисления, чтобы увидеть, что такое дисперсия в обоих случаях, и она не совпадает с единицей в случае Spark ML.
Spark ML (withMean = False и withStd=True)
Первая переменная:
Среднее = (0,596 + 1,3908 + 2,5828)/3 = 1,5232
Дисперсия = sqrt(((0,596-1,5232) ^ 2 + (1,3908-1,5232) ^ 2 + (2,5828-1,5232)^2)/3) = 0,8164928577
Вторая переменная:
Среднее = (0,8333 + 1,8333 + 2,8333)/3 = 1,8333
Дисперсия = sqrt(((0,8333-1,8333) ^ 2 + (1,8333-1,8333) ^ 2 + (2,8333-1,8333)^2)/3) = 0,8164965809
Sklearn (withMean = False и withStd=True)
Первая переменная:
Среднее = (0,7299964 + 1,7032322 + 3,16331771)/3 = 1,8655463433
Дисперсия = sqrt(((0.7299964-1.8655463433)^2 + (1.70332492-1.8655463433)^2 + (3.16331771-1.8655463433)^2)/3) = 0,99999999974
Вторая переменная:
Среднее = (1.02062073+2.2453656+3.47011047)/3 = 2.2453656
Дисперсия = sqrt(((1.02062073-2.2453656)^2 + (2.2453656-2.2453656)^2 + (3.47011047-2.2453656)^2)/3) = 0,99999999989