Spark MLlib 1.6 -- 降維
降維是在計算過程中減少計算量,降低計算複雜度的方法。把特徵向量中可以乎略的部分或噪音部分剔除,也可以是保持特徵向量主要特徵的前提下對向量維度進行壓縮。Spark.mllib 支援行矩陣類(rowmatrix class)的維度降低方法。
6.1 奇異值分解 ---SVD
奇異值分解方法將矩陣拆分成三個矩陣的乘積,U , \Sigmad, V .使得
A = U \Sigma V^T
此處
1) U是一個正交上三角矩陣
2) \Sigma 是一個對角非負矩陣,進一步可以要求對角上的值按降序排列,這些對角值稱為奇異值
3) V 是一個正交下三角矩陣
對於高維矩陣進行分解時,可以進一步將
當然我們也可以人為的只取\Sigma 的前k 個奇異值,這樣每個矩陣分別是:
1) U: m x k
2) \Sigma: k x k
3) V: n x k
6.1.1 效能
假設n < m , 那麼奇異值和奇異向量分別是Gramian 陣 A^T A 的特徵值和特徵向量。上三角矩陣U 可以通過公式計算 U =A (V S^(-1)). 實際計算中要考慮計算開銷來選擇計算方法。
1) 如果
2) 否則,我們平行計算(A^T A)v,然後使用ARPACK(一種軟體)在driver上計算(A^T A) 的前k表特徵值和特徵向量。這就需要O(k) 次互動,每次互動在executor上儲存消耗是O(n),在driver上儲存消耗是O(n k)。
6.1.2 SVD
Spark.mllib 提供按行儲存矩形的SVD分解,見RowMatrix類
importorg.apache.spark.mllib.linalg.Matrix
importorg.apache.spark.mllib.linalg.distributed.RowMatrix
importorg.apache.spark.mllib.linalg.SingularValueDecomposition
val mat:RowMatrix=...
// Computethe top 20 singular values and corresponding singular vectors.
val svd:SingularValueDecomposition[RowMatrix, Matrix]= mat.computeSVD(20, computeU =true)
val U:RowMatrix= svd.U // The Ufactor is a RowMatrix.
val s:Vector= svd.s // Thesingular values are stored in a local dense vector.
val V:Matrix= svd.V // The Vfactor is a local dense matrix.
如果 U是一個IndexedRowMatrix,同樣的程式碼仍然適用。
6.2 主成分分析(PCA)
主成分分析(PCA)是尋找一組旋轉軸,將原有特徵向量投影到旋轉軸得到一組新的特徵向量,可以保證新得到的特徵向量方差最大化。這個旋轉矩陣(由旋轉軸列向量組成的矩陣)的每一列(或每個旋轉軸列向量)叫主成分。 PCA是廣範使用的降維方法。
Spark.mllib 支援對”瘦高“矩陣的PCA演算法,按行儲存行向量,或其它列向量。
下面的演示程式碼展示如何對按行儲存向量RowMatrix使用PCA,將向量集投影到低維空間。
RowMatrix ScalaDocs API : http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.mllib.linalg.distributed.RowMatrix
importorg.apache.spark.mllib.linalg.Matrix
importorg.apache.spark.mllib.linalg.distributed.RowMatrix
val mat:RowMatrix=...
// Computethe top 10 principal components.
val pc:Matrix= mat.computePrincipalComponents(10)//Principal components are stored in a local dense matrix.
// Projectthe rows to the linear space spanned by the top 10 principal components.
val projected:RowMatrix= mat.multiply(pc)
下面程式碼展示如果計算列向量集的PCA,然後將向量投影到低維空間,同時儲存向量標籤
PCA ScalaDocsAPI : http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.mllib.feature.PCA
importorg.apache.spark.mllib.regression.LabeledPoint
importorg.apache.spark.mllib.feature.PCA
val data:RDD[LabeledPoint]=...
// Computethe top 10 principal components.
val pca =newPCA(10).fit(data.map(_.features))
// Projectvectors to the linear space spanned by the top 10 principal components, keepingthe label
val projected= data.map(p => p.copy(features = pca.transform(p.features)))
為了執行上面的例項程式碼,需要閱讀spark自包含應用(self-containedapplications)章節,確定引入spark-mllib的所有依賴。