spark廈大 奇異值分解(SVD)

2021-07-31 07:04:05 字數 3751 閱讀 1647

降維(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包下的rowmatrixindexedrowmatrix類中,所以,我們必須先通過已有資料建立出相應矩陣型別的物件,然後呼叫該類的成員方法來進行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方法計算分解結果,這一結果儲存在型別為singularvaluedecompositionsvd物件中:

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物件的vsu成員分別拿到進行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...