推薦系統_七月算法4月機器學習班第9次課程筆記

2016/5/21 星期六 21:38
 
  desc
關於矩陣分解
LSA pLSA  LDA 本質都是矩陣分解
1. LSA 的奇異值分解 A = S·Σ·D,分解獲得的是三個矩陣,操做一下,就是
S'  = S·Σ
D' = Σ·D
此時 S' · D' 仍舊可以獲得 近似原始矩陣的值
# 或者這裏的 Σ 所有取 Σ' 即 :Σ' = sqrt( Σ )
這樣的話,乘完畢之後還能獲得原始的矩陣 A
這個 trick 將 分解爲三個矩陣 轉換爲 分解爲兩個矩陣
 
2. pLSA 經過引入 topic A = B·C 兩個矩陣
 
3. MF 矩陣分解的方法,與 pLSA 的問題相同,可是不是用 EM算法,而是數值解法,去逼近
   直接獲得 A = P·Q
 
4. 而你想要的 是 GloVec 的方法,即 input 矩陣是 一個方陣,是對稱方陣
而後 但願 get 一個 矩陣(list of vector)
這些 vector 兩兩相乘 能夠逼近 原始對稱方陣
其實 這部分的代碼 與 MF 的代碼類似
 
summary 矩陣分解的方法【觀點】
· EM 算法 的方法
· 數值逼近的方法 cost
· LDA 吉布斯採樣
· SVD 分解
矩陣分解的 tool
libSVD
libMF
libFM
svd feature
均可以作矩陣分解
 
冷啓動的概念:
1. 冷啓動就是沒有用戶的歷史行爲數據,如何給用戶作推薦遇到問題
   新加入用戶或商品由於沒有歷史數據因此很難作推薦
2. 只要是推薦系統都會遇到 這個問題,no matter CF or content based
推薦的本質與假設
不要本末倒置
推薦的根本是:知足用戶的需求,是挖掘用戶的需求再推,這是核心
如今的幾個假設:(不必定真)
· 類似,買過A,可能還會買與A類似的A',基於此,纔會找類似
· 搭配 是用戶需求的補充
 
淘寶如今是,看過的就會推
其實這就是:類似法 和 搭配法 方法的PK
通過內部實驗,發現:雖然搭配推薦看似好,可是對於轉化率來講,不如 傳統的類似推薦
因此如今的淘寶仍是 以基於類似的方法爲主
搭配推薦的思路
1. 基於模型的推薦:learning2rank
    使用待搭配item 的特徵向量的融合(拼接,相加,笛卡爾積),而後輸入 排序模型,獲得分值
2. 能夠用是關聯規則,基於規則
 
阿里面試的問題,如今纔有觀點啊
· 推薦中類似度的計算方法
· 協同過濾推薦的基本思路
· 機器學習的通常流程
而這三個 你都沒有 回答上來 【觀點】
看待RNN 的角度
· 二叉樹形狀的 網絡結構
· 各個不一樣的門,其實就是:多個 feature map【觀點】
推薦系統與產品
1. 增長推薦理由,會很大提升 賣出率
eg:
你的 5 個朋友有4個買了這個書
我知道你最近買了A,建議你買B,這個是A 的補
 
2. 一個app 着重作這兩個點,推薦系統中的 新穎度(他們不知道的) 和 驚喜度(不類似但滿意) 這兩個 指標
若是這兩個作得好,那麼這個 app 會很快火起來
工業上的推薦系統
都是 多個 方法的 merge
word2vec
MF
CF
learning2rank
而不是單一的 一個模型的 綜合
由於在意穩定性
推薦中的評價指標
RMSE 中文是均方根偏差
root mean square error
利用word2vec
1. 使用 用戶的 行爲序列,即 次次點擊的 商品item 序列
而後 對item 進行 word2vec 嘗試,而後將 每一個商品 vector 化
從而 基於第一類假設,能夠有 類似的商品 來進行跑排序,以進行推薦
2. word2vec 自己已經體現了 序列的學習,即 next word
 
