2015-10-26 66 views
2

我有以下列表規模矩陣/星火

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

你得到的錯誤是什麼? – eliasah

+0

它只是不是IndexedRow類型的成員。我不一定希望使用內置函數。 – fricadelle

+0

我知道這不是,但我很難理解你想做什麼。爲什麼你會使用IndexedRow,如果你只需要它的功能(Vector) – eliasah

回答

2

據我從你的問題的理解,這裏就是你需要做的,在你的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)) 
} 

執行StandardScaler適合你可以從你的IndexedRow用一個簡單的地圖讓你的載體是什麼

val vectors: RDD[Vector] = indexed_rows.map { case i: IndexedRow => i.vector } 

既然您已經擁有了一個RDD [矢量],您可以嘗試使用它的縮放器。

val scaler: StandardScalerModel = new StandardScaler().fit(vectors) 

我希望這有助於!

+1

我執行以下操作: VAL StandardScalerModel =新StandardScaler(withMean =真,withStd =假).fit(載體) VAL rows_normalized = vectors.map(X => StandardScalerModel.transform(X)) ,其拋出的java。 lang.IllegalArgumentException:不支持向量類型類org.apache.spark.mllib.linalg.SparseVector \t at org.apache.spark.mllib.feature.StandardScalerModel.transform(StandardScaler.scala:143) – fricadelle

+0

它工作,如果我轉換矢量爲密集矢量,即: val vectors = indexed_rows.map {case i:IndexedRow => Vectors.dense(i.vector.toArray)} – fricadelle