從理論到實踐,一文詳解 AI 推薦系統的三大算法

2021-01-11 雷鋒網

雷鋒網(公眾號:雷鋒網)按:本文作者孫愛華,原文載於作者個人博客,雷鋒網已獲授權。

  介紹

背景

隨著網際網路行業的井噴式發展,獲取信息的方式越來越多,人們從主動獲取信息逐漸變成了被動接受信息,信息量也在以幾何倍數式爆發增長。舉一個例子,PC時代用google reader,常常有上千條未讀博客更新;如今的微信公眾號,也有大量的紅點未閱讀。垃圾信息越來越多,導致用戶獲取有價值信息的成本大大增加。為了解決這個問題,我個人就採取了比較極端的做法:直接忽略所有推送消息的入口。但在很多時候,有效信息的獲取速度極其重要。

由於信息的爆炸式增長,對信息獲取的有效性,針對性的需求也就自然出現了。推薦系統應運而生。

推薦形式

電商網站常見的推薦形式包括三種: 

- 針對用戶的瀏覽、搜索等行為所做的相關推薦; 

- 根據購物車或物品收藏所做的相似物品推薦; 

- 根據歷史會員購買行為記錄,利用推薦機製做EDM或會員營銷。

前面2種表現形式是大家可以在網站上看到,而第3種表現形式只有體驗後才能知曉,一封郵件,一條簡訊,一條站內消息都是它的表現方式。

下面將對亞馬遜中國的前兩種表現形式進行簡單說明:

● 對於非登錄用戶,亞馬遜中國在網站首頁和類目欄,會根據各個類目暢銷品的情況做響應的推薦,其主要表現形式為排行榜。搜索瀏覽頁面以及具體的產品頁面的推薦形式則有關聯推薦(「經常一起購買的商品」)和基於人群偏好的相似性推薦(「購買此物品的顧客也購買了」、「看過此商品的顧客購買的其他商品」)。

● 對於登錄用戶,亞馬遜中國則給出了完全不同的推薦方式,網站會根據用戶的歷史瀏覽記錄在登入界面首屏展現出一個今日推薦的欄目,緊接著是最近一次瀏覽商品的記錄和根據該物品所給的產品推薦(「根據瀏覽推薦給我的商品」、「瀏覽XX產品的用戶會買XX的概率」),值得注意的是,每個頁面最下方網站都會根據用戶的瀏覽行為做響應推薦,如果沒有瀏覽記錄則會推薦「系統暢銷品」(13頁,50款商品)。

  推薦系統的架構

推薦系統常見的架構體系如下: 

從架構圖可以看出,一個簡單的推薦系統通常包括三個部分

1. 數據來源 

該部分至少包括三部分內容:

● 物品信息 

● 用戶信息,例如用戶愛好,瀏覽記錄,購買記錄等 

● 用戶的物品的偏好,例如 商品評分,商品評論等

2. 算法處理:常見的算法類型主要包括

● 人口統計學推薦:主要是根據用戶資料信息,發現和物品的相關程度

● 物品內容推薦:根據用戶的偏好,推薦相似的物品給用戶

● 協同過濾推薦:根據用戶對物品的偏好,發現物品或是用戶的相關性,然後基於相關性進行推薦,主要包括:1:基於用戶的推薦 2:基於物品的推薦

● SVD(奇異值分解):相當於協同過濾的相似度計算模型,主要基於用戶和物品信息構成的矩陣,矩陣中的值是用戶對商品的評分,這個矩陣通常是一個比較稀疏的矩陣,通過SVD算法可以得到用戶與物品的特徵向量PU(用戶的偏好),PI(物品的偏好)通過PU*PI得到用戶對物品的評分預測

3. 結果展示:對推薦結果進行展示

  主要算法以及介紹

本章節主要介紹 協同過濾,SVD, K-Means 三種算法

協同過濾模型

模型介紹

