Taste 架構分析

2021-09-30 15:44:16 字數 2541 閱讀 8919

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...