用於推薦系統的SVD演算法python實現

2021-07-23 14:57:07 字數 1612 閱讀 8405

svd演算法python實現

之前看到一篇實現svd演算法的blog,但是實現方法沒有用到矩陣。為了更直觀簡便高效的實現svd演算法,在這裡基於numpy重新寫了一遍。

這裡用到的演算法是優化下面這個目標函式:

**如下:

引數: mat - 輸入矩陣, feature - latent factor數量

def svd(mat, feature, steps=500, gama=0.02, lamda=0.3):

slowrate = 0.99

prermse = 1000000000.0

nowrmse = 0.0

user_feature = numpy.matrix(numpy.random.rand(mat.shape[0], feature))

item_feature = numpy.matrix(numpy.random.rand(mat.shape[1], feature))

for step in range(steps):

rmse = 0.0

n = 0

for u in range(mat.shape[0]):

for i in range(mat.shape[1]):

if not numpy.isnan(mat[u,i]):

pui = float(numpy.dot(user_feature[u,:], item_feature[i,:].t))

eui = mat[u,i] - pui

rmse += pow(eui, 2)

n += 1

for k in range(feature):

user_feature[u,k] += gama*(eui*item_feature[i,k] - lamda*user_feature[u,k])

item_feature[i,k] += gama*(eui*user_feature[u,k] - lamda*item_feature[i,k]) # 原blog這裡有錯誤

nowrmse = sqrt(rmse * 1.0 / n)

print 'step: %d rmse: %s' % ((step+1), nowrmse)

if (nowrmse < prermse):

prermse = nowrmse

else:

break # 這個退出條件其實還有點問題

gama *= slowrate

step += 1

return user_feature, item_feature

為什麼不能用scipy和scikit裡面的svd實現python在scipy和scikit裡面都有不同的svd實現方法,但是這些方法有乙個共同的問題,就是沒有考慮缺失值(missing value)的問題,即輸入的原始矩陣不能有nan值。這時就需要去填入這些缺失值,不論是填0還是填均值,都會影響結果的準確性。

推薦系統相關演算法 SVD

假如要 zero君對一部電影m的評分,而手上只有zero君對若幹部電影的評分和風炎君對若幹部電影的評分 包含m的評分 那麼能 出zero君對m的評分嗎?答案顯然是能。最簡單的方法就是直接將 分定為平均分。不過這時的準確度就難說了。本文將介紹一種比這個最簡單的方法要準上許多,並且也不算複雜的演算法。s...

推薦 SVD演算法

矩陣作用於向量的意義是 對向量進行旋轉和縮放,更加抽象的說,是將這個向量從一組正交基空間旋轉到另一組正交基空間,並縮放 對於實對稱矩陣,存在 m v i lambda v i即存在一組正交基,m的作用只是拉伸 對應特徵分解 但是對於更加一般的矩陣m m v i lambda u i即不同組正交基之間...

SVD在推薦系統中的應用

其實說參考也不準確,準確地說應該是半翻譯半學習筆記。仔細整理一遍,感覺還是收穫很大的。任意乙個m n的矩陣a m行 n列,m n 可以被寫成三個矩陣的乘機 1.u m行m列的列正交矩陣 2.s m n的對角線矩陣,矩陣元素非負 3.v n n的正交矩陣的倒置 即a u s v 注意矩陣v需要倒置 直...