隱性資料集上應用LFM解決Top N推薦問題

2021-07-29 22:10:49 字數 3921 閱讀 1823

1 最近在看線性代數的相關知識,昨晚看到矩陣qr分解,然後後面又介紹了乙個lfm的分解,說是矩陣能分解出k隱含維資料,看了一眼後面用梯度下降推的公式,感覺好複雜,就沒有再往下面看。

2.坐在幾個搞推薦的大神旁邊,整天聽到「轉化率」,「反饋」什麼的,因為本身不是搞這個方向的,所以聽起來挺神奇。

3.剛好在csdn上看到一篇講lfm隱語義應用在推薦系統上的文章,想到能複習一下線代上將的內容又能了解一下推薦系統,就做了下面的研究。推到了公式,但是演算法還沒有具體實現,後面會附上參考偽**

專業術語解釋:

itemcf:給使用者推薦的商品是根據使用者之前擁有的商品決定的

興趣分類:

3.1. 傳統分類不適合複雜場景

3.2. lfm(隱含語義分析)接下來要講的內容

因為之前做的專案,有幸了解到nlp領域隱含主題模型lda,模型認為一片文章講道理是由多個主題構成的,而多個主題下面又包含關於這個主題的詞語,即:doc-topic-word。利用該模型能夠挖掘到文章之間隱含的主題關係,根據隱含主題的關聯關係可以確定出文章之間的關係。和lda相關的叫做隱含語義分析技術。隱含語義分析技術採用基於使用者行為統計的自動聚類,挖掘出a-latent-b的關係。

在豆瓣圖書推薦欄目,根據使用者瀏覽的,購買的,收藏的關於圖書的行為記錄資料,要推薦給使用者合適的圖書。怎麼實現圖書推薦呢?這裡主要根據lfm原理進行解釋。假設有關於使用者喜愛書籍的**如下所示:

| |——-|——–|——–|——-|

|user1: |偵探**|科普 |計算機 |

| user2:| 數學 |機器學習| |

| … | … | … | … |

lfm矩陣分解

根據線性代數中的知識可知:將乙個 m∗

n 的矩陣 am

∗n可以分解為具有

k 個隱變數的 um

∗k∗v

k∗m的矩陣。這裡的維數

k 就是隱含變數的個數,也就是latent factor。 am

∗n=u

m∗k∗

vk∗m

現假定有3個使用者user1user2user3。他們各自分別對標記為item1item2item3item4的圖書(商品)的喜愛程度可形成乙個3∗

4 的user-item興趣矩陣r3

根據前面講的lfm關於矩陣分解的知識,我們可以將這個3∗

4 的user-item矩陣r3

∗4分解為含有3個隱含變數的p3

∗3∗q

3∗4 的矩陣,其中p3

∗3表示使用者對隱含類別的興趣矩陣user-latent,而q3

∗4表示圖書(商品)在隱含類別中所佔權重的矩陣。即: r3

故,對使用者商品user-item矩陣

r 中的每乙個ru

,i(使用者u對商品i的喜愛程度),可以通過矩陣分解式ru

,i=p

u∗qi

=∑k=

1kpu

,k∗q

k∗i

進行表示。

讓我們梳理一下邏輯

現要依據p,

q 引數矩陣來估計

r 矩陣中的某個估計量

u,i,總體思路採用損失函式最小化來求取引數矩陣p,

q 。這裡對

r 矩陣中樣本的選取要注意:由於採用的是隱性反饋,只有正樣本,沒有負樣本,所以要依據一定的原則選取合適數量的負樣本。在樣本選定後進行引數估計。

故,對k

個樣本集中的樣本(u

,i) 以及對應的標記ru

,i,有下面的損失函式表示: c=

∑(u,

i)∈k

(ru,

i−r¯

u,i)

2=∑(

u,i)

∈k(r

u,i−

∑k=1

kpu,

k∗qk

∗i)2

+λ∥p

u∥2+

λ∥qi

∥2其中:

1 第乙個等號右邊的表示式總體上表示了標記實際值ru

,i與估計值r¯

u,i 之間差值平方,我們的目標就是將這個損失函式最小化,求得在最小化值下的p,

q 引數矩陣。

2 後面帶

λ 的兩項為正則化項,是用來防止過擬合的。這裡解釋一下兩個豎線表示2範數

3 這裡損失函式最小化可以使用梯度下降法求得對應pu

,k和qi

,k的偏導數,利用乙個

α 學習速率每次迭代pu

,k,qi

,k的值,直至達到閾值。

我們對上面的損失函式

c 分別對pu

,k和q

i,k 求偏導數,得:

通過確定學習速率

λ ,來對pu

,k,qi

,k進行優化:

由此可以看出模型需要確定的幾個引數:

1. 隱變數的個數

f

2. 梯度下降法迭代的次數:

n3. 梯度下降學習速率:

α

4. 正則化項對應的引數:

λ

最後貼上python版本的偽**:

def

lfm(user_items, f, n, alpha, lambda):

[p, q] = initmodel(user_items, f)

for step in range(0, n):

for user, items in user_item.iterms():

samples = randselectnegativesamples(items)

for item, rui in samples.items():

eui = eui - predict(user, item)

for f in range(0, f):

p[user][f] += alpha * (eui * q[f][item] - lambda * p[user][f])

q[f][item] += alpha * (eui * p[user][f] - lambda * q[f][item])

alpha *= 0.9

記憶體資料集產生的隱性成本

當我們要對資料做一些非常規的複雜運算時,通常要將資料裝入記憶體。現在也有不少程式語言提供了記憶體資料集物件及基本的運算方法,可以較方便地實現這類運算。不過,如果對記憶體資料集的工作原理了解不夠,就可能寫出低效的 我們看資料集的產生。比如要生成乙個 100 行 2 列的資料集,第一列 x 為序號,第二...

Google Play上推廣應用相關資料集

google play上推廣應用相關資料集 1.fiksu分享開發者在google play上的營銷技巧 2.開發者應更重視安卓市場的4大理由及提公升推廣效果的幾個建議 3.關鍵字描述參考qq 1 列出同類應用,有利於關聯搜尋 同類應用 2 最後新增關鍵字 3.兩周營收100萬 go桌面在googl...

在colab上使用自己的資料集

1 colab 可以非常方便地將ipynb儲存到github上!有趣。2 colab 從github上載入資料集,666,簡直不能更方便啊。使用 git clone 即可將github上的檔案轉殖到colab的當前目錄下,然後就可以愉快地使用自己的資料集了。ls r檢視當前目錄下的檔案及所有的子目錄...