協同過濾Collaborative Filtering (CF)算法是推薦算法的一個大分支,基本思想是推薦相似的物品,或者推薦相似用戶(隱式或者顯式)評分過的物品。CF方法主要可以分為兩類:基於鄰域和基於隱語義。

1. 基於鄰域的方法利用「兩個用戶共同評分過的物品」(user-based)或者「共同評價兩個物品的用戶」(item-based)分別計算用戶間的相似度和物品間的相似度。而相似度的計算有餘弦相似度,皮爾遜相似度和一種被稱為「Conditional Probability-Based「的Similarity。皮爾遜係數與餘弦相似度的不同在於,皮爾遜係數還能捕捉負關係,第三個方法的弊端在於由於每個物品(人)鄰域的大小不同,流行物品或評分多的用戶會引起問題。因此,實際中一般採用帶權的皮爾遜相似度(P. 2) 。但基於鄰域方法的缺點是:由於實際用戶評分的數據是十分稀疏,用戶之間可能根本沒有相同的評論;而且用啟發式的方法很難考慮全面用戶和物品之間的所有關係。

2. 基於隱語義的方法則不依賴於共同評分。其基本思想是將用戶和物品分別映射到某種真實含義未知的feature向量。用戶feature代表用戶對不同類別電影的喜好程度(如:動作片5,驚悚片5),物品feature代表電影中大致屬於哪類電影(如:愛情片3,喜劇片5)。然後通過兩個feature向量的內積來判斷用戶對一個物品的喜好程度。雖然這個方法不要求共同評分,但推薦系統還是面臨很大的數據稀疏問題。

算法邏輯

作為CF的兩大基本分類,鄰域的相關算法比較簡單不再介紹,本文主要介紹SVD,不過在介紹SVD之前,先對K-Means做個簡單的說明

K-means

算法介紹

推薦系統大多數都是基於海量的數據進行處理和計算,要在海量數據的基礎上進行協同過濾的相關處理,運行效率會很低,為了解決這個問題通常是先使用K-means對數據進行聚類操作,說白了,就是按照數據的屬性通過K-Means算法把數據先分成幾大類,然後再在每個大類中通過鄰域或是隱語義算法進行推薦

算法邏輯

網上有很多關於K-Means算法的描述,個人覺得大多數都很拗口,不容易理解,下面這個圖中舉例的方式,感覺比較容易理解 

在Python的sklearn庫中已經實現了該算法,如果有興趣也可以實現一個自己的K-Means算法。

K-Means算法在實際運行的過程中存在以下幾個問題 

1. 最大問題是:K值對最後的結果影響較大,但是該值是由用戶確定的,且不同的數據集,該值沒有可借鑑性 

2. 對離群數據點敏感,就算少量的離群數據也能對結果造成較大的影響 

3. 算法初始化中心點的選擇好壞,會直接影響到最終程序的效率

為了解決上面的問題,出現了二分KMeans算法,有興趣的讀者,可以自行尋找相關的資料 ,本文不做詳細介紹

SVD

算法介紹

特徵值分解是一個提取矩陣特徵很不錯的方法,但是它只是對方陣而言的,在現實的世界中,我們看到的大部分矩陣都不是方陣,比如說有N個學生,每個學生有M科成績,這樣形成的一個N*M的矩陣就不可能是方陣,我們怎樣才能描述這樣普通的矩陣呢的重要特徵呢?奇異值分解可以用來幹這個事情,奇異值分解是一個能適用於任意的矩陣的一種分解的方法。

算法邏輯

算法公式: 

公式說明:假設A是一個N * M的矩陣,那麼得到的U是一個N * N的方陣(裡面的向量是正交的,U裡面的向量稱為左奇異向量),Σ是一個N * M的矩陣(除了對角線的元素都是0,對角線上的元素稱為奇異值),V』(V的轉置)是一個N * N的矩陣,裡面的向量也是正交的,V裡面的向量稱為右奇異向量),從圖片來反映幾個相乘的矩陣的大小可得下面的圖片 

