2
我有一個數據幀,看起來像如下:爲什麼StandardScaler會給出非零的維值,因爲方差不是零?
+-----+--------------------+
| uid| features|
+-----+--------------------+
|user1| (7,[1],[5.0])|
|user2|(7,[0,2],[13.0,4.0])|
|user3|(7,[2,3],[7.0,45.0])|
+-----+--------------------+
的特點列是稀疏向量,大小等於4
我申請一個StandardScaler如下:
import org.apache.spark.ml.feature.StandardScaler
val scaler = new StandardScaler()
.setInputCol("features")
.setOutputCol("scaledFeatures")
.setWithStd(true)
.setWithMean(false)
val scalerModel = scaler.fit(df)
// Normalize each feature to have unit standard deviation.
val scaledData = scalerModel.transform(transformed)
輸出DataFrame如下所示:
+-----+--------------------+--------------------+
| uid| features| scaledFeatures|
+-----+--------------------+--------------------+
|user1| (7,[1],[5.0])|(7,[1],[1.7320508...|
|user2|(7,[0,2],[13.0,4.0])|(7,[0,2],[1.73205...|
|user3|(7,[2,3],[7.0,45.0])|(7,[2,3],[1.99323...|
+-----+--------------------+--------------------+
正如我們所看到的,user1的scaledFeatures僅包含一個元素(其他元素爲零),但我期望每個scaledFeatures對於所有維度始終包含非零值,因爲方差不爲零。
讓我們例如第三維,即,每個特徵向量的索引2:
- 此維度具有0.0用戶1,4.0和用戶2 7.0用戶3的值。 (0 + 4 + 7)/ 3 = 3.667
- SD爲:sqrt [ 3.667)^ 2)/ 3] = 2.868
- 爲User1的單位標準偏差應爲:(值均)/ SD =(0-3.667)/2.868 = -1.279
的問題是:爲什麼輸出DataFrame中的user1對此維度具有零值?