LFM梯度下降演算法實現 推薦系統

2021-10-07 22:35:15 字數 2866 閱讀 5564

基於內容的推薦系統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.表示學習率。表示影象中一點的斜率。含義 假設乙個二次函式,初始位置在曲線上藍色點,如果學習率 設定過大,則 的每一次更新幅值將會很大。如此,若藍點已非常接近最低點,則下一次引數更新的更新...

梯度下降演算法 梯度下降演算法為何叫梯度下降?

首先,我們知道乙個演算法的名字可以很好地去解釋乙個演算法,那麼梯度下降演算法是什麼呢?很明顯的,就是用梯度這個工具來解決問題的一種演算法。解決什麼問題呢?如何在乙個函式曲面的某一點,找到乙個函式值變化最大的方向。比如 我們站在山上的某一點,我們想要以最快的速度上山,但是我們的步子大小是一定的,那麼最...