1. 程式人生 > >Spark MLlib 1.6 -- 降維

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 是一個正交下三角矩陣

對於高維矩陣進行分解時,可以進一步將

U , \Sigma , V 進行分塊,只計算相應於\Sigma 不為0的塊,這樣我們只關心U , \Sigma, 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)  如果

n 很小(如n < 100 k 相對於n 很大(如 k > n / 2 , 我們首先計算Gramian矩陣 A^T A , 然後計算Gramian 矩陣的前k 個特徵值和特徵向量。一次互動時,每個executor 和每個worker上的儲存消耗是O(n^2) , driver上計算消耗是O(n^2 k)

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的所有依賴。