1 最近在看線性代數的相關知識,昨晚看到矩陣qr分解,然後後面又介紹了乙個lfm的分解,說是矩陣能分解出k隱含維資料,看了一眼後面用梯度下降推的公式,感覺好複雜,就沒有再往下面看。專業術語解釋:2.坐在幾個搞推薦的大神旁邊,整天聽到「轉化率」,「反饋」什麼的,因為本身不是搞這個方向的,所以聽起來挺神奇。
3.剛好在csdn上看到一篇講lfm隱語義應用在推薦系統上的文章,想到能複習一下線代上將的內容又能了解一下推薦系統,就做了下面的研究。推到了公式,但是演算法還沒有具體實現,後面會附上參考偽**
itemcf:給使用者推薦的商品是根據使用者之前擁有的商品決定的
興趣分類:
3.1. 傳統分類不適合複雜場景
3.2. lfm(隱含語義分析)接下來要講的內容
因為之前做的專案,有幸了解到nlp
領域隱含主題模型lda
,模型認為一片文章講道理是由多個主題構成的,而多個主題下面又包含關於這個主題的詞語,即:doc-topic-word。利用該模型能夠挖掘到文章之間隱含的主題關係,根據隱含主題的關聯關係可以確定出文章之間的關係。和lda
相關的叫做隱含語義分析技術。隱含語義分析技術採用基於使用者行為統計的自動聚類,挖掘出a-latent-b的關係。
在豆瓣圖書推薦欄目,根據使用者瀏覽的,購買的,收藏的關於圖書的行為記錄資料,要推薦給使用者合適的圖書。怎麼實現圖書推薦呢?這裡主要根據lfm原理進行解釋。假設有關於使用者喜愛書籍的**如下所示:lfm矩陣分解| |——-|——–|——–|——-|
|user1: |偵探**|科普 |計算機 |
| user2:| 數學 |機器學習| |
| … | … | … | … |
根據線性代數中的知識可知:將乙個 m∗
n 的矩陣 am
∗n可以分解為具有
k 個隱變數的 um
∗k∗v
k∗m的矩陣。這裡的維數
k 就是隱含變數的個數,也就是latent factor
。 am
∗n=u
m∗k∗
vk∗m
現假定有3個使用者user1,user2,user3。他們各自分別對標記為item1,item2,item3,item4的圖書(商品)的喜愛程度可形成乙個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 矩陣中的某個估計量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檢視當前目錄下的檔案及所有的子目錄...