public override void Fit(BaseDataSet dataSet) { Profiler.BeginSample("SlopeOne.Fit"); var nItems = dataSet.itemCount; base.Fit(dataSet); m_Freq = new int[nItems, nItems]; m_Dev = new double[nItems, nItems]; foreach (var(_, uRatings) in dataSet.userRatings) { foreach (var(_, i, rUi) in uRatings) { foreach (var(_, j, rUj) in uRatings) { m_Freq[i, j] += 1; m_Dev[i, j] += rUi - rUj; } } } for (var i = 0; i < nItems; i++) { m_Dev[i, i] = 0; for (var j = i + 1; j < nItems; j++) { m_Dev[i, j] /= m_Freq[i, j]; m_Dev[j, i] = -m_Dev[i, j]; } } m_UserMean = dataSet.allUsers .Select(u => dataSet.UserRatings(u).Select(rt => rt.rating).Average()).ToArray(); Profiler.EndSample(); }
public CollaborativeFilteringRecommender(BaseAlgorithm algorithm) { m_Algorithm = algorithm; m_DataSet = new ArrayBackedSinglePlayerDataSet(MonsterMatchArrayData.Data, MonsterMatchArrayData.UserCount, MonsterMatchArrayData.ItemCount); m_PlayerUserId = MonsterMatchArrayData.PlayerUserId; Debug.Log($"DefaultRecommender: m_PlayerUserId={m_PlayerUserId}"); m_ApplicationItemIdsToInternalIds = Enumerable.Range(0, MonsterMatchArrayData.ItemCount) .ToDictionary(i => MonsterMatchArrayData.ForProfiles[i], i => i); m_InternalIdsToApplicationItemIds = MonsterMatchArrayData.ForProfiles; }
public virtual void Fit(BaseDataSet dataSet) { m_DataSet = dataSet; }