日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

从源代码剖析Mahout推荐引擎

發(fā)布時(shí)間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从源代码剖析Mahout推荐引擎 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Hadoop家族系列文章,主要介紹Hadoop家族產(chǎn)品,常用的項(xiàng)目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa,新增加的項(xiàng)目包括,YARN, Hcatalog, Oozie, Cassandra, Hama, Whirr, Flume, Bigtop, Crunch, Hue等。

從2011年開(kāi)始,中國(guó)進(jìn)入大數(shù)據(jù)風(fēng)起云涌的時(shí)代,以Hadoop為代表的家族軟件,占據(jù)了大數(shù)據(jù)處理的廣闊地盤(pán)。開(kāi)源界及廠商,所有數(shù)據(jù)軟件,無(wú)一不向Hadoop靠攏。Hadoop也從小眾的高富帥領(lǐng)域,變成了大數(shù)據(jù)開(kāi)發(fā)的標(biāo)準(zhǔn)。在Hadoop原有技術(shù)基礎(chǔ)之上,出現(xiàn)了Hadoop家族產(chǎn)品,通過(guò)“大數(shù)據(jù)”概念不斷創(chuàng)新,推出科技進(jìn)步。

作為IT界的開(kāi)發(fā)人員,我們也要跟上節(jié)奏,抓住機(jī)遇,跟著Hadoop一起雄起!

關(guān)于作者:

  • 張丹(Conan), 程序員Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog:?http://blog.fens.me
  • email: bsspirit@gmail.com

轉(zhuǎn)載請(qǐng)注明出處:
http://blog.fens.me/mahout-recommend-engine/

前言

Mahout框架中cf.taste包實(shí)現(xiàn)了推薦算法引擎,它提供了一套完整的推薦算法工具集,同時(shí)規(guī)范了數(shù)據(jù)結(jié)構(gòu),并標(biāo)準(zhǔn)化了程序開(kāi)發(fā)過(guò)程。應(yīng)用推薦算法時(shí),代碼也就7-8行,簡(jiǎn)單地有點(diǎn)像R了。為了使用簡(jiǎn)單的目標(biāo),Mahout推薦引擎必然要做到精巧的程序設(shè)計(jì)。

本文將介紹Mahout推薦引擎的程序設(shè)計(jì)。

