剛看到一新聞說很多網際網路公司尤其是草根北京的都缺少有針對性的CTO,看完我感覺我要努力學好算法,争取自己創業。
一、PearsonCorrelation
兩個變量之間的相關系數越高,從一個變量去預測另一個變量的精确度就越高,這是因為相關系數越高,就意味着這兩個變量的共變部分越多,是以從其中一個變量的變化就可越多地獲知另一個變量的變化。如果兩個變量之間的相關系數為1或-1,那麼你完全可由變量X去獲知變量Y的值。
相關系數:考察兩個事物(在資料裡我們稱之為變量)之間的相關程度。
如果有兩個變量:X、Y,最終計算出的相關系數的含義可以有如下了解:
(1)、當相關系數為0時,X和Y兩變量無關系。
(2)、當X的值增大(減小),Y值增大(減小),兩個變量為正相關,相關系數在0.00與1.00之間。
(3)、當X的值增大(減小),Y值減小(增大),兩個變量為負相關,相關系數在-1.00與0.00之間。
相關系數的絕對值越大,相關性越強,相關系數越接近于1或-1,相關度越強,相關系數越接近于0,相關度越弱。
通常情況下通過以下取值範圍判斷變量的相關強度:
相關系數 0.8-1.0 極強相關
0.6-0.8 強相關
0.4-0.6 中等程度相關
0.2-0.4 弱相關
0.0-0.2 極弱相關或無相關
皮爾遜相關也稱為積差相關(或積矩相關)是英國統計學家皮爾遜于20世紀提出的一種計算直線相關的方法。
假設有兩個變量X、Y,那麼兩變量間的皮爾遜相關系數可通過以下公式計算:

