/** * Utility method to extract item ids that are shared between user A and user B. */ public static int[] getSharedItems(GeneralUser x, GeneralUser y) { List <int> sharedItems = new List <int>(); x.getAllRatings().ForEach(delegate(GeneralRating r) { if (y.getItemRating(r.getItemId()) != null) { sharedItems.Add(r.getItemId()); } }); return(sharedItems.ToArray()); }
public double getSimilarity(GeneralUser u, int simType) { double sim = 0.0d; int commonItems = 0; switch (simType) { // 0 - вычисление Евклидова расстояния case 0: foreach (KeyValuePair <int, GeneralRating> kvp in this.DictionaryOfBooksRating) { foreach (KeyValuePair <int, GeneralRating> kvp2 in u.DictionaryOfBooksRating) { if (kvp.Value.getItemId() == kvp2.Value.getItemId()) { commonItems++; sim += Math.Pow((kvp.Value.getRating() - kvp2.Value.getRating()), 2); } } } if (commonItems > 0) { // Вычисление среднеквадратичной ошибки sim = Math.Sqrt(sim / commonItems); // Значение должно быть от 0 до 1 // Если значение 0, значит пользователи абсолютно разные // Если значени 1, значит интрересы пользоватeлей идентичны sim = 1.0d - Math.Tanh(sim); } break; // 1 - вычисление Евклидова расстояния принимая во внмание кол-во общих элементов case 1: foreach (KeyValuePair <int, GeneralRating> kvp in this.DictionaryOfBooksRating) { foreach (KeyValuePair <int, GeneralRating> kvp2 in u.DictionaryOfBooksRating) { if (kvp.Value.getItemId() == kvp2.Value.getItemId()) { commonItems++; sim += Math.Pow((kvp.Value.getRating() - kvp2.Value.getRating()), 2); } } } if (commonItems > 0) { sim = Math.Sqrt(sim / commonItems); sim = 1.0d - Math.Tanh(sim); // Максимальное кол-во элементов, которые общие для обоих пользователей int maxCommonItems = Math.Min(this.DictionaryOfBooksRating.Count, u.DictionaryOfBooksRating.Count); sim = sim * ((double)commonItems / (double)maxCommonItems); } break; default: break; } return(sim); }
public SimilarUser(GeneralUser user, double similarity) { friend = user; this.similarity = similarity; }