大資料量是指百萬級別以上
協同推薦的演算法細節在這裡就不論述了,網上有很多文章介紹演算法的原理的。
評分使用者a
使用者b物品a12
物品b3
4物品c14
當使用者量和物品量都比較小的時候,例如幾千,幾萬,這樣構建矩陣是沒問題的,但是如果使用者量和物品量去到幾百萬,幾千萬的時候,這樣就不能構建了,因為記憶體頂不住。
假如使用者量和物品量都是100萬,評分用int型別,也就是4位元組儲存
那就需要100kw100kw4的記憶體量,也就是4tb。不要說記憶體,硬碟也扛不住這個量。
如果來乙個新使用者c,需要把新使用者c加入到矩陣,
然後計算:
計算c和矩陣其他使用者的相似度
通過相似度,計算c對所有物品的評分**
獲取評分**最大的n個物品
如果做熱計算(使用者請求推薦介面時做計算),這個計算很難做到幾秒內返回,所以滿足不了產品的需求(因為使用者等不及)
如果做冷計算(預先為使用者計算好,例如每天晚上為所有使用者計算推薦物品),在大使用者量的前提下,這個計算用時和儲存空間的成本都是很大的
計算物品之間的相似度,對每個物品,計算與之相似度最大的n個物品,儲存下來
對於每個使用者,獲取他對所有物品的評分,用每個物品的評分,乘以這個物品最相似的n個物品的相似度,得到這個使用者對這些個物品的**評分
獲取**評分最好的n個物品,推薦給使用者
這樣的特點
儲存空間減少:物品數*n就可以了,n一般是1000或者10000
熱計算速度快,耗時的相似度計算可以放在冷計算,熱計算只有乘計算,比較簡單,速度快(當然也可以預先為部分活躍使用者計算推薦物品,進一步提公升推薦速度)
使用者冷啟動較快,物品冷啟動較慢。所以適合對新物品不太敏感的產品。
推薦精度會有所下降,因為只獲取相似度最高的n個物品,而不是全部。但是總體效果還可以。
協同推薦,要計算物品和物品之間,或者使用者和使用者之間的相似度。常用的相似度演算法是余弦相似度,這個計算較為複雜,耗cpu資源。
複雜度也較高,是o(n的平方),所以優化余弦相似度演算法的計算,對整體的計算速度收益較大。
分子是0,不計算分母
計算相似度時,先計算分子,如果分子是0,就不需要計算分母了,這樣可以節省時間
去除兩個向量相同列的資料都是0的列
例如向量a是(1,0,1,3),向量b是(2,0,3,4),兩個向量的第二個列的值都是0,所以可以把這列去除,改為計算向量(1,1,3)和 (2,3,4)的相似度,計算結果和去除前一樣。對於較為稀疏的矩陣,這個優化效果很明顯。
未經同意,請不要**
大資料量分頁優化
用limit offset 時並不是先跳過再查詢 而是 先查詢,再跳過 limit 100w,10 先把100w取出來,然後跳過前100w行,所以大資料分頁用limit很慢 select id,name from lx com 5000000,10 先查詢出來5000000 select id,na...
大資料量下的分頁
大資料量下的分頁 郭紅俊 select from orders where orderid between 10248 and 10253 select from orders where orderid in 10248,10249,10250,10251,10252,10253 order by...
大資料量下的sort
sort在linux命令列下面是乙個非常好用的工具,有人把它當做每個程式設計師都應該知道的8個linux命令之一,最近在處理大資料的時候發現兩點。1.用sort u 而不是sort uniq。sort應該是按照歸併的思想來的,先分成乙個個小檔案,排序後再組合成最後拍好序的檔案。所以,sort u 要...