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

NO IMAGE

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

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

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

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

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

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

2.基於內容的推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

相關文章

計算機網絡實驗8&9

Problem_1小雞啄米

數據庫實驗1初識DBMS,掌握DBMS常用工具

數據庫實驗4:JDBC&ODBC