降維(dimensionality reduction)是機器學習中的一種重要的特徵處理手段,它可以減少計算過程中考慮到的隨機變數(即特徵)的個數,其被廣泛應用於各種機器學習問題中,用於消除雜訊、對抗資料稀疏問題。它在盡可能維持原始資料的內在結構的前提下,得到一組描述原資料的,低維度的隱式特徵(或稱主要特徵)。
mllib機器學習庫提供了兩個常用的降維方法:奇異值分解(singular value decomposition,svd)和主成分分析(principal component analysis,pca),下面我們將通過例項介紹其具體的使用方法。
奇異值分解(svd)** **於代數學中的矩陣分解問題,對於乙個方陣來說,我們可以利用矩陣特徵值和特徵向量的特殊性質(矩陣點乘特徵向量等於特徵值數乘特徵向量),通過求特徵值與特徵向量來達到矩陣分解的效果: a=
qσq−
1a=qσq−1
這裡,qq
是由特徵向量組成的矩陣,而 σς
是特徵值降序排列構成的乙個對角矩陣(對角線上每個值是乙個特徵值,按降序排列,其他值為0),特徵值的數值表示對應的特徵的重要性。
在很多情況下,最大的一小部分特徵值的和即可以約等於所有特徵值的和,而通過矩陣分解的降維就是通過在qq
、σσ中刪去那些比較小的特徵值及其對應的特徵向量,使用一小部分的特徵值和特徵向量來描述整個矩陣,從而達到降維的效果。
但是,實際問題中大多數矩陣是以奇異矩陣形式,而不是方陣的形式出現的,奇異值分解是特徵值分解在奇異矩陣上的推廣形式,它將乙個維度為m×
nm×n
奇異矩陣aa
分解成三個部分 :a=
uσvt
a=uσvt
其中uu、
vv是兩個正交矩陣,其中的每一行(每一列)分別被稱為左奇異向量和右奇異向量,他們和 σς
中對角線上的奇異值相對應,通常情況下我們只需要取乙個較小的值kk
,保留前kk
個奇異向量和奇異值即可,其中uu
的維度是m×
km×k、v
v的維度是n×
kn×k、σ
σ是乙個k×
kk×k
的方陣,從而達到降維效果。
mllib內建的奇異值分解功能位於org.apache.spark.mllib.linalg
包下的rowmatrix
和indexedrowmatrix
類中,所以,我們必須先通過已有資料建立出相應矩陣型別的物件,然後呼叫該類的成員方法來進行svd分解,這裡以rowmatrix
為例:
首先,引入需要的類:
import org.apache.spark.mllib.linalg.distributed.rowmatrix
準備好乙個矩陣,這裡我們採用乙個簡單的檔案a.mat
來儲存乙個尺寸為(4,9)的矩陣,其內容如下:
1 2 3 4 5 6 7 8 9
5 6 7 8 9 0 8 6 7
9 0 8 7 1 4 3 2 1
6 4 2 1 3 4 2 1 5
隨後,將該文字檔案讀入成rdd[vector]
,並轉換成rowmatrix
,即可呼叫rowmatrix
自帶的computesvd
方法計算分解結果,這一結果儲存在型別為singularvaluedecomposition
的svd
物件中:
scala> val data = sc.textfile("a.mat").map(_.split(" ").map(_.todouble)).map(line => vectors.dense(line))
//通過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 svd = rm.computesvd(3)
svd: org.apache.spark.mllib.linalg.singularvaluedecomposition[o....
通過訪問svd
物件的v
、s
、u
成員分別拿到進行svd分解後的右奇異矩陣、奇異值向量和左奇異矩陣:
scala> svd.s
res7: org.apache.spark.mllib.linalg.vector = [28.741265581939565,10.847941223452608,7.089519467626695]
scala> svd.v
res8: org.apache.spark.mllib.linalg.matrix =
-0.32908987300830383
0.6309429972945555
0.16077051991193514
-0.2208243332000108
-0.1315794105679425
-0.2368641953308101
-0.35540818799208057
0.39958899365222394
-0.147099615168733
-0.37221718676772064
0.2541945113699779
-0.25918656625268804
-0.3499773046239524
-0.24670052066546988
-0.34607608172732196
-0.21080978995485605
0.036424486072344636
0.7867152486535043
-0.38111806017302313
-0.1925222521055529
-0.09403561250768909
-0.32751631238613577
-0.3056795887065441
0.09922623079118417
-0.3982876638452927
-0.40941282445850646
0.26805622896042314
scala> svd.u
res9: org.apache.spark.mllib.linalg.distributed.rowmatrix = null
如果需要獲得u
成員,可以在進行svd分解時,指定computeu
引數,令其等於true
,即可在分解後的svd
物件中拿到u
成員,如下文所示:
scala> val svd = rm.computesvd(3, computeu = true)
svd: org.apache.spark.mllib.linalg.singularvaluedecomposition[o
奇異值分解 SVD
最近不小心接觸到了svd,然後認真看下去之後發現這東西真的挺強大的,把乙個推薦問題轉化為純數學矩陣問題,看了一些部落格,把乙個寫個比較具體的博文引入進來,給自己看的,所以把覺得沒必要的就去掉了,博文下面附原始部落格位址。一 基礎知識 1.矩陣的秩 矩陣的秩是矩陣中線性無關的行或列的個數 2.對角矩陣...
SVD奇異值分解
原文出處 今天我們來講講奇異值分解和它的一些有意思的應用。奇異值分解是乙個非常,非常,非常大的話題,它的英文是 singular value decomposition,一般簡稱為 svd。下面先給出它大概的意思 對於任意乙個 m n 的矩陣 m 不妨假設 m n 它可以被分解為 m udv t 其...
奇異值分解(SVD)
svd是singular value decomposition的縮寫,是去除冗餘 資訊提取和資料約簡的強大工具。若a為p q實數矩陣,則存在p階正交矩陣u和q階正交矩陣v,使得 a u v 上式就是奇異值分解,其中p q矩陣 中,i,i 元素 i 0,i 1,2,3,min p,q 其他元素均為0...