很多web2.0的網站很注重使用者的體驗。
什麼叫“注重使用者體驗呢”?
其實很簡單。很俗的講法--當一個使用者上到你的網站的時候,你要讓使用者感到用的很爽,並且下次還
想來。然而“並且下次還想來“卻是很多網站都想做到的東西。
眾多web2.0網站推出友鄰,同好,小組,同城等功能。其實很多網站都是基於使用者註冊時註冊的資
料來對使用者進行的分組。使用資料庫的資料配對進行的使用者分類。例如一個技術網站,你註冊的時候填
寫了上海市,愛好donet. 則下次你登入的時候系統自動會把你分類到donet技術類。並會把donet技術類
的人員隨機推薦5-10個建議你加入其友鄰。
其實上述的做法有時是最有效而且。精度往往很高。(雖然沒有理論依據).
然而隨著資料量的增大。這樣做帶來了一個很大的缺點---效率低下。百萬級的資料使你無法瞬間完成這種相似使用者的推薦。這也是一個中小型web2.0網站面臨的難題。
拿CSDN的讀書頻道為例。即將推出的是一個書友會功能。其中每個使用者都能對圖書進行評分。目前設定最高為5分。書友會的宗旨
--- “以書會友”.
反過來講。既然以書會友,那系統最關心的事情是幫讀者找朋友。一般讀者都很懶。其實我也很懶。我上有些電影網站。假如他不推薦我一些興趣愛好和我相同的使用者我肯定不自己加他們。所以這樣系統有個相似使用者的推薦確實很重要。
剛開始我嘗試了採用普通程式進行批量查詢。邏輯異常簡單。如使用者A對10本書的裡的5本書打了3分以上。另外5本是2分以下。包含2分。則我會使用程式把對這些書也打打3分以上的使用者取出來,取他們打分最高的書並且刨去使用者A打分最低的5本書。然後降排序取前10本。最後取出擁有這10本打分(超過3分)最多的5本使用者。 很幸運的是。系統測試的時候這個演算法往往很准。不幸運的是。當測試資料到了10萬以上的時候系統慢的想自殺。
於是我開始嘗試使用一些別的辦法。
探索中走彎路的不可避免的/
我首先使用了最簡單而且傳統的 方法 --- 餘弦相似性。
為了容易看懂。我畫個圖
book1 book2 book3 book4 book5
user1 2 2 1 5
user 2 3 3 0 5
user3 3 4 5
user4 4 3
user5 5 3
用此來舉個例。 上面一共5本書。其中有5個使用者對此進行了打分,分值如所示。
其中最高5分。
這樣看來整個資料檢視變成了一個矩陣。
使用者和圖書的關係可以看成一個向量。如user1的向量就是(2,2,0,1,5)(註:其中沒有打分的
我們假設為0)
於是假設開始。
1。假如2個使用者之間的向量夾角為0。我們可以認為他們是完全相似的使用者。(實際中很少這個情況
)
2. 假如2個使用者之間向量夾角都不為0。則夾角越小使用者的相似性越大。
經過我翻了一些資料。於是使用 向量的餘弦來計算使用者相似性。
假設使用者向量使用 D來表示.我們要求的是和user1 最相似的使用者.於是接下來的就是要計算 Duser1
分別和 user2,user3,user4,user5的相似性。 ----假設用sum(userx,usery)表示兩個使用者的相似性.
通過計算 (保留2位小數)
user1:user2 =0.81
user1:user3 =0.34
user1:user4 =0.79
user1:user5 =0.74
這樣可以看出.user2 和use1的相似性是最大的。 使用這個方法為我解決了10萬資料的效率問題
後來我發現其實裡面的漏洞很大...未完待續.....
附:
餘弦公式: 向量的內積/向量模的乘積
歡迎猛戳我簡陋的個人官網
: www.shenyisyn.org