機器學習Python實現 SVD 分解

2021-12-29 19:43:32 字數 4770 閱讀 3216

任何乙個矩陣都可以分解為svd的形式

其實svd意義就是利用特徵空間的轉換進行資料的對映,後面將專門介紹svd的基礎概念,先給出python,這裡先給出乙個簡單的矩陣,表示使用者和物品之間的關係

這裡我自己有個疑惑?

對這樣乙個data = u(z)vt

這裡的u和v真正的幾何含義 : 書上的含義是u將物品對映到了新的特徵空間, v的轉置 將 使用者對映到了新的特徵空間

下面是**實現,同時svd還可以用於降維,降維的操作就是通過保留值比較的奇異值

# -*- coding: cp936 -*-

'''created on mar 8, 2011

@author: peter

'''from numpy import *

from numpy import linalg as la #用到別名

#這裡主要結合推薦系統介紹svd,所以這裡的資料都可以看成是使用者對物品的乙個打分

def loadexdata():

return[[0, 0, 0, 2, 2],

[0, 0, 0, 3, 3],

[0, 0, 0, 1, 1],

[1, 1, 1, 0, 0],

[2, 2, 2, 0, 0],

[5, 5, 5, 0, 0],

[1, 1, 1, 0, 0]]

def loadexdata2():

return[[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5],

[0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 3],

[0, 0, 0, 0, 4, 0, 0, 1, 0, 4, 0],

[3, 3, 4, 0, 0, 0, 0, 2, 2, 0, 0],

[5, 4, 5, 0, 0, 0, 0, 5, 5, 0, 0],

[0, 0, 0, 0, 5, 0, 1, 0, 0, 5, 0],

[4, 3, 4, 0, 0, 0, 0, 5, 5, 0, 1],

[0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4],

[0, 0, 0, 2, 0, 2, 5, 0, 0, 1, 2],

[0, 0, 0, 0, 5, 0, 0, 0, 0, 4, 0],

[1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0]]

def ecludsim(ina,inb):

return 1.0/(1.0 + la.norm(ina - inb)) #計算向量的第二正規化,相當於直接計算了歐式距離

def pearssim(ina,inb):

if len(ina) < 3 : return 1.0

return 0.5+0.5*corrcoef(ina, inb, rowvar = 0)[0][1] #corrcoef直接計算皮爾遜相關係數

def cossim(ina,inb):

num = float(ina.t*inb)

denom = la.norm(ina)*la.norm(inb)

return 0.5+0.5*(num/denom) #計算余弦相似度

#協同過濾演算法

#datamat 使用者資料 user 使用者 simmeas 相似度計算方式 item 物品

def standest(datamat, user, simmeas, item):

n = shape(datamat)[1] #計算列的數量,物品的數量

simtotal = 0.0; ratsimtotal = 0.0

for j in range(n):

userrating = datamat[user,j]

print(datamat[user,j])

if userrating == 0: continue #如果使用者u沒有對物品j進行打分,那麼這個判斷就可以跳過了

overlap = nonzero(logical_and(datamat[:,item].a>0, \

datamat[:,j].a>0))[0] #找到對物品 j 和item都打過分的使用者

if len(overlap) == 0: similarity = 0

else: similarity = simmeas(datamat[overlap,item], datamat[overlap,j]) #利用相似度計算兩個物品之間的相似度

print 'the %d and %d similarity is: %f' % (item, j, similarity)

simtotal += similarity

ratsimtotal += similarity * userrating #待推薦物品與使用者打過分的物品之間的相似度*使用者對物品的打分

if simtotal == 0: return 0

else: return ratsimtotal/simtotal

#利用svd進行分解,但是這裡是直接用的庫裡面的函式

#如果自己實現乙個svd分解,我想就是和矩陣論裡面的求解知識是一樣的吧,但是可能在求特徵值的過程中會比較痛苦

def svdest(datamat, user, simmeas, item):

n = shape(datamat)[1]

simtotal = 0.0; ratsimtotal = 0.0

u,sigma,vt = la.svd(datamat) #直接進行分解

sig4 = mat(eye(4)*sigma[:4]) #arrange sig4 into a diagonal matrix

xformeditems = datamat.t * u[:,:4] * sig4.i #create transformed items

for j in range(n):

userrating = datamat[user,j]

if userrating == 0 or j==item: continue

similarity = simmeas(xformeditems[item,:].t,\

xformeditems[j,:].t)

print 'the %d and %d similarity is: %f' % (item, j, similarity)

simtotal += similarity

ratsimtotal += similarity * userrating

if simtotal == 0: return 0

else: return ratsimtotal/simtotal

#真正的推薦函式,後面兩個函式就是採用的相似度的計算方法和推薦用的方法

def recommend(datamat, user, n=3, simmeas=cossim, estmethod=standest):

unrateditems = nonzero(datamat[user,:].a==0)[1] #find unrated items nonzero()[1]返回的是非零值所在的行數,返回的是乙個元組 if len(unrateditems) == 0: return 'you rated everything'

itemscores =

for item in unrateditems:www.2cto.com

estimatedscore = estmethod(datamat, user, simmeas, item)

itemscores.append((item, estimatedscore))

return sorted(itemscores, key=lambda jj: jj[1], reverse=true)[:n]

#擴充套件的例子,利用svd進行影象的壓縮

#將影象列印出來

def printmat(inmat, thresh=0.8):

for i in range(32):

for k in range(32):

if float(inmat[i,k]) > thresh:

print 1,

else: print 0,

print ''

#最後發現重構出來的資料圖是差不多的

def imgcompress(numsv=3, thresh=0.8):

myl =

for line in open('0_5.txt').readlines():

newrow =

for i in range(32):

newrow.append(int(line[i]))

myl.append(newrow)

mymat = mat(myl) #將資料讀入了mymat當中

print "****original matrix******"

printmat(mymat, thresh)

u,sigma,vt = la.svd(mymat)

sigrecon = mat(zeros((numsv, numsv))) #構建乙個3*3的空矩陣

for k in range(numsv):#construct diagonal matrix from vector

sigrecon[k,k] = sigma[k]

reconmat = u[:,:numsv]*sigrecon*vt[:numsv,:]

print "****reconstructed matrix using %d singular values******" % numsv

printmat(reconmat, thresh)

通過結果可以看到,降維前和降維後的基本都是相似的

機器學習 SVD分解

3 svd的舉例 4 svd的應用 5 svd的優缺點 參考經常看到svd奇異值分解,但一直沒有去了解它講的什麼,剛好在李航老師統計學習方法第二版上是單獨的一章,下面看了一些部落格總結一下 任意乙個m n m nm n的矩陣 m mm階正交陣 降序排列的非負對角線元素組成的m n m nm n對角陣...

SVD奇異值分解 機器學習

簡介 奇異值分解 singular value decomposition 是線性代數中一種重要的矩陣分解,是在機器學習領域廣泛應用的演算法,它不光可以用於降維演算法中的特徵分解,還可以用於推薦系統,以及自然語言處理等領域。是很多機器學習演算法的基石。奇異值分解在資料降維中有較多的應用,這裡把它的原...

機器學習篇 SVD從初始到應用

svd一般應用場景 推薦系統,影象壓縮。1 直觀感受。svd其實就是將矩陣分界,直觀感受如圖。就是將a矩陣分界成u,s,v三個矩陣相乘。一般推薦系統中用的多。s是對角陣,裡面的特徵值是從大到小排列的。2 前述知識。乙個矩陣乘以乙個向量結果還是乙個向量,並且等於原始向量的 倍,相當於對原始向量進行乙個...