任何乙個矩陣都可以分解為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 前述知識。乙個矩陣乘以乙個向量結果還是乙個向量,並且等於原始向量的 倍,相當於對原始向量進行乙個...