spark-------主成分分析(PCA)

主成分分析(PCA)

1、概念介紹

主成分分析(PCA) 是一種對數據進行旋轉變換的統計學方法,其本質是在線性空間中進行一個基變換,使得變換後的數據投影在一組新的“座標軸”上的方差最大化,隨後,裁剪掉變換後方差很小的“座標軸”,剩下的新“座標軸”即被稱爲 主成分(Principal Component) ,它們可以在一個較低維度的子空間中儘可能地表示原有數據的性質。主成分分析被廣泛應用在各種統計學、機器學習問題中,是最常見的降維方法之一。PCA有許多具體的實現方法,可以通過計算協方差矩陣,甚至是通過上文提到的SVD分解來進行PCA變換。

2、PCA變換

MLlib提供了兩種進行PCA變換的方法,第一種與上文提到的SVD分解類似,位於org.apache.spark.mllib.linalg包下的RowMatrix中,這裏,我們同樣讀入上文中提到的a.mat文件,對其進行PCA變換:

scala> import org.apache.spark.mllib.linalg.Vectors
scala> import org.apache.spark.mllib.linalg.distributed.RowMatrix
scala> val data = sc.textFile("a.mat").map(_.split(" ").map(_.toDouble)).map(line => Vectors.dense(line))
data: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector] = MapPartitionsRDD[3] at map at :31
//通過RDD[Vectors]創建行矩陣
scala> val rm = new RowMatrix(data)
rm: org.apache.spark.mllib.linalg.distributed.RowMatrix = org.apache.spark.mllib.linalg.distributed.RowMatrix@4397952a
//保留前3個主成分
scala> val pc = rm.computePrincipalComponents(3)
pc: org.apache.spark.mllib.linalg.Matrix =
-0.41267731212833847  -0.3096216957951525    0.1822187433607524
0.22357946922702987   -0.08150768817940773   0.5905947537762997
-0.08813803143909382  -0.5339474873283436    -0.2258410886711858
0.07580492185074224   -0.56869017430423      -0.28981327663106565
0.4399389896865264    -0.23105821586820194   0.3185548657550075
-0.08276152212493619  0.3798283369681188     -0.4216195003799105
0.3952116027336311    -0.19598446496556066   -0.17237034054712738
0.43580231831608096   -0.023441639969444372  -0.4151661847170216
0.468703853681766     0.2288352748369381     0.04103087747663084

可以看到,主成分矩陣是一個尺寸爲(9,3)的矩陣,其中每一列代表一個主成分(新座標軸),每一行代表原有的一個特徵,而a.mat矩陣可以看成是一個有4個樣本,9個特徵的數據集,那麼,主成分矩陣相當於把原有的9維特徵空間投影到一個3維的空間中,從而達到降維的效果。

可以通過矩陣乘法來完成對原矩陣的PCA變換,可以看到原有的(4,9)矩陣被變換成新的(4,3)矩陣。

scala> val projected = rm.multiply(pc)
projected: org.apache.spark.mllib.linalg.distributed.RowMatrix = org.apache.spark.mllib.linalg.distributed.RowMatrix@2a805829
scala> projected.rows.foreach(println)
[12.247647483894383,-2.725468189870252,-5.568954759405281]
[2.8762985358626505,-2.2654415718974685,1.428630138613534]
[12.284448024169402,-12.510510992280857,-0.16048149283293078]
[-1.2537294080109986,-10.15675264890709,-4.8697886049036025]

需要注意的是,MLlib提供的PCA變換方法最多隻能處理65535維的數據。

3、“模型式”的PCA變換實現

除了矩陣類內置的PCA變換外,MLlib還提供了一種“模型式”的PCA變換實現,它位於org.apache.spark.mllib.feature包下的PCA類,它可以接受RDD[Vectors]作爲參數,進行PCA變換。

該方法特別適用於原始數據是LabeledPoint類型的情況,只需取出LabeledPointfeature成員(它是RDD[Vector]類型),對其做PCA操作後再放回,即可在不影響原有標籤情況下進行PCA變換。

首先引入需要使用到的類:

import org.apache.spark.mllib.feature.PCA
import org.apache.spark.mllib.regression.LabeledPoint

依然使用前文的a.mat矩陣,爲了創造出LabeledPoint,我們爲第一個樣本標註標籤爲0.0,其他爲1.0

scala> val data = sc.textFile("a.mat").map(_.split(" ").map(_.toDouble)).map(line => {
     |     LabeledPoint( if(line(0) > 1.0) 1.toDouble else 0.toDouble, Vectors.dense(line) )
     | })
data: org.apache.spark.rdd.RDD[org.apache.spark.mllib.regression.LabeledPoint] = MapPartitionsRDD[16] at map at :34

scala> data.foreach(println)
(0.0,[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0])
(1.0,[6.0,4.0,2.0,1.0,3.0,4.0,2.0,1.0,5.0])
(1.0,[5.0,6.0,7.0,8.0,9.0,0.0,8.0,6.0,7.0])
(1.0,[9.0,0.0,8.0,7.0,1.0,4.0,3.0,2.0,1.0])

隨後,創建一個PCA類的對象,在構造器中給定主成分個數爲3,並調用其fit方法來生成一個PCAModel類的對象pca,該對象保存了對應的主成分矩陣:

scala> val pca = new PCA(3).fit(data.map(_.features))
pca: org.apache.spark.mllib.feature.PCAModel = org.apache.spark.mllib.feature.PCAModel@68602c26

對於LabeledPoint型的數據來說,可使用map算子對每一條數據進行處理,將features成員替換成PCA變換後的特徵即可:

scala> val projected = data.map(p => p.copy(features = pca.transform(p.features)))
projected: org.apache.spark.rdd.RDD[org.apache.spark.mllib.regression.LabeledPoint] = MapPartitionsRDD[20] at map at :39

scala> projected.foreach(println)
(0.0,[12.247647483894383,-2.725468189870252,-5.568954759405281])
(1.0,[2.8762985358626505,-2.2654415718974685,1.428630138613534])
(1.0,[12.284448024169402,-12.510510992280857,-0.16048149283293078])
(1.0,[-1.2537294080109986,-10.15675264890709,-4.8697886049036025])

--------------------- 本文來自 小丁丁_ddxdd 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/qq_34941023/article/details/70880477?utm_source=copy

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章