我有一个如下所示的 DataFrame:
+-----+--------------------+
| 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:
- 此维度的值为 user1 的 0.0、user2 的 4.0 和 user3 的 7.0。
- 这些值的平均值为:(0+4+7)/3 = 3.667
- SD 为: sqrt[ ( (0-3.667)^2 + (4-3.667)^2 + (7-3.667)^2 ) /3] = 2.868
- 用户 1 的单位标准差应为:(平均值)/SD = (0-3.667)/2.868 = -1.279
问题是:为什么输出 DataFrame 中的 user1 这个维度的值为零?