taste 是乙個著名的開源框架,目前已經在mahout專案下。taste 實現了比較流行的個性化推薦演算法: user-based、item-based、slope one
實現了 5 個著名的相似度計算演算法:
*euclideandistance(歐氏距離)
*loglikelihood(對數似然)
*pearsoncorrelation(皮爾遜相關係數)
*spearmancorrelation(和前乙個類似,比較的不同而已)
*tanimotocoefficient(有點類似於關聯規則,當然也有很大的不同)
taste在官方文件中自稱: taste is designed to be enterprise-ready; it's designed for performance, scalability and flexibility.
稍後的分析我們會看到,taste現在還達不到 enterprise-ready。
taste的體系結構
這是taste'''官網'''上的內容,taste目前支援兩種datamodle:
*filedatamodel
*databasedatamodel
儲存的格式是一樣的:userid"itemid"ratio
neighborhood是尋找user或者item的最近 n 個鄰居,這中間會用到相似度計算的演算法。
recommender 就是輸出推薦結果的,它會呼叫傳入的引數:neighborhood、datamodel,recommender是可配置的(recommender.properties),我們可以實現自己的推薦類。
taste的可擴充套件性
正如官方文件所說,taste is scalability and flexibility。
下面來看一下taste的主要類結構:
介面繼承結構
頂層介面包括相似度、鄰居、模型、推薦等介面。refreshable是父介面,它只提供了乙個方法:
void refresh(collectionalreadyrefreshed);
其實這是乙個觀察者模式(observer pattern),當資料模型更新的時候,會按照依賴關係更新狀態
相似度演算法類結構
這裡先解釋一下,其實說"相似度"是不準確的,個性化推薦計算的不是相似,而是相關,user-user或者item-item的相關性,所以下面就不再說相似,統一用"相關"術語來解釋。
taste定義了乙個抽象類 abstractsimilarity,實現了usersimilarity, itemsimilarity 兩個介面,taste實現的五個相關度計算演算法都從這個抽象類繼承而來。
recommender的類結構
推薦類都是從abstractrecommender繼承而來,他們是在計算相關性之後,按照不同的方式從所有相關的item中選擇前 n 個,即 top-n 的推薦方式。
datamodel對我們意義不大,所以此處省略不寫了。
在 taste 中新增自己的演算法
從前面的類結構中可以看出,taste提供了原生態的介面,提供了抽象類的實現。所有,如果我們想新增自己的相似度計算演算法、推薦類、資料模型表示、infer演算法,可以根據需要,實現原生的介面或者從抽象類直接繼承即可。
taste的scalability, 說直白點,就是面向介面的程式設計。比dunie framework稍好一些,後者的pluggable模組,完全借助於spring實現的。
taste的效能
先說結論吧,'''taste不支援企業級的資料應用'''。
taste提供了slope one,item-based or user-based 三種推薦的"hadoop實現",這裡加了引號,意味著不支援hadoop,下面看具體分析:
3. slope one推薦演算法實現的頂級軟骨
關於 slope one後續會專門開文介紹。
來看看slope one在得到使用者的打分矩陣之後,reduce生成 item 的 diff 的矩陣的實現:
@override
protected void reduce(text key, iterablevalues, context context)
throws ioexception, interruptedexception
'''collections.sort(prefs, byitemidcomparator.getinstance());(2)'''
int size = prefs.size();
'''for (int i = 0; i < size; i++) }}
黑體部分是需要特別注意的地方:
(1):先把 reduce 的 values儲存到 list裡。如果商品數量很大,list能存下嗎?而且在接近jvm堆記憶體極限的過程中,list不斷的擴充,導致的記憶體copy,也夠低效的:(
(2):sort,雖然jdk的排序做了優化,可是對上百萬的資料排序,還是很耗 cpu 的
(3):for 迴圈,計算 item 的 diff 矩陣,是需要笛卡爾乘積計算的。這麼大的計算量,雙重 for loop,是無論如何也對付不了大資料的。
綜上, taste無法支援企業級規模資料的應用!
Pidgin架構分析
pidgin是乙個可以在windows linux bsd和unixes下執行的多協議即時通訊客戶端,可以讓你用你所有的即時通訊帳戶中一次登入。pidgin支援的通訊 aim bonjour gadu gadu google talk groupwise icq irc msn myspaceim ...
Spring Flex 架構分析
spring flex 架構分析 spring flex是spring和adobe共同研發的乙個開源專案,她整合了 spring的優秀特性和blaseds的工作機制,使用spring也可以很好的應用在ria應用程式開發中。spring flex整合後的服務端工作原理圖 1 2 暴露運程服務,支援如下...
nhibernate架構分析
以nhibernate prealpha build 2為準 從圖中可以看到,session和sessionfactory是nhibernate的核心部分。sessionfactory維護到持久機制 資料庫 的連線並對它們進行管理,同時還儲存著所有持久物件的對映資訊。sessionfactory由c...