C++期末大作業 圖書評論和推薦系統

weixin_34370347發表於2017-12-13

有人跟我吐槽說這本質上是資料庫大作業+演算法大作業....跟C++其實沒什麼關係 當然如果你要做一個GUI介面的話則另當別論.... 我們小組討論到最後決定放棄挑戰自己,屈服於演算法和期末考試...... 【題目如下】 專案描述 在這個專案中,你們小組需要開發一個關於某類產品的評論和推薦系統,類似於亞馬遜、噹噹和豆瓣等。該類產品不限於圖書,可以是電影、音樂、餐館、美食等等。為了表述方便,我們在此文件中統一表述為圖書。 系統中需要管理一群使用者和許多圖書。使用者可以對系統中的圖書進行【評論和評級】(假設使用1-10級的評分標準)。 當然,一個使用者不可能對系統中的所有圖書進行評分,一般只是對自己看過的書進行評論並給相應的評分。 【系統執行中,可以註冊新的使用者,新增新的圖書,也可以刪除或修改已有的圖書和使用者的資訊(除它們的唯一識別符號之外的資訊,如圖書作者、年份等等)。】 對每本圖書,系統要統計其【總的評論數和平均得分】等。 每個使用者登陸系統後,系統要向其【推薦】該使用者最有可能閱讀但還未閱讀過的10本圖書。 除了推薦圖書,系統還可以向使用者【推薦興趣相投的可能好友】,即其他由類似興趣的使用者。 參考資料集 Book-Crossing Dataset:http://www2.informatik.uni-freiburg.de/~cziegler/BX/ MovieLens:http://grouplens.org/datasets/movielens/

【是不是很像資料庫+演算法大作業??? :)】 這裡我先記一點解題思路

從本質理解上看,其實是在使用者和推薦物之間,在使用者和使用者,物品和物品之間各自建立聯絡,這裡就需要一點資料結構中圖的知識。(而且肯定是帶權的圖) 所以一個很大的問題就在於,如何判斷兩個結點之間有比較好的聯絡?(權比較大之類的)如何排序? 注意這裡面的引數還不少,使用者資訊和評分都很重要。

【可能涉及到的推薦演算法】 1.基於人口統計學的推薦:

說簡單一點就是把物品匹配給相同性別或者年齡層的情況相似的人。 優點:沒有冷啟動的問題 [冷啟動問題:在沒有使用者歷史資料的情況下設計個性化推薦並且讓使用者對推薦結果滿意的問題。 或者根本上說:怎麼給新使用者推薦的問題 ] 缺點:很明顯,演算法很粗糙,效果很難讓人滿意,只適合簡單的推薦。

2.基於內容的推薦

優點: 對使用者興趣可以很好的建模,通過對物品屬性維度的增加獲得更好的推薦度。

缺點: 有冷啟動問題,以及物品的屬性本來就有限,相似度的衡量標準不確定,可能會比較片面。

3.協同過濾(CF)演算法【大BOSS】 話不多說先上參考連結 http://blog.csdn.net/ygrx/article/details/15501679 http://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy2/index.html 我覺得這兩個寫的會比我好很多 該BOSS有兩個變體 (1)基於使用者的協同過濾 想法: 依據使用者對物品的評價計算出所有使用者之間的相似度; 選出與當前使用者最相似的N個使用者; 用N個鄰居使用者對物品的評分,預測當前使用者對沒有瀏覽過的物品的可能評分; 按照預測出的可能評分的高低向當前使用者推薦物品。

【那麼問題來了——怎麼計算相似度?如何預測使用者的評分? 其實這可以理解為圖中兩個結點間的路徑長短判斷問題。

相似度: 一種常用的計算方法: Pearson Correlation

其他的還有Jaccard演算法 / 餘弦演算法 / 加權平均演算法......

預測: 一個常用的預測函式:

對每個鄰居使用者,計算他對物品p的評分高出或者低於其平均評分的差值 將這些評分差值綜合起來---以使用者相似度為權重 將鄰居使用者們對p的評分偏見加到使用者a的平均評分上,作為使用者a對物品p的評分預測

(2)基於物品的協同過濾 依據使用者對物品的評價計算出所有物品之間的相似度; 用某使用者對相似物品的評分,預測該使用者對其未瀏覽過的物品的評分。 按照預測出的可能評分的高低向當前使用者推薦物品。

問題同上,其實思路和解法差不多,但是可能需要一點調整 【調整的餘弦相似度】

協同過濾的優點:顯而易見,比起之前的細度更大,更加科學一點。 缺點:評分矩陣稀疏問題,冷啟動問題等。

小調整: ——(1)一種基於圖的方法: (spreading activation) 思路:用長度>3的路徑來推薦物品 ——(2)矩陣SVD分解:奇異值分解,本質上是降維 ——(3)資訊預處理:減噪和歸一化

減噪:使用者行為資料是使用者在使用應用過程中產生的,它可能存在大量的噪音和使用者的誤操作,我們可以通過經典的資料探勘演算法過濾掉行為資料中的噪音,這樣可以是我們的分析更加精確。 歸一化:在計算使用者對物品的喜好程度時,可能需要對不同的行為資料進行加權。但可以想象,不同行為的資料取值可能相差很大,比如,使用者的檢視資料必然比購買資料大的多,如何將各個行為的資料統一在一個相同的取值範圍中,從而使得加權求和得到的總體喜好更加精確,就需要我們進行歸一化處理。最簡單的歸一化處理,就是將各類資料除以此類中的最大值,以保證歸一化後的資料取值在 [0,1] 範圍中

具體程式碼可以參考我的Github內容:https://github.com/rucerlx/coding-language-learning/pull/1

相關文章