LFM梯度下降演算法實現

2021-10-23 06:35:30 字數 2399 閱讀 1180

# 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.shape)

# print(r.shape[0])

# print(len(r))

# print(len(r[0]))

# print(r.shape[1])

# 2.演算法實現

"""輸入引數:

r;n*n 的評分矩陣

k:隱特徵向量個數

steps:最大迭代次數

alpha:步長

landa:正則化係數

輸出:分解之後的p、q

p:初始化使用者特徵矩陣m*k

q:初始化物品特徵矩陣n*k

"""# 給定超引數

k =5

max_iter =

5000

alpha =

0.0001

landa =

0.002

# 核心演算法

deflfm_grad_desc

(r, k, max_iter, alpha, landa)

:# 基本維度引數定義

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]= p[u]

[k]- alpha *(2

* eui * q[k]

[i]+

2* landa * p[u]

[k])

q[k]

[i]= q[k]

[i]- alpha *(2

* eui * p[u]

[k]+

2* landa * q[k]

[i])

# u,i遍歷完成,所有特徵向量更新完成,可以得到p、q,可以計算**評分矩陣

predr = 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 += landa *

(p[u]

[k]**

2+ q[k]

[i]**2)

if cost <

0.0001

:break

return p, q.t, cost

# 3.測試

p, q, cost = lfm_grad_desc(r, k, max_iter, alpha, landa)

print

(p)print

(q)print

(cost)

print

(r)predr = p.dot(q.t)

print

(predr)

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

基於內容的推薦系統lfm演算法實現,對於不同的使用者選擇了不同的商品,做了乙個笛卡爾集,然後對於每個使用者對應的那一行或者那一列肯定是稀疏的,所以我們就根據這個矩陣做乙個矩陣的奇異分解,提取出其中的k個特徵,然後再重新矩陣相乘回去,得到每個使用者對於每個商品的乙個評價。如下 md lfm梯度下降演算...

梯度下降演算法實現

梯度下降演算法的原理及實現。一.梯度下降的演算法方程式為 二.方程式詳解 引數 1.表示網路中需要訓練的引數。2.表示學習率。表示影象中一點的斜率。含義 假設乙個二次函式,初始位置在曲線上藍色點,如果學習率 設定過大,則 的每一次更新幅值將會很大。如此,若藍點已非常接近最低點,則下一次引數更新的更新...

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

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