より正確にするために、slope-one アルゴリズムにタイムスタンプ (movielens データセット) を追加する必要があります。
ソースコード( mahout-core/...cf/taste/impl/recommender/slopeone の MemoryDiffStorage.java )を変更する必要があると思いましたが、タイムスタンプを追加する方法がわかりません。
DataModle.javaで定義を見つけましたが、Long getPreferenceTime(long userID, long itemID)
まだわかりません。
私は、Java と Mahout は初めてだと言わざるを得ません。なので詳しく教えてください!ありがとう〜:)
以下に変更したコードを追加します:) 元のコードは MemoryDiffStorage.java にあります。いくつかのステートメントを挿入しただけです。
private long processOneUser(long averageCount, long userID) throws TasteException {
log.debug("Processing prefs for user {}", userID);
// Save off prefs for the life of this loop iteration
PreferenceArray userPreferences = dataModel.getPreferencesFromUser(userID);
int length = userPreferences.length();
for (int i = 0; i < length - 1; i++) {
float prefAValue = userPreferences.getValue(i);
long itemIDA = userPreferences.getItemID(i);
long Timestamp = dataModel.getPreferenceTime(userID, itemIDA);
long timestamp_max = 1046388675;
long timestamp_min = 975042787;
long t = (Timestamp - timestamp_min)/(timestamp_max - timestamp_min);
prefAValue = prefAValue * t;
FastByIDMap<RunningAverage> aMap = averageDiffs.get(itemIDA);
if (aMap == null) {
aMap = new FastByIDMap<RunningAverage>();
averageDiffs.put(itemIDA, aMap);
}
for (int j = i + 1; j < length; j++) {
// This is a performance-critical block
long itemIDB = userPreferences.getItemID(j);
RunningAverage average = aMap.get(itemIDB);
if (average == null && averageCount < maxEntries) {
average = buildRunningAverage();
aMap.put(itemIDB, average);
averageCount++;
}
if (average != null) {
average.addDatum(userPreferences.getValue(j) - prefAValue);
}
}