降維(dimensionality reduction) 是機器學習中的一種重要的特徵處理手段,它可以減少計算過程中考慮到的隨機變數(即特徵)的個數,其被廣泛應用於各種機器學習問題中,用於消除雜訊、對抗資料稀疏問題。它在盡可能維持原始資料的內在結構的前提下,從原始和雜訊特徵中提取潛在特徵或在保持結構的同時壓縮資料得到一組描述原資料的,低維度的隱式特徵(或稱主要特徵)。
spark mllib為org.apache.spark.mllib.linalg.distributed.rowmatrix
類上的降維提供支援。
mllib機器學習庫提供了兩個常用的降維方法:
一、奇異值分解(svd)
mllib內建的奇異值分解功能位於org.apache.spark.mllib.linalg
包下的rowmatrix
和indexedrowmatrix
類中,所以,我們必須先通過已有資料建立出相應矩陣型別的物件,然後呼叫該類的成員方法來進行svd分解:
%spark其中,v是右奇異向量,u是左奇異向量,s是奇異值。在實際運用中,只需要import org.apache.spark.mllib.linalg.matrix
import org.apache.spark.mllib.linalg.singularvaluedecomposition
import org.apache.spark.mllib.linalg.vector
import org.apache.spark.mllib.linalg.vectors
import org.apache.spark.mllib.linalg.distributed.rowmatrix
//建立樣本矩陣,由乙個稀疏向量兩個稠密向量組成
val data =array(
vectors.sparse(
5, seq((1, 1.0), (3, 7.0
))),
vectors.dense(
2.0, 0.0, 3.0, 4.0, 5.0
), vectors.dense(
4.0, 0.0, 0.0, 6.0, 7.0
))//
將樣本矩陣生成rdd
val rows =sc.parallelize(data)
//建立行矩陣
val mat: rowmatrix = new
rowmatrix(rows)
//計算前5個奇異值和相應的奇異向量。
val svd: singularvaluedecomposition[rowmatrix, matrix] = mat.computesvd(5, computeu = true
)//
val u: rowmatrix = svd.u //
u因子是乙個行矩陣。
val s: vector = svd.s //
s奇異值儲存在區域性稠密向量中。
val v: matrix = svd.v //
v因子是乙個區域性稠密矩陣。
v
和s
兩個成員,即可通過矩陣計算達到降維的效果。
如果需要獲得u
成員,可以在進行svd分解時,指定computeu
引數,令其等於true
,即可在分解後的svd
物件中拿到u
成員。
二、主成分分析(pca)
mllib提供了兩種進行pca變換的方法,第一種與上文提到的svd分解類似,位於org.apache.spark.mllib.linalg
包下的rowmatrix
中,pca變換示例:
%spark除了矩陣類內建的pca變換外,mllib還提供了一種「模型式」的pca變換實現,它位於import org.apache.spark.mllib.linalg.matrix
import org.apache.spark.mllib.linalg.vectors
import org.apache.spark.mllib.linalg.distributed.rowmatrix
val data =array(
vectors.sparse(
5, seq((1, 1.0), (3, 7.0
))),
vectors.dense(
2.0, 0.0, 3.0, 4.0, 5.0
), vectors.dense(
4.0, 0.0, 0.0, 6.0, 7.0
))//
生成rdd
val rows =sc.parallelize(data)
//生成行矩陣
val mat: rowmatrix = new
rowmatrix(rows)
//計算前4個主成分
//將主成分儲存到本地矩陣pc中
val pc: matrix = mat.computeprincipalcomponents(4)//
將行矩陣投影到由前4個主成分構成的線性空間。
val projected: rowmatrix = mat.multiply(pc)
輸出:pc: org.apache.spark.mllib.linalg.matrix = -0.44859172075072673 -0.28423808214073987 0.08344545257592471 0.8364102009456849
0.13301985745398526 -0.05621155904253121 0.044239792581370035 0.17224337841622106
-0.1252315635978212 0.7636264774662965 -0.578071228563837 0.2554154886635869
0.21650756651919933 -0.5652958773533949 -0.7955405062786798 4.858121429822393e-5
-0.8476512931126826 -0.11560340501314653 -0.1550117891430013 -0.4533355491646027
注意:其中每一列代表乙個主成分(新座標軸),每一行代表原有的乙個特徵。
org.apache.spark.mllib.feature
包下的pca
類,它可以接受rdd[vectors]
作為引數,進行pca變換。
該方法特別適用於原始資料是labeledpoint
型別的情況,只需取出labeledpoint
的feature
成員(它是rdd[vector]
型別),對其做pca操作後再放回,即可在不影響原有標籤情況下進行pca變換。
%sparkimport org.apache.spark.mllib.feature.pca
import org.apache.spark.mllib.linalg.vectors
import org.apache.spark.mllib.regression.labeledpoint
import org.apache.spark.rdd.rdd
val data: rdd[labeledpoint] =sc.parallelize(seq(
new labeledpoint(0, vectors.dense(1, 0, 0, 0, 1
)),
new labeledpoint(1, vectors.dense(1, 1, 0, 1, 0
)),
new labeledpoint(1, vectors.dense(1, 1, 0, 0, 0
)),
new labeledpoint(0, vectors.dense(1, 0, 0, 0, 0
)),
new labeledpoint(1, vectors.dense(1, 1, 0, 0, 0
))))
//計算前5個主成分。建立乙個
pca
類的物件,在構造器中給定主成分個數為3,並呼叫其fit
方法來生成乙個pcamodel
類的物件pca
,該物件儲存了對應的主成分矩陣.val pca = new pca(3).fit(data.map(_.features))
//將向量投影到由前3個主成分構成的線性空間,保留標籤.對於
labeledpoint
型的資料來說,可使用map
運算元對每一條資料進行處理,將features
成員替換成pca變換後的特徵即可val projected = data.map(p => p.copy(features = pca.transform(p.features)))
機器學習 降維
資料降維的主要方法 投影和流形學習 投影 高維空間的所有訓練例項實際上 或近似於 受乙個低得多的低維子空間所影響 投影並不是降維的最佳方法。許多情況下,許多情況下,子空間可能會彎曲或轉動,比如 著名的瑞士卷玩具資料集 簡單地進行平面投影會直接將瑞士卷的不同層壓扁在一起。d維流形就是n維空間的一部分,...
機器學習 降維
資料壓縮 視覺化 pca principal component analysis 即主成分分析方法,是一種使用最廣泛的資料降維演算法。pca的主要思想是將n維特徵對映到k維上,這k維是全新的正交特徵也被稱為主成分,是在原有n維特徵的基礎上重新構造出來的k維特徵。pca的工作就是從原始的空間中順序地...
機器學習 降維
1 什麼是降維?數學知識 特徵值分解 設a是n階方陣,如果有常數 和n維非零列向量 的關係式 a 成立,則稱 為方陣a的特徵值,非零向量 稱為方陣a的對應於特徵值入的特徵向量 降維 將資料的特徵數量從高維轉換到低維 實際中很多資料是高維的,但資料 內在的維度 可能更低 例如 通訊資料原始有7維 入網...