2013-04-03 19 views
1

我在Mahout中下載了Jester示例代碼,並嘗試在jester數據集上運行它以查看評估結果。運行已成功完成,但控制檯只有結果:運行JesterRecommenderEvaluationRunner,但得不到評估結果

log4j:WARN No appenders could be found for logger (org.apache.mahout.cf.taste.impl.model.file.FileDataModel). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 

我希望看到從0評估分數範圍〜10中任一個可以幫助我發現瞭如何獲得的分數?

我使用Mahout的核心 - 0.6.jar和下面的代碼是:

JesterDataModel.java: 
package Jester; 

import java.io.File; 
import java.io.IOException; 
import java.util.Collection; 
import java.util.regex.Pattern; 

import com.google.common.collect.Lists; 
import org.apache.mahout.cf.taste.example.grouplens.GroupLensDataModel; 
import org.apache.mahout.cf.taste.impl.common.FastByIDMap; 
import org.apache.mahout.cf.taste.impl.model.GenericDataModel; 
import org.apache.mahout.cf.taste.impl.model.GenericPreference; 
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel; 
import org.apache.mahout.cf.taste.model.DataModel; 
import org.apache.mahout.cf.taste.model.Preference; 
import org.apache.mahout.common.iterator.FileLineIterator; 
//import org.apache.mahout.cf.taste.impl.common.FileLineIterable; 

public final class JesterDataModel extends FileDataModel { 

    private static final Pattern COMMA_PATTERN = Pattern.compile(","); 

    private long userBeingRead; 

    public JesterDataModel() throws IOException { 
    this(GroupLensDataModel.readResourceToTempFile("\\jester-data-1.csv")); 
    } 


    public JesterDataModel(File ratingsFile) throws IOException { 
    super(ratingsFile); 
    } 

    @Override 
    public void reload() { 
    userBeingRead = 0; 
    super.reload(); 
    } 

    @Override 
    protected DataModel buildModel() throws IOException { 
    FastByIDMap<Collection<Preference>> data = new FastByIDMap<Collection<Preference>> (); 
    FileLineIterator iterator = new FileLineIterator(getDataFile(), false); 
    FastByIDMap<FastByIDMap<Long>> timestamps = new FastByIDMap<FastByIDMap<Long>>(); 
    processFile(iterator, data, timestamps, false); 
    return new GenericDataModel(GenericDataModel.toDataMap(data, true)); 
    } 

    @Override 
    protected void processLine(String line, 
         FastByIDMap<?> rawData, 
         FastByIDMap<FastByIDMap<Long>> timestamps, 
         boolean fromPriorData) { 
    FastByIDMap<Collection<Preference>> data = (FastByIDMap<Collection<Preference>>) rawData; 
    String[] jokePrefs = COMMA_PATTERN.split(line); 
    int count = Integer.parseInt(jokePrefs[0]); 
    Collection<Preference> prefs = Lists.newArrayListWithCapacity(count); 
    for (int itemID = 1; itemID < jokePrefs.length; itemID++) { // yes skip first one, just a count 
    String jokePref = jokePrefs[itemID]; 
    if (!"99".equals(jokePref)) { 
    float jokePrefValue = Float.parseFloat(jokePref); 
    prefs.add(new GenericPreference(userBeingRead, itemID, jokePrefValue)); 
    } 
} 
data.put(userBeingRead, prefs); 
userBeingRead++; 

}

}

JesterRecommenderEvaluatorRunner.java 
package Jester; 

import org.apache.mahout.cf.taste.common.TasteException; 
import org.apache.mahout.cf.taste.eval.RecommenderEvaluator; 
import org.apache.mahout.cf.taste.impl.eval.AverageAbsoluteDifferenceRecommenderEvaluator; 
import org.apache.mahout.cf.taste.model.DataModel; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import java.io.IOException; 

public final class JesterRecommenderEvaluatorRunner { 

    private static final Logger log = LoggerFactory.getLogger(JesterRecommenderEvaluatorRunner.class); 

    private JesterRecommenderEvaluatorRunner() { 
    // do nothing 
    } 

    public static void main(String... args) throws IOException, TasteException { 
    RecommenderEvaluator evaluator = new AverageAbsoluteDifferenceRecommenderEvaluator(); 
    DataModel model = new JesterDataModel(); 
    double evaluation = evaluator.evaluate(new JesterRecommenderBuilder(), 
             null, 
             model, 
             0.9, 
             1.0); 
    log.info(String.valueOf(evaluation)); 
    } 

}

回答

0

亨利馬烏0.7是老,0.6很老。 SVN以後至少使用0.7或更高版本。 我認爲問題正是你所確定的:你的類路徑中沒有任何slf4j綁定。如果你在Mahout中使用「.job」文件,你將擁有所有的依賴包。然後你會看到輸出。

+0

感謝您的回覆。我現在使用https://github.com/apache/mahout中發佈的最新的cf jester示例,並導入以下jar文件:mahout-core-0.7.jar mahout-core-0.7-job.jar mahout-examples- 0.7.jar mahout-examples-0.7-job.jar mahout-integration-0.7.jar mahout-math-0.7.jar。現在我得到了同樣的錯誤,我下載了mahout 0.7發行版,因爲它是我可以找到的最新版本,我無法找到您在分發文件夾中提到的.job文件? – user2239164

+0

運行'mvn package'後查找'target'中的.job文件。你不需要任何東西,但核心。當然,如果你使用Maven進行演示,你也可以通過Maven包含所有這些,這很容易。 –

+0

我實際上找到了三個.job jar文件。他們是mahout-core-0.2-SNAPSHOT.job mahout-examples-0.2-SNAPSHOT.job mahout-utils-0.2-SNAPSHOT.jar我看到有人在網上討論0.8-SNAPSHOT.job,我能不能找到地方下載0.8-SNAPSHOT.job文件?我在IBM網站的教程示例中找到了這個0.2版本。 – user2239164