從公式一可以看出隻要兩個變量的标準差都不為0相關系數才有意義。
該系數不足:需要指出的是,相關系數有一個明顯的缺點,即它接近于1的程度與資料組數n相關,這容易給人一種假象。因為,當n較小時,相關系數的波動較大,對有些樣本相關系數的絕對值易接近于1;當n較大時,相關系數的絕對值容易偏小。特别是當n=2時,相關系數的絕對值總為1。是以在樣本容量n較小時,我們僅憑相關系數較大就判定變量x與y之間有密切的線性關系是不妥當的。
二、算法簡介
我們先做個詞法分析基于使用者說明這個算法是以使用者為主體的算法,這種以使用者為主體的算法比較強調的是社會性的屬性,也就是說這類算法更加強調把和你有相似愛好的其他的使用者的物品推薦給你,與之對應的是基于物品的推薦算法,這種更加強調把和你你喜歡的物品相似的物品推薦給你。然後就是協同過濾了,所謂協同就是大家一起幫助你啦,然後後面跟個過濾,就是大家是商量過後才把結果告訴你的,不然資訊量太大了。是以,綜合起來說就是這麼一個算法,那些和你有相似愛好的小夥伴們一起來商量一下,然後告訴你什麼東西你會喜歡。
如何計算相似度,可采用皮爾森相關系數也可以用交集除以并集,本篇隻介紹第一種。
如何找最近鄰K呢?我們知道,在找和你興趣愛好相似的小夥伴的時候,我們可能可以找到幾百個,但是有些是好基友,但有些隻是普通朋友,那麼一般的,我們會定一個數K,和你最相似的K個小夥伴就是你的好基友了,他們的愛好可能和你的愛好相差不大,讓他們來推薦東西給你(比如肥皂)是最好不過了。
何為和你相似呢?簡單的說就是,比如你喜歡macbook,iphone,ipad,A小夥伴喜歡macbook,iphone,note2,小米盒子,肥皂,蠟燭,B小夥伴喜歡macbook,iphone,ipad,肥皂,潤膚霜,C女神喜歡雅詩蘭黛,SK2,香奈兒,D屌絲喜歡ipad,諾基亞8250,小霸王學習機那麼很明顯,B小夥伴和你更加相似,而C女神完全和你不在一個檔次上,那我們推薦的時候會把肥皂推薦給你,因為我們覺得肥皂可能最适合你。
那麼,如何找出這K個基友呢?最直接的辦法就是把目标使用者和資料庫中的所有使用者進行比較,找出和目标使用者最相似的K個使用者,這就是好基友了。
這麼做理論上是沒什麼問題的,但是當資料量巨大的時候,計算K個基友的時間将會非常長,而且你想想就知道,資料庫中的大部分使用者其實和你是沒有什麼交集的,所沒必要計算所有使用者了,隻需要計算和你有交集的使用者就行了。要計算和你有交集的使用者,就要用到物品到使用者的反查表,什麼是反查表呢?很簡單,還是是上面那個AB小夥伴和C女神的例子,反查表就是喜歡macbook的有你,A,B,喜歡iphone的有你,B。。。就是喜歡某些物品的使用者,有了這個表,我們就可以看出來,和你有關系的使用者就隻有A和B,D了,而C女神和你沒有任何交集,是以不用去想C了。
這樣,我們有了A和B,D,然後就分别計算A和B,D與你的相似度,不管用哪個相似性公式,我們算出來都是B和你更相似(在這個例子中,一般會用Jaccard來計算,因為這些向量不是特别好餘弦化),但如果此時我們的K設定為2,那麼我們就得出了與你最相鄰的基友是B和A。
這就是與目标使用者最相鄰的K個使用者的計算。通過這K個使用者來推薦商品了
好了,你的好基友我們也算出來了,接下來要向你推薦商品了。但是我們可推薦的商品有小米盒子,note2,蠟燭,潤膚霜,肥皂這麼四種,到底哪種才是你需要的呢?這裡的算法就比較廣泛了,我們可以不排序,都一股腦推薦給你,但這明顯可能有些你不怎麼感興趣,我們也可以做一些處理,假如我們算出來A和你的相似度是25%,B和你的相似度是80%,那麼對于上面這些産品,我們的推薦度可以這麼來算
小米盒子: 1*0.25 = 0.25
note2: 1*0.25 = 0.25
蠟燭: 1*0.25 = 0.25
潤膚霜: 1*0.8 = 0.8
肥皂: 1*0.8+1*0.25=1.05
好了,通過這個例子,你大概知道了為什麼會推薦肥皂給你了吧,這就是基于使用者的協同推薦算法的描述,總結起來就是這麼幾步
1.計算其他使用者和你的相似度,可以使用反差表忽略一部分使用者
2.根據相似度的高低找出K個與你最相似的鄰居
3.在這些鄰居喜歡的物品中,根據鄰居與你的遠近程度算出每一件物品的推薦度
4.根據每一件物品的推薦度高低給你推薦物品。
比如上面那個例子,首先,我們通過反查表忽略掉了C女神,然後計算出A和B,D與你的相似度,然後根據K=2找出最相似的鄰居A和B,接着根據A,B與你相似度計算出每件物品的推薦度并排序,最後根據排好序的推薦度給你推薦商品。
這個算法實作起來也比較簡單,但是在實際應用中有時候也會有問題的。
比如一些非常流行的商品可能很多人都喜歡,這種商品推薦給你就沒什麼意義了,是以計算的時候需要對這種商品加一個權重或者把這種商品完全去掉也行。再有,對于一些通用的東西,比如買書的時候的工具書,如現代漢語詞典,新華字典神馬的,通用性太強了,推薦也沒什麼必要了。
這些都是推薦系統的髒資料,如何去掉髒資料,這是資料預處理的時候事情了,這裡就不多說了。
例:由于使用者給電影打分有好有壞[1到5分],而我們上面的例子中都是說的喜歡某件物品而沒有說不喜歡的情況,是以首先,我們要把資料處理一下,簡單的來做,我們可以認為3分以上的話代表這個使用者喜歡這個電影,否則就是不喜歡,這樣顯得有點太死闆了,我們也可以這麼來定義,比如使用者A對30部電影打分了,首先求出他打分的平均值,然後高于這個平均值的我們覺得使用者喜歡這個電影,否則認為他不喜歡。
三、發現的問題
發現了二個知識點。
報空指針異常
對recommend數組new完空間後必須用for循環一個一個初始化,否則recommend[i].itemID就會包空指針,因為recommend[i]本身就是null。
數組參數
數組pearsonCorrelation裡可以直接用形參的preference的屬性,比如長度,實際上就是位址傳遞,當然可以了。
四、算法實作
可能某些地方有些小錯誤,希望路過的指出來,檔案粘貼在工程路徑下。
五、算法結果
六、SlopeOne算法簡介
使用者Z對事物B的打分可能是多少呢?股票上有個說法是平均值可以掩蓋一切異常波動,是以股票上的各個技術名額收拾不同時間段的平均值的曲線圖或者柱狀圖等。同樣的,Slope One算法也認為:平均值也可以代替某兩個未知個體之間的打分差異,事物A對事物B的平均很差是:((3 - 4) + (2 - 4)) / 2 = -1.5,也就是說人們對事物B的打分一般比事物A的打分要高1.5,于是Slope one算法就猜測Z對事物B的打分是4 + 1.5 = 5.5。
有n個人對事物A和事物B打分了,R(A->B)表示這n個人對A和對B打分的平均差(A-B),有m個人對事物B和事物C打分 了,R(B->C)表示這m個人對B和對C打分的平均差(B-C),注意都是平均差而不是平方差,現在某個使用者對A的打分是ra,對C的打分是 rc,那麼A對B的打分可能是:
rb = (n * (ra - R(A->B)) + m * (rc + R(B->C)))/(m+n) 。