目錄

  • Mahout推薦引擎概況
  • 標(biāo)準(zhǔn)化的程序開(kāi)發(fā)過(guò)程
  • 數(shù)據(jù)模型
  • 相似度算法工具集
  • 近鄰算法工具集
  • 推薦算法工具集
  • 創(chuàng)建自己的推薦引擎構(gòu)造器
  • 1. Mahout推薦引擎概況

    Mahout的推薦引擎,要從org.apache.mahout.cf.taste包說(shuō)起。

    packages的說(shuō)明:

    • common: 公共類包括,異常,數(shù)據(jù)刷新接口,權(quán)重常量
    • eval: 定義構(gòu)造器接口,類似于工廠模式
    • model: 定義數(shù)據(jù)模型接口
    • neighborhood: 定義近鄰算法的接口
    • recommender: 定義推薦算法的接口
    • similarity: 定義相似度算法的接口
    • transforms: 定義數(shù)據(jù)轉(zhuǎn)換的接口
    • hadoop: 基于hadoop的分步式算法的實(shí)現(xiàn)類
    • impl: 單機(jī)內(nèi)存算法實(shí)現(xiàn)類

    從上面的package情況,我可以粗略地看出推薦引擎分為5個(gè)主要部分組成:數(shù)據(jù)模型,相似度算法,近鄰算法,推薦算法,算法評(píng)分器。

    從數(shù)據(jù)處理能力上,算法可以分為:單機(jī)內(nèi)存算法,基于hadoop的分步式算法。

    下面我們將基于單機(jī)內(nèi)存算法,研究Mahout的推薦引擎的結(jié)構(gòu)。

    2. 標(biāo)準(zhǔn)化的程序開(kāi)發(fā)過(guò)程

    以UserCF的推薦算法為例,官方建議我們的開(kāi)發(fā)過(guò)程:

    圖片摘自Mahout in Action

    從上圖中我們可以看到,算法是被模塊化的,通過(guò)1,2,3,4的過(guò)程進(jìn)行方法調(diào)用。

    程序代碼:

    public class UserCF {final static int NEIGHBORHOOD_NUM = 2;final static int RECOMMENDER_NUM = 3;public static void main(String[] args) throws IOException, TasteException {String file = "datafile/item.csv";DataModel model = new FileDataModel(new File(file));UserSimilarity user = new EuclideanDistanceSimilarity(model);NearestNUserNeighborhood neighbor = new NearestNUserNeighborhood(NEIGHBORHOOD_NUM, user, model);Recommender r = new GenericUserBasedRecommender(model, neighbor, user);LongPrimitiveIterator iter = model.getUserIDs();while (iter.hasNext()) {long uid = iter.nextLong();List list = r.recommend(uid, RECOMMENDER_NUM);System.out.printf("uid:%s", uid);for (RecommendedItem ritem : list) {System.out.printf("(%s,%f)", ritem.getItemID(), ritem.getValue());}System.out.println();}} }

    我們調(diào)用算法的程序,要用到4個(gè)對(duì)象:DataModel, UserSimilarity, NearestNUserNeighborhood, Recommender。

    3. 數(shù)據(jù)模型

    Mahout的推薦引擎的數(shù)據(jù)模型,以DataModel接口為父類。

    通過(guò)“策略模式”匹配不同的數(shù)據(jù)源,支持File, JDBC(MySQL, PostgreSQL), NoSQL(Cassandra, HBase, MongoDB)。

    注:NoSQL的實(shí)現(xiàn)在mahout-integration-0.8.jar中。

    數(shù)據(jù)格式支持2種:

    • GenericDataModel: 用戶ID,物品ID,用戶對(duì)物品的打分(UserID,ItemID,PreferenceValue)
    • GenericBooleanPrefDataModel: 用戶ID,物品ID (UserID,ItemID),這種方式表達(dá)用戶是否瀏覽過(guò)該物品,但并未對(duì)物品進(jìn)行打分。

    4. 相似度算法工具集

    相似度算法分為2種

    • 基于用戶(UserCF)的相似度算法
    • 基于物品(ItemCF)的相似度算法

    1). 基于用戶(UserCF)的相似度算法

    計(jì)算用戶的相似矩陣,可以通過(guò)上圖中幾種算法。

    2). 基于物品(ItemCF)的相似度算法

    計(jì)算物品的相似矩陣,可以通過(guò)上圖中幾種算法。

    關(guān)于相似度距離的說(shuō)明:

    • EuclideanDistanceSimilarity: 歐氏距離相似度

      原理:利用歐式距離d定義的相似度s,s=1 / (1+d)。

      范圍:[0,1],值越大,說(shuō)明d越小,也就是距離越近,則相似度越大。

      說(shuō)明:同皮爾森相似度一樣,該相似度也沒(méi)有考慮重疊數(shù)對(duì)結(jié)果的影響,同樣地,Mahout通過(guò)增加一個(gè)枚舉類型(Weighting)的參數(shù)來(lái)使得重疊數(shù)也成為計(jì)算相似度的影響因子。

    • PearsonCorrelationSimilarity: 皮爾森相似度

      原理:用來(lái)反映兩個(gè)變量線性相關(guān)程度的統(tǒng)計(jì)量

      范圍:[-1,1],絕對(duì)值越大,說(shuō)明相關(guān)性越強(qiáng),負(fù)相關(guān)對(duì)于推薦的意義小。

      說(shuō)明:1、 不考慮重疊的數(shù)量;2、 如果只有一項(xiàng)重疊,無(wú)法計(jì)算相似性(計(jì)算過(guò)程被除數(shù)有n-1);3、 如果重疊的值都相等,也無(wú)法計(jì)算相似性(標(biāo)準(zhǔn)差為0,做除數(shù))。

      該相似度并不是最好的選擇,也不是最壞的選擇,只是因?yàn)槠淙菀桌斫?#xff0c;在早期研究中經(jīng)常被提起。使用Pearson線性相關(guān)系數(shù)必須假設(shè)數(shù)據(jù)是成對(duì)地從正態(tài)分布中取得的,并且數(shù)據(jù)至少在邏輯范疇內(nèi)必須是等間距的數(shù)據(jù)。Mahout中,為皮爾森相關(guān)計(jì)算提供了一個(gè)擴(kuò)展,通過(guò)增加一個(gè)枚舉類型(Weighting)的參數(shù)來(lái)使得重疊數(shù)也成為計(jì)算相似度的影響因子。

    • UncenteredCosineSimilarity: 余弦相似度

      原理:多維空間兩點(diǎn)與所設(shè)定的點(diǎn)形成夾角的余弦值。

      范圍:[-1,1],值越大,說(shuō)明夾角越大,兩點(diǎn)相距就越遠(yuǎn),相似度就越小。

      說(shuō)明:在數(shù)學(xué)表達(dá)中,如果對(duì)兩個(gè)項(xiàng)的屬性進(jìn)行了數(shù)據(jù)中心化,計(jì)算出來(lái)的余弦相似度和皮爾森相似度是一樣的,在mahout中,實(shí)現(xiàn)了數(shù)據(jù)中心化的過(guò)程,所以皮爾森相似度值也是數(shù)據(jù)中心化后的余弦相似度。另外在新版本中,Mahout提供了UncenteredCosineSimilarity類作為計(jì)算非中心化數(shù)據(jù)的余弦相似度。

    • SpearmanCorrelationSimilarity: Spearman秩相關(guān)系數(shù)相似度

      原理:Spearman秩相關(guān)系數(shù)通常被認(rèn)為是排列后的變量之間的Pearson線性相關(guān)系數(shù)。

      范圍:{-1.0,1.0},當(dāng)一致時(shí)為1.0,不一致時(shí)為-1.0。

      說(shuō)明:計(jì)算非常慢,有大量排序。針對(duì)推薦系統(tǒng)中的數(shù)據(jù)集來(lái)講,用Spearman秩相關(guān)系數(shù)作為相似度量是不合適的。

    • CityBlockSimilarity: 曼哈頓距離相似度

      原理:曼哈頓距離的實(shí)現(xiàn),同歐式距離相似,都是用于多維數(shù)據(jù)空間距離的測(cè)度

      范圍:[0,1],同歐式距離一致,值越小,說(shuō)明距離值越大,相似度越大。

      說(shuō)明:比歐式距離計(jì)算量少,性能相對(duì)高。

    • LogLikelihoodSimilarity: 對(duì)數(shù)似然相似度

      原理:重疊的個(gè)數(shù),不重疊的個(gè)數(shù),都沒(méi)有的個(gè)數(shù)

      范圍:具體可去百度文庫(kù)中查找論文《Accurate Methods for the Statistics of Surprise and Coincidence》

      說(shuō)明:處理無(wú)打分的偏好數(shù)據(jù),比Tanimoto系數(shù)的計(jì)算方法更為智能。

    • TanimotoCoefficientSimilarity: Tanimoto系數(shù)相似度

      原理:又名廣義Jaccard系數(shù),是對(duì)Jaccard系數(shù)的擴(kuò)展,等式為

      范圍:[0,1],完全重疊時(shí)為1,無(wú)重疊項(xiàng)時(shí)為0,越接近1說(shuō)明越相似。

      說(shuō)明:處理無(wú)打分的偏好數(shù)據(jù)。

    相似度算法介紹,摘自:http://www.cnblogs.com/dlts26/archive/2012/06/20/2555772.html

    5. 近鄰算法工具集

    近鄰算法只對(duì)于UserCF適用,通過(guò)近鄰算法給相似的用戶進(jìn)行排序,選出前N個(gè)最相似的,作為最終推薦的參考的用戶。

    近鄰算法分為2種:

    • NearestNUserNeighborhood:指定N的個(gè)數(shù),比如,選出前10最相似的用戶。
    • ThresholdUserNeighborhood:指定比例,比如,選擇前10%最相似的用戶。

    6. 推薦算法工具集

    推薦算法是以Recommender作為基礎(chǔ)的父類,關(guān)于推薦算法的詳細(xì)介紹,請(qǐng)參考文章:Mahout推薦算法API詳解

    7. 創(chuàng)建自己的推薦引擎構(gòu)造器

    有了上面的知識(shí),我就清楚地知道了Mahout推薦引擎的原理和使用,我們就可以寫(xiě)一個(gè)自己的構(gòu)造器,通過(guò)“策略模式”實(shí)現(xiàn),算法的組合。

    新建文件:org.conan.mymahout.recommendation.job.RecommendFactory.java

    public final class RecommendFactory { ... }

    1). 構(gòu)造數(shù)據(jù)模型

    public static DataModel buildDataModel(String file) throws TasteException, IOException {return new FileDataModel(new File(file));}public static DataModel buildDataModelNoPref(String file) throws TasteException, IOException {return new GenericBooleanPrefDataModel(GenericBooleanPrefDataModel.toDataMap(new FileDataModel(new File(file))));}public static DataModelBuilder buildDataModelNoPrefBuilder() {return new DataModelBuilder() {@Overridepublic DataModel buildDataModel(FastByIDMap trainingData) {return new GenericBooleanPrefDataModel(GenericBooleanPrefDataModel.toDataMap(trainingData));}};}

    2). 構(gòu)造相似度算法模型

    public enum SIMILARITY {PEARSON, EUCLIDEAN, COSINE, TANIMOTO, LOGLIKELIHOOD, FARTHEST_NEIGHBOR_CLUSTER, NEAREST_NEIGHBOR_CLUSTER}public static UserSimilarity userSimilarity(SIMILARITY type, DataModel m) throws TasteException {switch (type) {case PEARSON:return new PearsonCorrelationSimilarity(m);case COSINE:return new UncenteredCosineSimilarity(m);case TANIMOTO:return new TanimotoCoefficientSimilarity(m);case LOGLIKELIHOOD:return new LogLikelihoodSimilarity(m);case EUCLIDEAN:default:return new EuclideanDistanceSimilarity(m);}}public static ItemSimilarity itemSimilarity(SIMILARITY type, DataModel m) throws TasteException {switch (type) {case LOGLIKELIHOOD:return new LogLikelihoodSimilarity(m);case TANIMOTO:default:return new TanimotoCoefficientSimilarity(m);}}public static ClusterSimilarity clusterSimilarity(SIMILARITY type, UserSimilarity us) throws TasteException {switch (type) {case NEAREST_NEIGHBOR_CLUSTER:return new NearestNeighborClusterSimilarity(us);case FARTHEST_NEIGHBOR_CLUSTER:default:return new FarthestNeighborClusterSimilarity(us);}}

    3). 構(gòu)造近鄰算法模型

    public enum NEIGHBORHOOD {NEAREST, THRESHOLD}public static UserNeighborhood userNeighborhood(NEIGHBORHOOD type, UserSimilarity s, DataModel m, double num) throws TasteException {switch (type) {case NEAREST:return new NearestNUserNeighborhood((int) num, s, m);case THRESHOLD:default:return new ThresholdUserNeighborhood(num, s, m);}}

    4). 構(gòu)造推薦算法模型

    public enum RECOMMENDER {USER, ITEM}public static RecommenderBuilder userRecommender(final UserSimilarity us, final UserNeighborhood un, boolean pref) throws TasteException {return pref ? new RecommenderBuilder() {@Overridepublic Recommender buildRecommender(DataModel model) throws TasteException {return new GenericUserBasedRecommender(model, un, us);}} : new RecommenderBuilder() {@Overridepublic Recommender buildRecommender(DataModel model) throws TasteException {return new GenericBooleanPrefUserBasedRecommender(model, un, us);}};}public static RecommenderBuilder itemRecommender(final ItemSimilarity is, boolean pref) throws TasteException {return pref ? new RecommenderBuilder() {@Overridepublic Recommender buildRecommender(DataModel model) throws TasteException {return new GenericItemBasedRecommender(model, is);}} : new RecommenderBuilder() {@Overridepublic Recommender buildRecommender(DataModel model) throws TasteException {return new GenericBooleanPrefItemBasedRecommender(model, is);}};}public static RecommenderBuilder slopeOneRecommender() throws TasteException {return new RecommenderBuilder() {@Overridepublic Recommender buildRecommender(DataModel dataModel) throws TasteException {return new SlopeOneRecommender(dataModel);}};}public static RecommenderBuilder itemKNNRecommender(final ItemSimilarity is, final Optimizer op, final int n) throws TasteException {return new RecommenderBuilder() {@Overridepublic Recommender buildRecommender(DataModel dataModel) throws TasteException {return new KnnItemBasedRecommender(dataModel, is, op, n);}};}public static RecommenderBuilder svdRecommender(final Factorizer factorizer) throws TasteException {return new RecommenderBuilder() {@Overridepublic Recommender buildRecommender(DataModel dataModel) throws TasteException {return new SVDRecommender(dataModel, factorizer);}};}public static RecommenderBuilder treeClusterRecommender(final ClusterSimilarity cs, final int n) throws TasteException {return new RecommenderBuilder() {@Overridepublic Recommender buildRecommender(DataModel dataModel) throws TasteException {return new TreeClusteringRecommender(dataModel, cs, n);}};}

    5). 構(gòu)造算法評(píng)估模型

    public enum EVALUATOR {AVERAGE_ABSOLUTE_DIFFERENCE, RMS}public static RecommenderEvaluator buildEvaluator(EVALUATOR type) {switch (type) {case RMS:return new RMSRecommenderEvaluator();case AVERAGE_ABSOLUTE_DIFFERENCE:default:return new AverageAbsoluteDifferenceRecommenderEvaluator();}}public static void evaluate(EVALUATOR type, RecommenderBuilder rb, DataModelBuilder mb, DataModel dm, double trainPt) throws TasteException {System.out.printf("%s Evaluater Score:%s\n", type.toString(), buildEvaluator(type).evaluate(rb, mb, dm, trainPt, 1.0));}public static void evaluate(RecommenderEvaluator re, RecommenderBuilder rb, DataModelBuilder mb, DataModel dm, double trainPt) throws TasteException {System.out.printf("Evaluater Score:%s\n", re.evaluate(rb, mb, dm, trainPt, 1.0));}/*** statsEvaluator*/public static void statsEvaluator(RecommenderBuilder rb, DataModelBuilder mb, DataModel m, int topn) throws TasteException {RecommenderIRStatsEvaluator evaluator = new GenericRecommenderIRStatsEvaluator();IRStatistics stats = evaluator.evaluate(rb, mb, m, null, topn, GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD, 1.0);// System.out.printf("Recommender IR Evaluator: %s\n", stats);System.out.printf("Recommender IR Evaluator: [Precision:%s,Recall:%s]\n", stats.getPrecision(), stats.getRecall());}

    6). 推薦結(jié)果輸出

    public static void showItems(long uid, List recommendations, boolean skip) {if (!skip || recommendations.size() > 0) {System.out.printf("uid:%s,", uid);for (RecommendedItem recommendation : recommendations) {System.out.printf("(%s,%f)", recommendation.getItemID(), recommendation.getValue());}System.out.println();}}

    7). 完整源代碼文件及使用樣例:
    https://github.com/bsspirit/maven_mahout_template/tree/mahout-0.8/src/main/java/org/conan/mymahout/recommendation/job

    轉(zhuǎn)載請(qǐng)注明出處:
    http://blog.fens.me/mahout-recommend-engine/

    總結(jié)

    以上是生活随笔為你收集整理的从源代码剖析Mahout推荐引擎的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 99视频在线精品免费观看2 | 日韩国产一区二区 | 国产视频二区 | 国产精品一区二区6 | 少妇太爽了 | 欧美77777 | 免费无码肉片在线观看 | 欧美日韩一区二 | 自拍毛片 | 爱草视频| 日本精品一区二区三区四区 | 成人黄色大片在线观看 | 国产一区二区在线免费 | 亚洲男女视频在线观看 | 亚洲免费二区 | 欧美人狂配大交3d | 日韩av资源 | 偷偷色噜狠狠狠狠的777米奇 | 亚洲国产亚洲 | 日本伦理片在线播放 | 欧美电影一区 | 日日噜噜夜夜狠狠久久丁香五月 | 少妇喷潮明星 | 不卡中文字幕 | 韩国伦理片在线播放 | 久久性爱视频网站 | 国产伦精品一区二区三区视频1 | 色婷婷网| 91在线精品观看 | 精品播放| 亚洲欧美在线免费 | 素人一区二区 | 欧美日韩高清 | 国产精品美女在线 | 亚洲欧美在线视频观看 | 操日韩| 国产又粗又大又黄 | 男女午夜免费视频 | 色骚综合 | 国产传媒av| 97国产在线视频 | 亚洲高清自拍 | 18成人在线 | 亚洲精品乱码久久久久久日本蜜臀 | 91tv在线观看 | 偷拍亚洲色图 | 韩国性猛交╳xxx乱大交 | 亚洲综合国产精品 | 在线a| 一本大道伊人av久久综合 | 国产免费成人av | 亚洲精品在线免费播放 | www.国产| 天天综合天天干 | 91丝袜| 人体内射精一区二区三区 | 久久久久中文字幕亚洲精品 | 欧性猛交ⅹxxx乱大交 | 伊人婷婷综合 | 六月丁香av | 夜夜精品一区二区无码 | 外国av在线| 国产亚洲福利 | 久久久免费 | 成人免费入口 | 天天干天天爽天天操 | 中文字幕一区二区三区人妻不卡 | av日韩在线免费观看 | 香蕉一区二区三区四区 | 强迫凌虐淫辱の牝奴在线观看 | 操伊人 | 性活交片大全免费看 | 欧美黑人性生活 | 丝袜老师让我了一夜网站 | 国内外免费激情视频 | 91精品国产入口在线 | 午夜视频h | 另类男人与善交video | 亚洲av日韩精品久久久久久久 | 无码人妻精品一区二区蜜桃色欲 | 国产成人精 | 91亚洲精品在线 | 久久婷五月 | www.激情网 | 日韩不卡一区二区 | 伊人天堂网 | 中文字幕日本一区 | 国产一级免费在线观看 | 亚洲图片激情小说 | av基地| 亚洲国产成人久久 | 综合久色 | 性感美女一区二区三区 | 色老头在线一区二区三区 | 大地资源二中文在线影视免费观看 | 91国产免费观看 | 歪歪视频在线观看 | 国产激情一区二区三区在线观看 | 欧美丰满老熟妇aaaa片 |