基於內容的推薦系統lfm演算法實現,對於不同的使用者選擇了不同的商品,做了乙個笛卡爾集,然後對於每個使用者對應的那一行或者那一列肯定是稀疏的,所以我們就根據這個矩陣做乙個矩陣的奇異分解,提取出其中的k個特徵,然後再重新矩陣相乘回去,得到每個使用者對於每個商品的乙個評價。**如下:
#%% md
## lfm梯度下降演算法實現
#%%import numpy as np
import pandas as pd
#%% md
### 1、資料準備
#%%# 評分矩陣
r = np.array([[
4,0,
2,1,
2],[
5,2,
0,2,
1],[
2,1,
2,0,
3],[
3,1,
1,2,
0],[
4,5,
2,0,
2],[
4,0,
2,0,
1],]
)len
(r[0])
#%%"""
@輸入:
r:m*n的評分矩陣
k:隱含特徵向量的個數
max_steps:最大迭代次數
alpha:學習率,步長
@輸出:
分解之後的p,q
p:初始化使用者特徵矩陣m*k
q:初始化物理特徵矩陣n*k
"""k =
5max_iter =
10000
alpha =
0.0002
lamda =
0.002
#核心演算法
deflfm_grad_desc
(r,k=
2,max_iter=
1000
,alpha=
0.0001
,lamda=
0.002):
# 基本緯度引數定義
m =len(r)
n =len(r[0]
)# p,q初始值生成
p = np.random.rand(m,k)
q = np.random.rand(n,k)
q = q.t
# 開始迭代
for step in
range
(max_iter)
:# 對所有的使用者u、物品i做遍歷,對應的特徵向量pu、qi梯度下降
for u in
range
(m):
for i in
range
(n):
# 對於每乙個大於0的評分,求出**評分誤差
if r[u]
[i]>0:
eui = np.dot(p[u,:]
,q[:
,i])
- r[u]
[i]# 代入公式,按照梯度下降演算法更新當前的pu、qi
for k in
range
(k):
p[u]
[k]-= alpha*(2
*eui*q[k]
[i]+
2*lamda*p[u]
[k])
q[k]
[i]-= alpha*(2
*eui*p[u]
[k]+
2*lamda*q[k]
[i])
# u、i 遍歷完成,所有的特徵向量更新完成,可以得到p、q的矩陣,可以計算**評分矩陣
predictr = np.dot(p,q)
# 計算當前損失函式
cost =
0for u in
range
(m):
for i in
range
(n):
if r[u]
[i]>0:
cost +=
(np.dot(p[u,:]
,q[:
,i])
- r[u]
[i])**2
# 加上正則化項
for k in
range
(k):
cost += lamda*
(p[u]
[k]**
2+ q[k]
[i]**2)
if cost<
0.0001
:break
if step%
500==0:
print
("step="
+str
(step)
+"輪,cost="
+str
(cost)
)return p,q.t,cost
#%% md
### 3、測試
#%%p,q,cost = lfm_grad_desc(r,k,max_iter,alpha,lamda)
print
("-----------結果----------"
)print
(p)print
(q)print
(cost)
predict_r = p.dot(q.t)
print
(r)predict_r
輸出結果:
我們可以看到對於每個使用者沒有評分的物品,或者商品,或者電影都做出了一定的**,我們就可以選擇最大的幾個商品對使用者進行推薦。
LFM梯度下降演算法實現
lfm梯度下降演算法實現 0.引入依賴 import numpy as np import pandas as pd 1.資料準備 評分矩陣r r np.array 4,0,2,0,1 0,2,3,0,0 1,0,2,4,0 5,0,0,3,1 0,0,1,5,1 0,3,2,4,1 print r...
梯度下降演算法實現
梯度下降演算法的原理及實現。一.梯度下降的演算法方程式為 二.方程式詳解 引數 1.表示網路中需要訓練的引數。2.表示學習率。表示影象中一點的斜率。含義 假設乙個二次函式,初始位置在曲線上藍色點,如果學習率 設定過大,則 的每一次更新幅值將會很大。如此,若藍點已非常接近最低點,則下一次引數更新的更新...
梯度下降演算法 梯度下降演算法為何叫梯度下降?
首先,我們知道乙個演算法的名字可以很好地去解釋乙個演算法,那麼梯度下降演算法是什麼呢?很明顯的,就是用梯度這個工具來解決問題的一種演算法。解決什麼問題呢?如何在乙個函式曲面的某一點,找到乙個函式值變化最大的方向。比如 我們站在山上的某一點,我們想要以最快的速度上山,但是我們的步子大小是一定的,那麼最...