那麼奇異值和特徵值是怎麼對應起來的呢?首先,我們將一個矩陣A的轉置 *A,將會得到一個方陣,我們用這個方陣求特徵值可以得到: 

這裡得到的v,就是我們上面的右奇異向量。此外我們還可以得到:

這裡的σ就是上面說的奇異值,u就是上面說的左奇異向量。奇異值σ跟特徵值類似,在矩陣Σ中也是從大到小排列,而且σ的減少特別的快,在很多情況下,前10%甚至1%的奇異值的和就佔了全部的奇異值之和的99%以上了。也就是說,我們也可以用前r大的奇異值來近似描述矩陣,這裡定義一下部分奇異值分解 

r是一個遠小於m、n的數,這樣矩陣的乘法看起來像是下面的樣子

邊的三個矩陣相乘的結果將會是一個接近於A的矩陣,在這兒,r越接近於n,則相乘的結果越接近於A。而這三個矩陣的面積之和(在存儲觀點來說,矩陣面積 越小,存儲量就越小)要遠遠小於原始的矩陣A,我們如果想要壓縮空間來表示原矩陣A,我們存下這裡的三個矩陣:U、Σ、V就好了。

在Numpy的linalg中,已經對SVD進行了實現,可直接進行使用

  代碼樣例

公共函數

該部分主要是用來加載樣本數據的代碼

def load_test_data():

matrix=[[0.238,0,0.1905,0.1905,0.1905,0.1905],[0,0.177,0,0.294,0.235,0.294],[0.2,0.16,0.12,0.12,0.2,0.2],[0.2,0.16,0.12,0.12,0.2,0.1]]

return matrix

使用鄰域法進行推薦

# 夾角餘弦距離公式

def cosdist(vector1,vector2):

    return dot(vector1,vector2)/(linalg.norm(vector1)*linalg.norm(vector2))


# kNN 分類器

# 測試集: testdata;訓練集: trainSet;類別標籤: listClasses; k:k 個鄰居數

def classify(testdata, trainSet, listClasses, k):

    dataSetSize = trainSet.shape[0] # 返回樣本集的行數

    distances = array(zeros(dataSetSize))

    for indx in xrange(dataSetSize): # 計算測試集與訓練集之間的距離:夾角餘弦

        distances[indx] = cosdist(testdata,trainSet[indx])

        # 根據生成的夾角餘弦按從大到小排序,結果為索引號

        sortedDistIndicies = argsort(-distances)

    classCount={}

    for i in range(k): # 獲取角度最小的前 k 項作為參考項

        # 按排序順序返回樣本集對應的類別標籤

        voteIlabel = listClasses[sortedDistIndicies[i]]

        # 為字典 classCount 賦值,相同 key,其 value 加 1

        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1

    # 對分類字典 classCount 按 value 重新排序

    # sorted(data.iteritems(), key=operator.itemgetter(1), reverse=True)

    # 該句是按字典值排序的固定用法

    # classCount.iteritems():字典迭代器函數

    # key:排序參數; operator.itemgetter(1):多級排序

    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)

    return sortedClassCount[0][0] # 返回序最高的一項


if __name__ == '__main__':

    # 使用領域算法進行推薦

    recommand_by_distance()

使用SVD進行推薦

def comsSim(vecA,vecB):

    eps=1.0e-6

    a=vecA[0]

    b=vecB[0]

    return dot(a,b)/((np.linalg.norm(a)*np.linalg.norm(b))+eps)


