簡體   English   中英

Apache Mahout沒有給出任何建議

[英]Apache Mahout not giving any recommendation

我正在嘗試使用mahout作為推薦但沒有得到

我的數據集:

0,102,5.0
1,101,5.0
1,102,5.0

代碼:

      DataModel datamodel = new FileDataModel(new File("dataset.csv"));
        // Creating UserSimilarity object.
        UserSimilarity usersimilarity = new PearsonCorrelationSimilarity(datamodel);

        // Creating UserNeighbourHHood object.
        UserNeighborhood userneighborhood = new ThresholdUserNeighborhood(0.1, usersimilarity, datamodel);

        // Create UserRecomender
        UserBasedRecommender recommender = new GenericUserBasedRecommender(datamodel, userneighborhood, usersimilarity);

        List<RecommendedItem> recommendations = recommender.recommend(0, 1);

        for (RecommendedItem recommendation : recommendations) {
            System.out.println(recommendation);
        }

我使用的是Mahout版本:0.13.0

理想情況下,它應該推薦item_id = 101' to 'user_id = 0' as user = 0 and user = 1 have item 102 common show it should recommend item_id = 101 to user_id = 0`

日志:

18:08:11.669 [main] INFO org.apache.mahout.cf.taste.impl.model.file.FileDataModel - Creating FileDataModel for file dataset.csv
18:08:11.700 [main] INFO org.apache.mahout.cf.taste.impl.model.file.FileDataModel - Reading file info...
18:08:11.702 [main] INFO org.apache.mahout.cf.taste.impl.model.file.FileDataModel - Read lines: 3
18:08:11.722 [main] INFO org.apache.mahout.cf.taste.impl.model.GenericDataModel - Processed 2 users
18:08:11.738 [main] DEBUG org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender - Recommending items for user ID '0'

Mahout中的Hadoop Mapreduce代碼已被棄用。 新的推薦代碼以@rawkintrevo的例子開頭。 如果您是Scala程序員,請關注他們。

大多數工程師都希望系統無需修改,Mahout算法封裝在Apache PredictionIO之上構建的Universal Recommender中。 它有一個服務器來接受事件,例如示例中的事件,它具有內部事件存儲,以及用於結果的查詢服務器。 舊的Mapreduce代碼有許多改進,包括使用實時用戶行為來提出建議。 無論是新的Mahout還是舊的包含輸入和查詢的服務器,Universal Recommender都有兩個REST端點。

鑒於您正在使用的代碼將被棄用,我強烈建議您深入了解Mahout代碼(@ rawkintrevo的示例)或查看The Universal Recommender,這是一個完整的端到端系統。

  • 以“單機”安裝程序安裝PredictionIO 這里還是要真正快捷安裝使用我們的預包裝AWS AMI 這里它包括PIO和通用導購預裝。
  • 這里添加UR模板
  • 用於在此處向推薦程序發送事件的Java SDK

完成此設置后,您將處理配置,REST或Java SDK以及PIO CLI。 無需Scala編碼。

我有三個基於版本0.13.0的示例(Scala,Samsara需要,R-Like Scala DSL Mahout使用v0.10 +)

步行

第一個例子是一個非常緩慢的步驟: https ://gist.github.com/rawkintrevo/3869030ff1a731d43c5e77979a5bf4a8,並且是作為Pat Ferrels博客文章/幻燈片在這里找到的伴侶。 http://actionml.com/blog/cco

爬行

第二個例子更加“真實”,因為它利用了SimilarityAnalysis.cooccurrencesIDSs(...這是CCO算法的propper接口。

https://gist.github.com/rawkintrevo/c1bb00896263bdc067ddcd8299f4794c

這里我們使用'真實'數據。 MovieLens數據集沒有足夠的功能來展示CCO的多模式功能(能夠推薦多種用戶行為)。 在這里,我們加載“真實”數據並生成建議。 https://gist.github.com/rawkintrevo/f87cc89f4d337d7ffea80a6af3bee83e

結論我知道你特意要求Java,但Apache Mahout目前還不適合Java。 從理論上講,你可以將Scala導入到你的java中,或者將這些函數包裝在另一個更友好的Java函數中......我聽說過一些深夜(或者可能是在夢中)的傳聞,一些研究生在某些地方工作Java API,但它現在不在主干中,也沒有PR,也不是路線圖中的子彈。

希望以上提供一些見解。

附錄

Stackoverflow最簡單的例子(你可以通過鍵入$MAHOUT_HOME/bin/mahout spark-shell在Mahout spark shell中以交互方式運行它(假設設置了SPARK_HOMEJAVA_HOMEMAHOUT_HOME ):

val inputRDD = sc.parallelize(Array(  ("u1", "purchase",    "iphone"),
  ("u1","purchase","ipad"),
  ("u2","purchase","nexus"),
  ("u2","purchase","galaxy"),
  ("u3","purchase","surface"),
  ("u4","purchase","iphone"),
  ("u4","purchase","galaxy"),
  ("u1","category-browse","phones"),
  ("u1","category-browse","electronics"),
  ("u1","category-browse","service"),
  ("u2","category-browse","accessories"),
  ("u2","category-browse","tablets"),
  ("u3","category-browse","accessories"),
  ("u3","category-browse","service"),
  ("u4","category-browse","phones"),
  ("u4","category-browse","tablets")) )



import org.apache.mahout.math.indexeddataset.{IndexedDataset, BiDictionary}
import org.apache.mahout.sparkbindings.indexeddataset.IndexedDatasetSpark

val purchasesIDS = IndexedDatasetSpark.apply(inputRDD.filter(_._2 == "purchase").map(o => (o._1, o._3)))(sc)
val browseIDS = IndexedDatasetSpark.apply(inputRDD.filter(_._2 == "category-browse").map(o => (o._1, o._3)))(sc)

import org.apache.mahout.math.cf.SimilarityAnalysis

val llrDrmList = SimilarityAnalysis.cooccurrencesIDSs(Array(purchasesIDS, browseIDS),
  randomSeed = 1234,
  maxInterestingItemsPerThing = 3,
  maxNumInteractions = 4)

val llrAtA = llrDrmList(0).matrix.collect

IndexedDatasetSpark.apply(需要一個RDD[(String, String)] ,其中第一個字符串是'row'(例如用戶),第二個字符串是'behavior',因此對於'buy matrix',列將是'products' ,但這也可能是一個'性別'矩陣,有兩列(男/女)

然后將一個IndexedDataSets數組傳遞給SimilarityAnalysis.cooccurrencesIDSs(

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM