我有以下列表
id1, column_index1, value1
id2, column_index2, value2
...
我转换为索引行矩阵,执行以下操作:
val data_mapped = data.map({ case (id, col, score) => (id, (col, score))})
val data_mapped_grouped = data_mapped.groupByKey
val indexed_rows = data_mapped_grouped.map({ case (id, vals) => IndexedRow(id, Vectors.sparse(nCols.value, vals.toSeq))})
val mat = new IndexedRowMatrix(indexed_rows)
我想对此矩阵执行一些预处理:从每列中删除列的总和,按其方差标准化每列。 我确实尝试使用内置的标准缩放器
val scaler = new StandardScaler().fit(indexed_rows.map(x => x.features))
但是使用IndexedRow类型
似乎不可能感谢您的帮助!
答案 0 :(得分:2)
根据我从您的问题中所理解的内容,以下是您需要执行的StandardScaler
适合IndexedRow
import org.apache.spark.mllib.feature.{StandardScaler, StandardScalerModel}
import org.apache.spark.mllib.linalg.distributed.IndexedRow
import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.rdd.RDD
val data: RDD[(Int, Int, Double)] = ???
object nCol {
val value: Int = ???
}
val data_mapped: RDD[(Int, (Int, Double))] =
data.map({ case (id, col, score) => (id, (col, score)) })
val data_mapped_grouped: RDD[(Int, Iterable[(Int, Double)])] =
data_mapped.groupByKey
val indexed_rows: RDD[IndexedRow] = data_mapped_grouped.map {
case (id, vals) =>
IndexedRow(id, Vectors.sparse(nCol.value, vals.toSeq))
}
您可以使用简单的地图从IndexedRow获取矢量
val vectors: RDD[Vector] = indexed_rows.map { case i: IndexedRow => i.vector }
现在您有了RDD [Vector],您可以尝试将其与缩放器匹配。
val scaler: StandardScalerModel = new StandardScaler().fit(vectors)
我希望这有帮助!