def recommand_by_svd():

    r=1

    dataset=np.mat(load_test_data())

    data_point=np.mat([[0.2174,0.2174,0.1304,0,0.2174,0.2174]])

    m,n=np.shape(dataset)

    limit=min(m,n)

    if r>limit:r=limit

    U,S,VT=np.linalg.svd(dataset.T) #SVD 分解

    V=VT.T

    Ur=U[:,:r]

    Sr=np.diag(S)[:r,:r]  #取前r個U,S,V的值

    Vr=V[:,:r]

    testresult=data_point*Ur*np.linalg.inv(Sr)  # 計算data_point的坐標

    resultarray=array([comsSim(testresult,vi) for vi in Vr]) # 計算距離

    descindx=argsort(-resultarray)[:1]

    print descindx

    # print resultarray

    print resultarray[descindx]


if __name__ == '__main__':

    # 使用SVD算法進行推薦

    recommand_by_svd()

TensorFlow & 神經網絡算法高級應用班」 要開課啦!

從初級到高級,理論 + 實戰,一站式深度了解 TensorFlow!

本課程面向深度學習開發者,講授如何利用 TensorFlow 解決圖像識別、文本分析等具體問題。課程跨度為 10 周,將從 TensorFlow 的原理與基礎實戰技巧開始,一步步教授學員如何在 TensorFlow 上搭建 CNN、自編碼、RNN、GAN 等模型,並最終掌握一整套基於 TensorFlow 做深度學習開發的專業技能。

兩名授課老師佟達、白髮川身為 ThoughtWorks 的資深技術專家,具有豐富的大數據平臺搭建、深度學習系統開發項目經驗。

時間:每周二、四晚 20:00-21:00

開課時長:總學時 20 小時,分 10 周完成,每周 2 次,每次 1 小時

線上授課地址:http://www.mooc.ai/

雷鋒網(公眾號:雷鋒網)相關閱讀:

機器學習算法實踐 K均值聚類的實用技巧

PRICAI 2016 論文精選 | 基於稀鬆K-SVD算法的自發性微表情識別

雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • 實踐入門NLP:基於深度學習的自然語言處理
    【課程亮點】三大模塊,五大應用,手把手快速入門NLP算法+實踐,搭配典型行業應用海外博士講師,豐富項目經驗專業學習社群,隨到隨學【適合人群】本次課程主要適合具備一定編程基礎的開發人員,以及對自然語言處理和深度學習有興趣的踐行者
  • 理論計算機有哪些特別的算法,它們的算法複雜性很高嗎?
    理論計算機作為現代計算機體系結構的一個分支,其算法與複雜性是理論計算機中最核心、最基礎的主題。下面是小編關於一些關於理論計算機算法的資料心得,與大家分享。1.複雜性理論在計算複雜性理論中,討論更多的是問題的複雜性,而不僅僅是算法的複雜性。問題的複雜性是指解決問題的最佳算法的複雜性,核心是如何確定一個問題是否存在多項式時間的算法。
  • 從構建關係網到面試最後一問,這是一份AI公司應聘全面指南
    你可以在個人職業資料中深入介紹這些細節,推薦對項目/思路進行某種形式的可視化或其他展示。創建一份職業資料非常簡單,有很多免費平臺,通過拖放功能就可以實現這一過程。我個人使用 Weebly,這是個廣泛使用的工具。開頭有 reference 更好。
  • 豐富鄉村旅遊開發理論與實踐的好書:評《鄉村旅遊創意開發》
    一部探索豐富鄉村旅遊開發理論與實踐的好書——評《鄉村旅遊創意開發》林德榮由徐虹、朱偉合著的《鄉村旅遊創意開發》(中國農業大學出版社,2019.12)一書,從鄉村旅遊產業開拓角度出發,圍繞著 「鄉村旅遊創意開發」主題展開深入的理論、實踐與方法的研究,論證了鄉村旅遊創意開發的理論基礎
  • 模擬生物嗅覺的神經算法,能讓電腦晶片識彆氣味
    該算法不僅揭示了大腦是如何工作的,並且將其應用到計算機晶片上,可以比現有的機器學習模型更快、更可靠地學習氣味的模式。研究結果也揭示了有助於理解哺乳動物嗅覺以及改進人工化學感知系統的計算特徵。這些發現同時也意味著,改造此類生物神經系統或代表了一種可以開發出超越當前人工智慧的新算法的強大方法。
  • 疫情下AI應用落地加速,避免「算法獨裁」需要中國方案
    「特別是電腦的網絡化和算法的黑箱化,導致因果關係難以確認和說明,勢必動搖責任政府和問責原則的基礎,助長某種『機器官僚主義』的傾向。」他提出,必須及時對人工智慧治理以及相關的法律問題進行深入分析,從理論和實踐兩個方面提出中國方案。
  • 詳解NoSQL資料庫分布式算法的特點
    【IT168 技術】系統的可擴展性是推動NoSQL運動發展的的主要理由,包含了分布式系統協調,故障轉移,資源管理和許多其他特性。這麼講使得NoSQL聽起來像是一個大筐,什麼都能塞進去。儘管NoSQL運動並沒有給分布式數據處理帶來根本性的技術變革,但是依然引發了鋪天蓋地的關於各種協議和算法的研究以及實踐。
  • 【Sekiro只狼攻略】詳解技能系統、早期必點技能推薦
    【Sekiro只狼攻略】詳解技能系統、早期必點技能推薦 【Sekiro只狼攻略】只狼和Dark Souls、Bloodborne等From
  • 模擬退火算法詳解
    若是將固體加熱到一定溫度,分子內能將會增加,熱運動加劇,分子排列的無序度增加。此時再將溫度緩緩降低,在每個溫度都達到平衡態(即準靜態過程),分子具有的能量逐漸降低,最終回歸到有序排列的狀態,分子內能也跟著降到最低。2.模擬退火算法機制模擬退火算法(Simulated Annealing,SA)最早的思想是由N.
  • 深度學習經典算法 | 模擬退火算法詳解
    模擬退火算法基本思想現代的模擬退火算法形成於20世紀80年代初,其思想源於固體的退火過程,即將固體加熱至足夠高的溫度,再緩慢冷卻。升溫時,固體內部粒子隨溫度升高變為無序狀,內能增大,而緩慢冷卻時粒子又逐漸趨於有序,從理論上講,如果冷卻過程足夠緩慢,那麼冷卻中任一溫度時固體都能達到熱平衡,而冷卻到低溫時將達到這一低溫下的內能最小狀態。
  • 從內容生產、內容平臺再到算法,一文看清網際網路媒體的「食物鏈」
    但不斷發展的結果是不斷走向開放,最終發展成了註冊制,理論上,任何有寫作能力的人,都可以成為「百家」。這種開放式平臺的民主價值,顯然比封閉的平臺,看起來更有價值。蘋果的News,可以歸入這一類。蘋果News目前主要由人工分撿新聞,推薦新聞;臉書的Instant Articles,也可以歸入這一類,它由媒體自主上傳,但在呈現時是算法主導。目前,所有的技術平臺,都僅僅在拿餘光看媒體看內容。
  • 眼科AI 的裡程碑 | 全面解讀業內首個基於眼底照相的 AI 篩查系統...
    除了疾病本身的重要性,項目的另一個出發點是,將人工智慧診療系統應用到一些偏遠地區,把基層醫院、區域醫院,跟頂級醫院整合在一起。這也是大會同期啟動5G眼科AI雲系統的一個重要原因,唐曉穎說到,「我們想做從設備端、到數據處理、軟體開發、應用落地,形成一個完整的閉環。」這件事情需要多方角色的參與。因此,項目組下設了五個課題,各有分工。
  • 超簡單機器學習入門好書推薦
    人工智慧(AI)和機器學習(ML)是全球業務、技術和研究人員都感興趣的話題,關於它的書籍、視頻課程也非常的多,前天發布的文章中就有推薦bilibili上面很火爆的機器學習課程。想要深入學習,可以先系統的看看相關的書籍和視頻課程,機器學習可以從兩個方向說起:學習算法和應用領域,如果你有足夠的機器學習知識,並對特定的領域有良好的理解,在職場供求中你肯定可以站在優勢的那一邊,以下為你推薦5本入門好書!1、周志華《機器學習理論導引》這本書為有志於學習和研究機器學習理論的讀者提供導引。
  • 商品推薦系統的類型與原理
    而我們在沒有接觸推薦系統的時候,同樣覺得它十分神秘、不可思議。比如用戶在搜尋引擎上搜索一些商品的資料後,去淘寶或者京東時竟然突然發現在推薦的地方出現了用戶想要去搜索的商品。慢慢去了解推薦系統,並思考推薦系統的實現時,我發現它們背後基本邏輯還是十分簡單的。一、推薦系統是什麼呢?今晚有英超的球賽,啤酒和球賽才是最配,怎麼能沒有啤酒呢,這時你有幾個選擇?
  • 優秀機器學習和AI課程推薦,帶你從入門到精通
    一些編程經驗也是值得推薦的。機器學習(斯坦福CS229)|課程網站這個機器學習的現代經典課程是理解機器學習的概念和技術的一個很好的起點。本課程涵蓋了許多廣泛使用的技巧,課堂講稿詳細並複習了必要的數學概念。卷積神經網絡視覺識別(斯坦福CS231n)|課程網站這是開始深入學習的好方法。本課程主要關注卷積神經網絡和計算機視覺,但也提供遞歸網絡和強化學習的概述。
  • 從數學到物理學:加密算法簡介
    實際上,這幾個不同的詞語最好這樣解釋:1、Cryptology(密碼學) —— 對保密技術的藝術性 以及/或者 密碼系統科學性的研究2、Cryptography(密碼設計學)—— 設計密碼系統來保密的實用方法3、Cryptoanalysis(密碼學分析)—— 致力於發現無需得知密鑰或算法就能從密文中反推出明文的漏洞譯者註:正如作者所說,在現代的文獻中
  • 優化算法系列之模擬退火算法(1)
    模擬退火算法是所謂三大非經典算法之一,它脫胎於自然界的物理過程,與優化問題相結合。在百度百科上對於模擬退火算法的定義是:模擬退火算法來源於固體退火原理,是一種基於概率的算法,將固體加溫至充分高,再讓其徐徐冷卻,加溫時,固體內部粒子隨溫升變為無序狀,內能增大,而徐徐冷卻時粒子漸趨有序,在每個溫度都達到平衡態,最後在常溫時達到基態,內能減為最小。
  • 自然語言處理必讀:5本平衡理論與實踐的書籍
    從更傳統的(基於非神經網絡)NLP技術到當代NLP,NLP越來越依賴於深度學習。這些架構和技術是機器翻譯、句法分析和許多其他應用程式的最新算法背後的驅動力。」在理論或解釋性領域,自然語言處理的神經網絡方法將大大加強你對基於現代神經網絡的NLP方法是如何工作的理解。
  • 不設限的依圖進化史:從算法到算力
    礪石導言:依圖科技正將其過往積累的世界級算法與算力相結合,構建軟硬體一體化的多元產品和端到端的解決方案,縱向打通產業鏈上下遊,正向市場規模更大、智能化價值更高的領域縱深挺進。張杰 | 文自2010年IBM的「智慧城市」理念問世,這一詞彙被全球大多數國家的官方、企業、機構進行了無數次的討論、定義並積極踐行。
  • 10個梯度下降優化算法+備忘單
    默認值(來自Keras):α = 0.001β = 0.9 (本文作者推薦)ε = 10⁻⁶與RMSprop算法類似,Adadelta(Zeiler,2012)是在AdaGrad算法的基礎上針對學習率進行改進的一種自適應算法。Adadelta應該是是「自適應增量」的縮寫,其中,delta表示當前權重與新更新權重之間的差值。