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需要倒置 直...