# 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.表示學習率。表示影象中一點的斜率。含義 假設乙個二次函式,初始位置在曲線上藍色點,如果學習率 設定過大,則 的每一次更新幅值將會很大。如此,若藍點已非常接近最低點,則下一次引數更新的更新...
梯度下降演算法 梯度下降演算法為何叫梯度下降?
首先,我們知道乙個演算法的名字可以很好地去解釋乙個演算法,那麼梯度下降演算法是什麼呢?很明顯的,就是用梯度這個工具來解決問題的一種演算法。解決什麼問題呢?如何在乙個函式曲面的某一點,找到乙個函式值變化最大的方向。比如 我們站在山上的某一點,我們想要以最快的速度上山,但是我們的步子大小是一定的,那麼最...