優勢:
 解決的問題是 , CF找回不夠,由於:
使用協同過濾的時候 每一個商品id,其實就是 太離散了,因此用 低維度向量表示每一個商品,那麼 至關於降維
推薦系統選取的各個feature 的評價
與搜索引擎的關係
對搜索引擎的 兩個角度的改善
1. QA,不返回頁面,而是具體答案
2. 推薦系統,直接給出猜你想看的
 
因此 QA,推薦系統,CTR ,都依賴於 搜索引擎的原理
提升覆蓋率
就是 防止馬太效應
即 越熱越推,越推越熱 
提升多樣性
就是:給用戶更多的選擇
推薦100件襯衫也是隻能買一件 
對於打分的預處理須要注意:
每行去均值,再去類似度比較
去均值其實就是 由於有人 偏向高分低分,是爲了消除用戶的【評分尺度】 
item CF > user CF
工業界:通常用於 item Collaborative filtering 
由於:
1. 用戶量> 商品量:好比 電影一共就幾萬部
2. 穩定度高:即兩本書的類似度持久
兩本書的類似度 今年 和 去年一半同樣
而 user 的類似度會變化
商品關聯
兩個角度
1. 在電商領域有不少 同款但不徹底同樣的商品,會當成兩個item
因此須要提早 作好關聯 
 其實就是下降稀疏性,合併類似的
2. 若是 A、B 用戶不能計算類似度,可是 AC 能夠,BC 能夠,那麼就能夠間接獲得 AB 的類似度
關於冷啓動問題 的解決 
1.對於 新用戶
   用戶註冊的時候就要提供信息,或者使用互動的方式進行 用戶信息的獲取
  社交數據 或者 標籤數據
2. 對於新商品
   根據商品的屬性,能夠基於規則 給出與 其它商品的 類似度,而後再基於 item based CF 推薦
推薦系統的觀點
input 一個 不滿的矩陣
output 缺失的值
 
由於是矩陣,因此 纔有不少與矩陣相關的操做
基於矩陣分解必需要正則化
由於要防止過擬合,不然 擬合出來 仍是 0
 
打分系統若是增長偏置的化,可能效果會好
關於矩陣分解,由於有打分體系,因此特別指出:要加上偏置
對於 每個 擬合的值
多加了 μ總體平均,和  user 與 item 的各自偏置
 
wordvec經驗 通常上 300~ 500 維度纔是好的
矩陣擬合的代碼
#簡單的張量分解進行打分和推薦
#要用到numpy模塊
import numpy
 
#手寫矩陣分解
#如今有不少很方便對高維矩陣作分解的package,好比libmf, svdfeature等
def matrix_factorization(R, P, Q, K, steps=5000, alpha=0.0002, beta=0.02):
    Q = Q.T
    for step in xrange(steps):
        for i in xrange(len(R)):
            for j in xrange(len(R[i])):
                if R[i][j] > 0:
                    eij = R[i][j] - numpy.dot(P[i,:],Q[:,j])
                    for k in xrange(K):
                        P[i][k] = P[i][k] + alpha * (2 * eij * Q[k][j] - beta * P[i][k])
                        Q[k][j] = Q[k][j] + alpha * (2 * eij * P[i][k] - beta * Q[k][j])
        eR = numpy.dot(P,Q)
        e = 0
        for i in xrange(len(R)):
            for j in xrange(len(R[i])):
                if R[i][j] > 0:
                    e = e + pow(R[i][j] - numpy.dot(P[i,:],Q[:,j]), 2)
                    for k in xrange(K):
                        e = e + (beta/2) * (pow(P[i][k],2) + pow(Q[k][j],2))
        if e < 0.001:
            break
    return P, Q.T
相關文章
相關標籤/搜索