推薦系統(tǒng)實(shí)踐 - hmy1106的專欄 - 博客頻道 - CSDN.NET
http://blog.csdn.net/hmy1106/article/details/44624187
自己動(dòng)手寫一個(gè)推薦系統(tǒng) - 懶惰啊我 - 博客園
http://www.cnblogs.com/flclain/archive/2013/03/03/2941397.html
廢話:
最近朋友在學(xué)習(xí)推薦系統(tǒng)相關(guān),說是實(shí)現(xiàn)完整的推薦系統(tǒng)霞丧,于是我們?nèi)恢粫?huì)有一些討論和推導(dǎo)琼懊,想想索性整理出來梳毙。
在文中主要以工程中做推薦系統(tǒng)的流程著手油挥,穿插一些經(jīng)驗(yàn)之談腺毫,并對(duì)于推薦系統(tǒng)的算法的學(xué)術(shù)界最新的研究進(jìn)展和流派作一些介紹库快。當(dāng)然由于我做推薦系統(tǒng)之時(shí)還年幼晤硕,可能有很多偏頗甚至錯(cuò)誤的見解悼潭,就當(dāng)拋磚引玉,還請(qǐng)各位大大指點(diǎn)窗骑。
Reading lists
雖然很多人覺得作為AI的分支之一女责,推薦跟自然語言處理等問題的難度不可同日而語。但所謂磨刀不誤砍柴工创译,我覺得抵知,至少在開工前先應(yīng)該閱讀這樣基本書,起碼要看看目錄软族,以對(duì)于推薦系統(tǒng)有個(gè)初步的了解刷喜。
中文書籍:
1.《推薦系統(tǒng)實(shí)踐》項(xiàng)亮http://book.douban.com/subject/10769749/
這本書你說他好吧,不如recommend handbook立砸;你說他不好吧掖疮,確實(shí)又把很多基礎(chǔ)而簡(jiǎn)單的問題講的很詳細(xì),而且還是中文的颗祝。薄薄的一本書浊闪,分分鐘可以翻完恼布,總而言之,是一本入門的好書搁宾。
外文書籍:
1.《Recommender Systems Handbook》Paul B. Kantor http://book.douban.com/subject/3695850/
其實(shí)所有敢自稱handbook的書都是神書猿妈。這本書寫的非常細(xì)培愁,而且非常全饲齐,如果你去看一些推薦系統(tǒng)的一些比較冷門的topic的paper愈捅,比如fighting spam的,甚至能發(fā)現(xiàn)很多paper就是直接引用這本書里相關(guān)章節(jié)的內(nèi)容翩腐∧窨睿可以說這本書是做推薦同學(xué)必備的枕邊書,沒看過這本書出去吹牛逼時(shí)你都不好意思說自己是做推薦的茂卦,不過說實(shí)在何什,真正看完的沒幾個(gè),一般是用到哪里查哪里疙筹,我剛才就去豆瓣驗(yàn)證了富俄,幾個(gè)做推薦的都是在讀禁炒,一群文藝青年都是想讀而咆。此書唯一的缺點(diǎn)是沒有出新版,有些地方已經(jīng)成為時(shí)代的眼淚了幕袱。
2.《Recommender Systems - An Introduction》 Dietmar Jannach
http://book.douban.com/subject/5410320/
跟上面一本差不多暴备,學(xué)院派的綜述型的書,厚厚一本们豌,不看的時(shí)候當(dāng)枕頭用涯捻。
3.《mahout in action》Sean Owen http://book.douban.com/subject/4893547/
上面的一中一外的書都是理論基礎(chǔ)的書,這本書就和工程有些沾邊望迎。如果你要用mahout框架來做推薦系統(tǒng)障癌,那么是必須要掃一遍的;如果你不用mahout辩尊,看看其中的流程和代碼組織也是有一定好處的涛浙。
Paper:
由于《Recommender Systems Handbook》很多地方已經(jīng)成為了時(shí)代的眼淚,這里推薦一些綜述摄欲,以便開闊眼界轿亮。
一篇是physics report上面的recommend system這篇綜述,可以說是最新最全的綜述了胸墙,看完后學(xué)術(shù)界都在折騰啥分分鐘就清楚了我注。http://arxiv.org/pdf/1202.1112v1.pdf
比較經(jīng)典的是recommend system的state of art這篇綜述,很多老一輩的同志喜歡推薦的迟隅,說實(shí)在這篇因?yàn)槟甏眠h(yuǎn)但骨,也已經(jīng)成為時(shí)代的眼淚了励七。
開工:
上面給了一些reading lists,并不是說要讀完所有的才能開工奔缠,只是說呀伙,先看完個(gè)目錄,哪里不懂查哪里添坊。在下面介紹的做推薦系統(tǒng)的流程中剿另,我只是想給大家介紹個(gè)普通的推薦系統(tǒng)該怎么做,所以很多地方都有偷懶贬蛙,還請(qǐng)大家見諒雨女。而且由于我不是做的在線的推薦系統(tǒng),而是屬于隔天推薦的那種離線的阳准,所以敘述工程的時(shí)候就是只敘述離線的推薦氛堕。
數(shù)據(jù)準(zhǔn)備:
一般來說,做推薦系統(tǒng)的數(shù)據(jù)一般分兩種野蝇,一種從在線的讀取讼稚,比如用戶產(chǎn)生一個(gè)行為,推薦系統(tǒng)就反應(yīng)下(傳說豆瓣fm就是這么做的绕沈?)锐想,還有一種就是從數(shù)據(jù)庫里讀。
我個(gè)人一般是這樣做的:跟做反作弊的人打個(gè)招呼乍狐,讓他們?cè)谟浻脩粜袨閿?shù)據(jù)的時(shí)候順便存到各個(gè)線上服務(wù)器上赠摇,再寫個(gè)php腳本,從各個(gè)服務(wù)器上把我需要的日志抓過來浅蚪,然后當(dāng)日要的最新的數(shù)據(jù)就來了藕帜。
但是這種地方其實(shí)存儲(chǔ)的數(shù)據(jù)是加了一些判斷的,也就是說是分類記錄的(因?yàn)楹芏嘤涗浭莿e人刷的惜傲,比如丟一個(gè)鏈接到qq群里讓別人幫忙投票什么的)洽故,這里不細(xì)說,到后面fighting spam的地方再討論盗誊。
數(shù)據(jù)過濾:
當(dāng)我們得到了每天產(chǎn)生的數(shù)據(jù)后时甚,說實(shí)在這些數(shù)據(jù)實(shí)在是太多了,我們當(dāng)然用不到這么多浊伙,就要寫個(gè)過濾模塊撞秋,把一些我們用不到的數(shù)據(jù)過濾掉。
我一般是這樣做的:寫個(gè)python的腳本嚣鄙,把過濾器放到一個(gè)單獨(dú)的模塊吻贿,要用的過濾器就到責(zé)任鏈里面注冊(cè)下。這樣別人和自己維護(hù)起來也方便點(diǎn)哑子,順便一說舅列,過濾的東西一般來說有這樣幾種:一種是一個(gè)item只有一個(gè)user打過分的肌割,而且以前沒有人打分的,這樣的數(shù)據(jù)放到推薦的模型里去跑雖然mahout會(huì)自動(dòng)無視它帐要,但其實(shí)按照power law來說是有不少的把敞,內(nèi)存能省就省吧;還有一種是有些黑名單的榨惠,有item和user各自的黑名單奋早,這些也是事先要去掉的。
數(shù)據(jù)存儲(chǔ):
這個(gè)就是大家仁者見仁赠橙,智者見智的時(shí)候了耽装,因?yàn)橐话銇碚f,是你選用的算法和算法具體的實(shí)現(xiàn)方式以及基礎(chǔ)架構(gòu)決定了你的存儲(chǔ)方式期揪,就不多說了掉奄。
我一般是這樣做的:一般做成增量處理的方式,然后每天一計(jì)算凤薛,一周一回滾姓建。由于算法實(shí)現(xiàn)的特殊性,每40個(gè)item user對(duì)存儲(chǔ)在一起缤苫,有點(diǎn)類似于bitmap吧速兔。
推薦系統(tǒng)算法部分:
這部分以前寫過類似的小記錄和心得筆記之類的東西,就直接貼了(:з」∠)
這里的推薦系統(tǒng)的核心算法主要用mahout實(shí)現(xiàn)榨馁。
各種算法對(duì)于推薦都有著自己的特定的假設(shè)憨栽,對(duì)于什么時(shí)候什么樣的算法會(huì)有比較好的performance應(yīng)該對(duì)于假設(shè)反復(fù)驗(yàn)證帜矾。說白了就是做實(shí)驗(yàn)翼虫。
然后我們一般用什么算法呢,看看mahout給的算法吧屡萤,花樣繁多珍剑,什么item based,user based死陆,slop-one招拙,SVD等等,常用的都有了措译,那我們要用什么算法呢别凤。
先簡(jiǎn)單說下user based的算法在mahout中的一些實(shí)現(xiàn):
第一步應(yīng)該先算出所有人的相似度矩陣W,再去對(duì)于item進(jìn)行遍歷领虹,事實(shí)上mahout也是這樣做的规哪。
相似度矩陣也許可以保留下來,這樣可以用來做譜聚類來驗(yàn)證塌衰。
UserSimilarity 封裝了用戶之間的相似性
UserSimilarity similarity = new PearsonCorrelationSimilarity (model);
UserNeighborhood封裝了最相似的用戶組
UserNeighborhood neighborhood = new NearestNUserNeighborhood (2, similarity, model);
總而言之诉稍,用DataModel來生成data model蝠嘉,用UserSimilarity生成User-user之間的相似度矩陣,用戶的鄰居的定義用UserNeighborhood定義杯巨,推薦引擎使用Recommender實(shí)現(xiàn)蚤告。
對(duì)于推薦的評(píng)判是使用evaluator來進(jìn)行評(píng)判
double score = evaluator.evaluate(recommenderBuilder, null, model, 0.95, 0.05);
用95%的數(shù)據(jù)構(gòu)建模型,用5%的數(shù)據(jù)進(jìn)行test
Fixed-size neighborhoods
對(duì)于到底用多少人作為用戶周圍的一圈服爷,我們事實(shí)上沒有一個(gè)確定的值杜恰,就像做生物實(shí)驗(yàn)一樣需要不斷在特定的數(shù)據(jù)集里跑出來。
Threshold-based neighborhood
當(dāng)然仍源,我們也可以定義個(gè)threshold去找出最相似的用戶群箫章。
Threshold定義為-1到1(相似度矩陣返回的相似度就是在這個(gè)范圍)
new ThresholdUserNeighborhood(0.7, similarity, model)
我們對(duì)于各個(gè)算法做個(gè)簡(jiǎn)單的比(吐)較(槽):
(假設(shè)我們是要像亞馬遜一樣對(duì)商品做推薦,然后我們最終是要做top k的推薦)
Item based
一般來說item-based要跑得快一些镜会,因?yàn)閕tem比user少
Slop one
說實(shí)在話我覺得在對(duì)于一些個(gè)人品味比較看重的東西上這個(gè)算法不是很靠譜
但是它在GroupLens 10 million數(shù)據(jù)的結(jié)果是0.65
當(dāng)然檬寂,對(duì)于股票系統(tǒng)這種還是可取的
這個(gè)算法的假設(shè)是對(duì)于不同item的preference有種線性關(guān)系
不過slope-one有個(gè)好處是它的online算的很快,并且它的性能不由用戶的數(shù)量決定
在mahout中的調(diào)用方法是new SlopeOneRecommender(model)
這個(gè)方法提供了兩種weight:weighting based on count and on standard deviation
count 是越多的user的給越多的權(quán)重戳表,對(duì)出的是一個(gè)加權(quán)的平均數(shù)
standard deviation則是越低的deviation給予越高的權(quán)重
這兩個(gè)weight是默認(rèn)采用的桶至,當(dāng)然disable它們只會(huì)讓結(jié)果變得稍微壞一點(diǎn)0.67
不過這個(gè)算法有個(gè)很明顯的缺點(diǎn)是比較占內(nèi)存
但是幸運(yùn)的是我們可以把它存在數(shù)據(jù)庫里:MySQLJDBCDataModel
Singular value decomposition–based recommenders
事實(shí)上,盡管SVD失去了一些信息匾旭,但是有時(shí)候它可以改善推薦的結(jié)果镣屹。
這個(gè)過程在有用的方式平滑了輸入
new SVDRecommender(model, new ALSWRFactorizer(model, 10, 0.05, 10))
第一個(gè)參數(shù)10是我們的目標(biāo)屬性個(gè)數(shù)
第二個(gè)屬性是lambda->regularization
最后一個(gè)參數(shù)是training step跑的次數(shù)
KnnItemBasedRecommender
囧,事實(shí)上這個(gè)是用的knn的方式來做的算法价涝,和前面的選擇一個(gè)threshold然后圈畫用戶的算法是比較像的
但是用knn代價(jià)是非常高的女蜈,因?yàn)樗ケ容^所有的items的對(duì)
ItemSimilarity similarity = new LogLikelihoodSimilarity(model);
Optimizer optimizer = new NonNegativeQuadraticOptimizer();
return new KnnItemBasedRecommender(model, similarity, optimizer, 10);
結(jié)果也還不算差,是0.76
Cluster-based recommendation
基于聚類的推薦可以說是基于用戶的推薦的算法的變體中最好的一種思路
對(duì)于每一個(gè)聚類里面的用戶進(jìn)行推薦
這個(gè)算法在推薦里面是非成瘢快的伪窖,因?yàn)槭裁炊际孪人愫昧恕?br>
這個(gè)算法對(duì)于冷啟動(dòng)還是挺不錯(cuò)的
感覺mahout里面用的聚類算法應(yīng)該類似于Kmeans?
TreeClusteringRecommender
UserSimilarity similarity = new LogLikelihoodSimilarity(model);
ClusterSimilarity clusterSimilarity =
new FarthestNeighborClusterSimilarity(similarity);
return new TreeClusteringRecommender(model, clusterSimilarity, 10);
注意的是兩個(gè)cluster之間的相似度是用ClusterSimilarity來定義的
其中cluster之間的相似度還有NearestNeighborClusterSimilarity可選
吐槽:
對(duì)于算法的選擇居兆,其實(shí)我們是要和我們要推薦的目標(biāo)掛鉤的覆山。為什么最近學(xué)術(shù)界搞SVD那一系的算法這么火,什么LDA泥栖,plsa各種算法層出不窮簇宽,事實(shí)上因?yàn)閚etflix的要求是要優(yōu)化RMSE,在機(jī)器學(xué)習(xí)的角度來看吧享,類似于回歸問題魏割,而工業(yè)界的角度來說,我們一般的需求是做top k的推薦钢颂,更加類似于分類問題钞它。所以為什么相比用SVD系列的算法,用item based這種更加ad hoc的算法要表現(xiàn)的更好一些。當(dāng)然2012年的KDD cup第一名的組用的是item based+SVD的算法须揣,這是后話盐股。
那么我就假設(shè)解我們這個(gè)top k的商品推薦的問題就用item based好了(速度快,結(jié)果又不算差)耻卡,接下來就是確定相似度了疯汁。
相似度確定:
我們對(duì)于各個(gè)相似度做一些比(吐)較(槽):
PearsonCorrelationSimilarity
Pearson correlation:
coeff = corr(X , Y);
function coeff = myPearson(X , Y)
% 本函數(shù)實(shí)現(xiàn)了皮爾遜相關(guān)系數(shù)的計(jì)算操作
%
% 輸入:
% X:輸入的數(shù)值序列
% Y:輸入的數(shù)值序列
%
% 輸出:
% coeff:兩個(gè)輸入數(shù)值序列X,Y的相關(guān)系數(shù)
%
if length(X) ~= length(Y)
error('兩個(gè)數(shù)值數(shù)列的維數(shù)不相等');
return;
end
fenzi = sum(X .* Y) - (sum(X) * sum(Y)) / length(X);
fenmu = sqrt((sum(X .^2) - sum(X)^2 / length(X)) * (sum(Y .^2) - sum(Y)^2 / length(X)));
coeff = fenzi / fenmu;
end %函數(shù)myPearson結(jié)束
當(dāng)兩個(gè)變量的標(biāo)準(zhǔn)差都不為零時(shí)卵酪,相關(guān)系數(shù)才有定義幌蚊,皮爾遜相關(guān)系數(shù)適用于:
(1)、兩個(gè)變量之間是線性關(guān)系溃卡,都是連續(xù)數(shù)據(jù)溢豆。
(2)、兩個(gè)變量的總體是正態(tài)分布瘸羡,或接近正態(tài)的單峰分布漩仙。
(3)、兩個(gè)變量的觀測(cè)值是成對(duì)的犹赖,每對(duì)觀測(cè)值之間相互獨(dú)立队他。
1.沒有考慮到用戶偏好重合的items的數(shù)量
2,只有一個(gè)item是相交錯(cuò)的話是不能得到correlation的,對(duì)于比較稀疏或者小的數(shù)據(jù)集這是個(gè)要注意的問題峻村。不過一般來說兩個(gè)用戶之間只有一個(gè)item重疊從直覺上來說也不那么相似
Pearson correlation一般出現(xiàn)在早期的推薦的論文和推薦的書里麸折,不過并不總是好的。
在mahout中使用了一個(gè)增加的參數(shù)Weighting.WEIGHTED粘昨,適當(dāng)使用可以改善推薦結(jié)果
EuclideanDistanceSimilarity
Return 1 / (1 + d)
CosineMeasureSimilarity
當(dāng)two series of input values each have a mean of 0(centered)時(shí)和PearsonCorrelation是有相同結(jié)果的
所以在mahout中我們只要簡(jiǎn)單的使用PearsonCorrelationSimilarity就好
Spearman correlation
這個(gè)方法用rank的方式垢啼,雖然失去了具體的打分信息,不過卻保留了item的order
Return的結(jié)果是-1和1兩個(gè)值张肾,不過和pearson一樣芭析,對(duì)于只有一個(gè)item重疊的也算不出。
而且這個(gè)算法比較慢捌浩,因?yàn)樗愫痛鎯?chǔ)rank的信息放刨。所以paper多而實(shí)際用的少,對(duì)于小數(shù)據(jù)集才值得考慮
CachingUserSimilarity
UserSimilarity similarity = new CachingUserSimilarity(
new SpearmanCorrelationSimilarity(model), model);
Ignoring preference values in similarity with the Tanimoto coefficient
TanimotoCoefficientSimilarity
如果一開始就有preference value尸饺,當(dāng)數(shù)據(jù)中signal比noise多的時(shí)候可以用這個(gè)方法。
不過一般來說有preference信息的結(jié)果要好助币。
log-likelihood
Log-likelihood try to access how unlikely 這些重疊的部分是巧合
結(jié)果的值可以解釋為他們的重合部分并不是巧合的概念
算法的結(jié)果可能比tanimoto要好浪听,是一個(gè)更加聰明的metric
Inferring preferences
對(duì)于數(shù)據(jù)量比較小的數(shù)據(jù),pearson很難handle眉菱,比如一個(gè)user只express一個(gè)preference
于是要估計(jì)相似度么.........
AveragingPreferenceInferrer
setPreferenceInferrer().
不過這種辦法在實(shí)際中并不是有用的迹栓,只是在很早的paper中mention到
通過現(xiàn)在的信息來估計(jì)并不能增加什么東西,并且很大的降低了計(jì)算速度
最終我們要通過實(shí)驗(yàn)來比較上面的相似度俭缓,一般來說是用準(zhǔn)確率克伊,召回率酥郭,覆蓋率評(píng)測(cè)。
這里有一篇Building Industrial-scale Real-world Recommender Systems
http://vdisk.weibo.com/s/rMSj-
寫netflex的愿吹,非常好不从,我就不獻(xiàn)丑多說了,所以上面只是吐槽下常見的算法和相似度犁跪。
其實(shí)算法按流派分是分為下面這些類別的椿息,大家有興趣也可以了解下,我這里就不多做介紹:
Similarity-based methods
Dimensionality Reduction Techniques
Dimensionality-based methods
Diffusion-based methods
Social fltering
Meta approaches
我上面所說的相似度和推薦算法坷衍,只能算是Similarity-based methods和Dimensionality Reduction Techniques里的非常小的一小部分寝优,只當(dāng)拋磚引玉了。
Ps:剛在豆瓣上問了下枫耳,他們說就用前兩種乏矾,事實(shí)上我也是覺得協(xié)同過濾+SVD 偶爾做做topic model就夠了 如果沒事干再上點(diǎn)social trusted的東西
增加規(guī)則:
記得hulu在做presentation的時(shí)候說過“不能做規(guī)則定制的推薦系統(tǒng)不是一個(gè)好的推薦系統(tǒng)”(好像是這樣吧......)事實(shí)上我們做出來的推薦的結(jié)果是需要做很多處理再展現(xiàn)給用戶的,這時(shí)候就是需要增加規(guī)則的時(shí)候了迁杨。
1.改善推薦效果:有些協(xié)同過濾的算法妻熊,做出來的結(jié)果不可避免的產(chǎn)生一些讓人啼笑皆非的結(jié)果,比如用戶什么都買仑最,導(dǎo)致你有可能跟姑娘們推薦的時(shí)候在佛祖下面推薦泳裝什么的(真實(shí)的故事)扔役。這時(shí)候就有兩種辦法,一種就是調(diào)整模型警医,一種就是增加規(guī)則做一定的限制亿胸。再舉個(gè)常見的例子就是有時(shí)候會(huì)在推薦冬裝的時(shí)候出現(xiàn)夏裝什么的,這時(shí)候一般我的處理方式是給這種季節(jié)性商品做一個(gè)隨時(shí)間的衰退预皇。
2.增加廣告和導(dǎo)向:插入廣告侈玄,我們的最愛,這個(gè)就不多說了吟温,靠規(guī)則序仙。而所謂用戶喜歡的,其實(shí)不一定就是最好的鲁豪,比如用戶一般來說就喜歡便宜的潘悼,還有什么韓流爆款之流,如果你推出來的東西都是這樣的爬橡,整個(gè)系統(tǒng)就變成洗剪吹大集合了治唤,非常影響定位,這時(shí)候也要上規(guī)則糙申。
3.做一些數(shù)據(jù)挖掘和fighting spam的工作:這個(gè)在fighting spam的地方細(xì)說
可視化參數(shù)調(diào)整:
做完上面的工作宾添,一般來說推薦系統(tǒng)的基礎(chǔ)架構(gòu)就差不多了,但是往往各個(gè)算法以及你自己上的規(guī)則都有多如牛毛的參數(shù)要調(diào)整,這時(shí)候一般要自己寫個(gè)測(cè)試腳本缕陕,將調(diào)整的結(jié)果可視化下一下粱锐,我個(gè)人推薦的是highchart,看參數(shù)以及比較各個(gè)指標(biāo)非常清爽扛邑, 還可以自己做一些比如是取log之類的定制怜浅,很是方便。http://www.highcharts.com/
調(diào)整參數(shù)以及上線:
上線前有兩個(gè)事要做鹿榜,一般來說就是離線測(cè)試和AB test海雪。
離線測(cè)試就是把數(shù)據(jù)抽樣一部分,分為train data和test data舱殿,然后評(píng)估一些準(zhǔn)確率奥裸,召回率以及coverage之類的指標(biāo),用上面的可視化工具觀測(cè)比較下沪袭,感覺差不多了把pm叫過來讓她給小編們看看湾宙,看看審美和效果之類的。這是比較粗糙的冈绊,有的地方做的比較過細(xì)侠鳄,還有用戶調(diào)研和請(qǐng)一些人來實(shí)際使用,這是后話死宣。
AB test也是大家最喜歡的地方了伟恶。因?yàn)檎f實(shí)在,評(píng)估推薦系統(tǒng)學(xué)術(shù)界是看準(zhǔn)確率那一些東西毅该,但是工業(yè)界還是看pv uv轉(zhuǎn)化率這種實(shí)打?qū)崕硇б娴臇|西博秫,而AB test就是評(píng)估這些的。我個(gè)人是比較推薦這種方法眶掌,說不上好挡育,只是拋磚引玉,就是按一般的做法先空跑一個(gè)星期朴爬,然后再把系統(tǒng)上線實(shí)際做算法pk即寒,然后選取的實(shí)驗(yàn)用戶一半的幾率進(jìn)入原來的算法的推薦,一半的幾率進(jìn)入你的算法的推薦召噩,每天看看轉(zhuǎn)化率之間的比較母赵,順便還可以調(diào)下參數(shù)做做實(shí)驗(yàn)。如果算法穩(wěn)定表現(xiàn)較好蚣常,就差不多了市咽。
Fighting spam:
俗話說,有人的地方就有江湖抵蚊,有推薦的地方就有人刷。刷子一般分三種類型的:average random和nuke。一般來說贞绳,average和random比較好對(duì)付谷醉,只要你的系統(tǒng)魯棒性好點(diǎn),基本影響不大冈闭。但是nuke的就非常煩俱尼,一般來說有兩種思路解決,一種是提高系統(tǒng)魯棒性萎攒,另外就是上規(guī)則遇八。我們從這張圖看看兩種思路分布對(duì)應(yīng)的解決效果:
其實(shí)魯棒性的系統(tǒng)做的就是把efficient attack的曲線降低,其實(shí)效果不算太好耍休。
規(guī)則就是做到提前檢測(cè)刃永,將危險(xiǎn)扼殺在搖籃之中,就是做的藍(lán)色的那塊detectable的部分羊精。
Fighting spam是個(gè)博大精深的問題斯够,俗話說,與人斗喧锦,其樂無窮读规,就是說的這個(gè)意思。
我們從規(guī)則說來燃少,一般來說規(guī)則可以放到最前面的數(shù)據(jù)收集和過濾的階段束亏,比如在收集數(shù)據(jù)的時(shí)候看看這個(gè)人是否是多個(gè)賬號(hào)但是是一個(gè)ip,或者有些人用戶名或者注冊(cè)郵箱有群體相似性質(zhì)阵具,或者有沒有出現(xiàn)pv等不正常的情況碍遍。有時(shí)候我們也可以從推薦的結(jié)果里上規(guī)則來查,比如有些人刷的過火了怔昨,導(dǎo)致推薦結(jié)果出現(xiàn)一些問題雀久,我們就可以用迭代的方式按照先驗(yàn)的刷子的比例來排出刷子排行榜之類的東西。這些都是經(jīng)驗(yàn)之談趁舀,上不了臺(tái)面赖捌,大家也可以自己摸索。
結(jié)束:
上面啰嗦了半天矮烹,大體上做一個(gè)完整的簡(jiǎn)單推薦系統(tǒng)就是涉及到上面這些步驟越庇。一些地方說的不夠詳細(xì),有些是因?yàn)槲覒蟹畋罚行┦遣环奖阏f卤唉。大家覺得我說的不對(duì)或者不妥的地方,可以直接在下面跟帖噴仁期,或者有大大指導(dǎo)我也是很歡迎的桑驱,大家多交流經(jīng)驗(yàn)竭恬。我的郵箱是flclain@gmail.com 豆瓣是http://www.douban.com/people/45119625/ 有什么問題也可以豆瓣或者郵件交流。
其實(shí)我是覺得熬的,要是有個(gè)大大說“你個(gè)傻缺痊硕,寫的狗屁不通,讓我來教你我是怎么做推薦的”就更好了押框。
標(biāo)簽: 推薦系統(tǒng)
好文要頂 關(guān)注我 收藏該文
+加關(guān)注
7
2
? 上一篇:Weka中BP神經(jīng)網(wǎng)絡(luò)的實(shí)踐(參數(shù)調(diào)整以及結(jié)果分析)? 下一篇:當(dāng)推薦算法開源包多如牛毛岔绸,為什么我們還要專門的推薦算法工程師
posted @ 2013-03-03 12:53 懶惰啊我 閱讀(23301) 評(píng)論(16) 編輯 收藏
評(píng)論列表
#1樓 2013-03-03 14:29 Jany_zhang
理論較多。橡伞。盒揉。。沒看到實(shí)戰(zhàn)兑徘。刚盈。。
支持(0)反對(duì)(0)
#2樓[樓主] 2013-03-03 14:42 懶惰啊我
@ Jany_zhang其實(shí)要是帖代碼的話我項(xiàng)目的源代碼都有 光過濾器這個(gè)模塊就可以帖10幾頁 但是總覺得推薦系統(tǒng)這種還是方法論多一些 所謂code is cheap, show me the method 說的就是這類學(xué)科
支持(2)反對(duì)(0)
#3樓 2013-03-03 17:46 *深海
學(xué)習(xí)了道媚,有空好好交流交流
支持(0)反對(duì)(0)
#4樓 2013-03-05 09:55 sunlovesea
如果發(fā)源代碼扁掸,就是我們程序猿的福利了
支持(0)反對(duì)(0)
#5樓 2013-05-27 14:38 mlw2000
我想知道類似京東里的:買了xx東西的用戶還買了xx。最域。谴分。。這個(gè)是哪個(gè)推薦:1. 獲取所有相似的物品镀脂,然后計(jì)算每個(gè)的相似度后排序得出;2. 對(duì)物品聚類牺蹄,然后計(jì)算同一個(gè)簇中的所有物品的相似度后排序;3. 其他薄翅?
支持(0)反對(duì)(0)
#6樓 2013-11-21 10:19 huofootball
樓主好沙兰,我初學(xué)SVD,有個(gè)小疑問:既然要分解矩陣式個(gè)稀疏的翘魄,有很多缺失的評(píng)分鼎天,又怎么能進(jìn)行奇異值分解呢?
支持(0)反對(duì)(0)
#7樓 2014-02-19 15:15 目 留
@ huofootball有幾種方法:1暑竟,缺失的全部填平均值斋射。2,用其他方法預(yù)測(cè)出缺失值的最可能值但荤,然后填充罗岖。3,梯度下降法
支持(0)反對(duì)(0)
#8樓 2014-02-19 15:17 目 留
@ mlw2000有幾種可能的方法:1腹躁,user-based或者item-based2桑包,就你這個(gè)問題而言,每個(gè)item維護(hù)了一個(gè)user list纺非,user list里的每個(gè)user都購買了這個(gè)item哑了。然后在user的item-list里隨便找一個(gè)item赘方,就可以達(dá)到你的目的了:買了xx東西的用戶還買了xx。垒手。蒜焊。倒信。
支持(0)反對(duì)(0)
#9樓 2014-02-19 15:18 目 留
@ sunlovesea源碼貼出來其實(shí)非常占用篇幅其次科贬,學(xué)推薦系統(tǒng),算法鳖悠、模型榜掌、數(shù)據(jù)是非常重要的,代碼反而是其次乘综。再加上有mahout憎账,在理解了相應(yīng)模型的情況下,只要你會(huì)java卡辰,寫出代碼胞皱,毫無壓力。應(yīng)該追求對(duì)模型的透徹理解以及業(yè)務(wù)需求的把握九妈,也就是根據(jù)業(yè)務(wù)不同反砌,選擇不同的合適的算法和模型。這些能力萌朱,更重要宴树。
支持(1)反對(duì)(0)
#10樓 2014-10-24 18:08 李永輝
@ mlw2000買了還買是基于關(guān)聯(lián)規(guī)則的算法。瀏覽了還買是相似
支持(0)反對(duì)(0)
#11樓 2014-10-24 18:09 李永輝
@ 目 留支持
支持(0)反對(duì)(0)
#12樓 2015-01-08 20:09 DM張朋飛
求源代碼 不要光說不做
支持(0)反對(duì)(0)
#13樓[樓主] 2015-01-08 20:26 懶惰啊我
@ DM張朋飛在公司做的晶疼,還有我也沒有開源的習(xí)慣
支持(0)反對(duì)(0)
#14樓 2015-09-09 11:22 lazy6
item-based,計(jì)算完相似性之后的部分呢酒贬,具體怎么推薦。翠霍。锭吨。
支持(0)反對(duì)(0)
#15樓 2015-10-28 09:10 DM張朋飛
求源代碼 不要光說不做
支持(0)反對(duì)(0)
#16樓 2016-08-18 15:58 合唱團(tuán)abc
哈哈哈 樓主是大神,在滴滴年薪40+