【发布时间】:2022-01-04 19:13:28
【问题描述】:
这个问题是因为这个cf4j example code而出现的。特别注意,它为每个被评估的推荐实例创建一个新的 QualityMeasure 对象,并且 如果我们想切换我们的评估方法/使用的 QualityMeasure 子类(当前RMSE),我们将不得不搜索并- 替换每个 QualityMeasure 构造函数。
// Evaluate PMF Recommender
plot.addSeries("PMF");
for (int factors : NUM_FACTORS) {
Recommender pmf = new PMF(datamodel, factors, NUM_ITERS, RANDOM_SEED);
pmf.fit();
QualityMeasure rmse = new RMSE(pmf); // NEED TO EDIT THIS...
double rmseScore = rmse.getScore();
plot.setValue("PMF", factors, rmseScore);
}
// Evaluate BNMF Recommender
plot.addSeries("BNMF");
for (int factors : NUM_FACTORS) {
Recommender bnmf = new BNMF(datamodel, factors, NUM_ITERS, 0.2, 10, RANDOM_SEED);
bnmf.fit();
QualityMeasure rmse = new RMSE(bnmf); // AND THIS...
double rmseScore = rmse.getScore();
plot.setValue("BNMF", factors, rmseScore);
}
// Evaluate BiasedMF Recommender
plot.addSeries("BiasedMF");
for (int factors : NUM_FACTORS) {
Recommender biasedmf = new BiasedMF(datamodel, factors, NUM_ITERS, RANDOM_SEED);
biasedmf.fit();
QualityMeasure rmse = new RMSE(biasedmf); // AND ALSO THIS...
double rmseScore = rmse.getScore();
plot.setValue("BiasedMF", factors, rmseScore);
}
是否可以定义一个(固定的)变量来指定我将在整个过程中使用哪种子类?
private static final QualityMeasureSubclass QM = RMSE; // Can easily switch to MAE, MSE, etc.
QualityMeasure qm = new QM(pmf); // The constructor called depends on the subclass chosen above.
double qmScore = qm.getScore();
plot.setValue("PMF", factors, qmScore);
我确实看到我可以把通用代码分解出来,所以我可以在那个地方调整它,但我不知道上面是否可行。
private static double getQualityMeasureValue(Recommender rec) {
QualityMeasure qm = new RMSE(rec); // Only place we need to edit if we want to switch.
return qm.getScore();
}
// Evaluate PMF Recommender
plot.addSeries("PMF");
for (int factors : NUM_FACTORS) {
Recommender pmf = new PMF(datamodel, factors, NUM_ITERS, RANDOM_SEED);
pmf.fit();
plot.setValue("PMF", factors, getQualityMeasureValue(pmf));
}
编辑:清理了最后一段代码(不需要传入绘图)。
【问题讨论】:
-
您可以随心所欲地进行 - 即定义一次子类,但您需要一些使用反射的实用方法来完成工作,我不确定您是否准备好或愿意走这条路。搜索一下如何使用反射。