用python寫乙個簡單的推薦系統

2021-09-19 07:58:14 字數 1770 閱讀 6433

在上篇文章豆瓣電影,電視劇集dm實戰中提及到,我和室友們產生了劇荒,萌生出要做乙個個人用的推薦系統,解決劇荒的問題的想法,經過一輪的死纏爛打,這個個人推薦系統終於成型了。

今天來分享一下心得,對此感興趣的朋友可以自己對著寫乙個。

首先介紹一下傳統的推薦系統方法,之所以叫它傳統,是因為大部分學習資料上都是用這乙個方法。

我們來假設有這麼乙個矩陣(用python的列表表示):

[# a b c d e

[2,0,0,4,4], #1

[5,5,5,3,3], #2

[2,4,2,1,2] #3

......

]

矩陣的行代表使用者,列表示物品,其交點表示使用者對該物品的評分。

假設現在使用者1需要選商品,推薦系統則假設其會選擇並未選擇過的商品,因此,系統會在第一行中尋找評分為0的物品,顯然會找到bc。這時,該怎麼知道是推薦b還是c呢?(假設使用者只需推薦乙個),這時則需要計算b、c和使用者以前選擇過的物品(已評分)的相似度。

僅僅算出相似度還不夠,因為你不能判斷這到底是好的那一部分相似還是壞的部分相似。所以這時,我們需要引入使用者的評分作為相似度計算的權重評分x相似度得到最後的得分(該得分會一直累加,則b的推薦得分會是b與a,d,e的相似得分的累加和)。這樣一來,評分低物品的最後得分自然就低,評分高的物品自然得分就高,這時問題就簡化成排序問題了。

顯然,上述問題的核心在於如何計算相似度。

這裡給出計算相似度的兩種方法:

在上述的內容中,我們可以發現傳統的方法有乙個特出的問題,傳統的演算法需要大量的使用者評分,即矩陣的行數需要較多才能得出的結果才值得參考。這乙個需求咋看起來是沒什麼問題,也符合我們的邏輯,唯有資料量足夠,我們才能找到較為準確的規律嘛。

但回到我的需求上來說,這可是乙個明顯的缺點,在前言我說明的需求上說過這是乙個給宿舍甚至是個人使用的推薦系統。

也就是說:

因此,傳統的推薦演算法有很多不適合我需求的地方,但是看問題要看本質。無非就是根據使用者的特性,或者根據商品特性,進行與訓練好的模型進行相似性比較。抓住這些特點,我做了少少的"創新"

實現上述想法,在python中,我們可以這麼做,實現如下字典

record = 

#labelname是標籤名稱,在該標籤下有乙個元組,元組的第乙個欄位是這個標籤的權重。

#權重越大,表示使用者越喜歡這個標籤。

#第二個欄位是建立該標籤的起始時間

在實現推薦時,則較為容易實現,給定testlist。這時需要:

這樣,乙個適合少使用者的推薦系統就弄出來啦~

現在正在宿舍投入執行,至於效果如何可能要一段時間才知道了

github 位址

說明一下,github上只是提供了乙個實現了上述改進後思路的類遲下我會上傳乙個使用falsk封裝的乙個簡單的webserver去github,可以通過web api請求,返回json格式的電影資訊。

如有錯誤,望指正。

用python寫乙個簡單的視窗

import sys if name main 建立乙個視窗 w qwidget 設定視窗的尺寸 w.resize 400,200 移動視窗 w.move 300,300 設定視窗的標題 w.setwindowtitle 第乙個基於pyqt5的桌面應用 顯示視窗 w.show 進入程式的主迴圈 並通...

ROS 用Python寫乙個簡單服務

一.編寫服務資料 在功能包的頂級目錄中,建立srv資料夾,並在裡面建立.srv檔案 先成為a.srv 在srv檔案中,填入服務資料,如 int64 a int64 b int64 sum其中,上方是請求資料,下方是答應資料 二.修改cmakelist和package.xml cmakelist ca...

用python寫乙個簡單的彈球遊戲

用python寫乙個簡單的彈球遊戲,可以使用球拍接住球讓球在邊框內不停的彈動,如果球拍沒有接住則遊戲結束 我們需要匯入tkinter模組來建立畫布 匯入時間模組來控制球的速度,就是控制球移動的間隔時間 匯入隨機模組使球彈的方向是隨機的。fromtkinterimport importtime imp...