private double GetRating(UserArticleRatings user, List <UserArticleRatings> neighbors, int articleId) { int articleIndex = ratings.ArticleIndexToID.IndexOf(articleId); var nonZero = user.ArticleRatings.Where(x => x != 0); double avgUserRating = nonZero.Count() > 0 ? nonZero.Average() : 0.0; double score = 0.0; int count = 0; for (int u = 0; u < neighbors.Count; u++) { var nonZeroRatings = neighbors[u].ArticleRatings.Where(x => x != 0); double avgRating = nonZeroRatings.Count() > 0 ? nonZeroRatings.Average() : 0.0; if (neighbors[u].ArticleRatings[articleIndex] != 0) { score += neighbors[u].ArticleRatings[articleIndex] - avgRating; count++; } } if (count > 0) { score /= count; score += avgUserRating; } return(score); }
public double GetRating(int userId, int articleId) { UserArticleRatings user = ratings.Users.FirstOrDefault(x => x.UserID == userId); List <UserArticleRatings> neighbors = GetNearestNeighbors(user, neighborCount); return(GetRating(user, neighbors, articleId)); }
public List <Suggestion> GetSuggestions(int userId, int numSuggestions) { int userIndex = ratings.UserIndexToID.IndexOf(userId); UserArticleRatings user = ratings.Users[userIndex]; var art1 = ratings.art.OrderBy(m => m.ArticleID).ToList(); var user1 = ratings.Users.OrderBy(m => m.UserID).ToList(); List <Suggestion> suggestions = new List <Suggestion>(); var neighbors = GetNearestNeighbors(user, neighborCount); for (int articleIndex = 0; articleIndex < ratings.ArticleIndexToID.Count; articleIndex++) { // If the user in question hasn't rated the given article yet if (user.ArticleRatings[articleIndex] == 0) { double score = 0.0; int count = 0; for (int u = 0; u < neighbors.Count; u++) { if (neighbors[u].ArticleRatings[articleIndex] != 0) { // Calculate the weighted score for this article score += neighbors[u].ArticleRatings[articleIndex] - ((u + 1.0) / 100.0); count++; } } if (count > 0) { score /= count; } suggestions.Add(new Suggestion(userId, art1[articleIndex].ArticleID, art1[articleIndex].ArticleName, score)); // suggestions.Add(new Suggestion(userId, ratings.ArticleIndexToID[articleIndex],ratings.Ang1[articleIndex], score)); } } suggestions.Sort((c, n) => n.Rating.CompareTo(c.Rating)); return(suggestions.Take(numSuggestions).ToList()); }
private List <UserArticleRatings> GetNearestNeighbors(UserArticleRatings user, int numUsers) { List <UserArticleRatings> neighbors = new List <UserArticleRatings>(); for (int i = 0; i < ratings.Users.Count; i++) { if (ratings.Users[i].UserID == user.UserID) { ratings.Users[i].Score = double.NegativeInfinity; } else { ratings.Users[i].Score = comparer.CompareVectors(ratings.Users[i].ArticleRatings, user.ArticleRatings); } } var similarUsers = ratings.Users.OrderByDescending(x => x.Score); return(similarUsers.Take(numUsers).ToList()); }
public void Load(string file) { ratings = new UserArticleRatingsTable(); using (FileStream fs = new FileStream(file, FileMode.Open)) using (GZipStream zip = new GZipStream(fs, CompressionMode.Decompress)) using (StreamReader r = new StreamReader(zip)) { long total = long.Parse(r.ReadLine()); int features = int.Parse(r.ReadLine()); for (long i = 0; i < total; i++) { int userId = int.Parse(r.ReadLine()); UserArticleRatings uat = new UserArticleRatings(userId, features); for (int x = 0; x < features; x++) { uat.ArticleRatings[x] = double.Parse(r.ReadLine()); } ratings.Users.Add(uat); } total = int.Parse(r.ReadLine()); for (int i = 0; i < total; i++) { ratings.UserIndexToID.Add(int.Parse(r.ReadLine())); } total = int.Parse(r.ReadLine()); for (int i = 0; i < total; i++) { ratings.ArticleIndexToID.Add(int.Parse(r.ReadLine())); } } FillTransposedRatings(); }
public List <Suggestion> GetSuggestions(int userId, int numSuggestions) { int userIndex = ratings.UserIndexToID.IndexOf(userId); UserArticleRatings user = ratings.Users[userIndex]; List <Suggestion> suggestions = new List <Suggestion>(); for (int articleIndex = 0; articleIndex < ratings.ArticleIndexToID.Count; articleIndex++) { // If the user in question hasn't rated the given article yet if (user.ArticleRatings[articleIndex] == 0) { double rating = GetRatingForIndex(userIndex, articleIndex); suggestions.Add(new Suggestion(userId, ratings.ArticleIndexToID[articleIndex], rating)); } } suggestions.Sort((c, n) => n.Rating.CompareTo(c.Rating)); return(suggestions.Take(numSuggestions).ToList()); }
public void Load(string file) { ratings = new UserArticleRatingsTable(); using (FileStream fs = new FileStream(file, FileMode.Open)) using (GZipStream zip = new GZipStream(fs, CompressionMode.Decompress)) using (StreamReader r = new StreamReader(zip)) { numUsers = int.Parse(r.ReadLine()); numArticles = int.Parse(r.ReadLine()); numFeatures = int.Parse(r.ReadLine()); double averageGlobalRating = double.Parse(r.ReadLine()); double[] userBiases = new double[numUsers]; for (int userIndex = 0; userIndex < numUsers; userIndex++) { userBiases[userIndex] = double.Parse(r.ReadLine()); } double[] articleBiases = new double[numArticles]; for (int articleIndex = 0; articleIndex < numArticles; articleIndex++) { articleBiases[articleIndex] = double.Parse(r.ReadLine()); } double[][] userFeatures = new double[numUsers][]; for (int userIndex = 0; userIndex < numUsers; userIndex++) { userFeatures[userIndex] = new double[numFeatures]; for (int featureIndex = 0; featureIndex < numFeatures; featureIndex++) { userFeatures[userIndex][featureIndex] = double.Parse(r.ReadLine()); } } double[][] articleFeatures = new double[numArticles][]; for (int articleIndex = 0; articleIndex < numUsers; articleIndex++) { articleFeatures[articleIndex] = new double[numFeatures]; for (int featureIndex = 0; featureIndex < numFeatures; featureIndex++) { articleFeatures[articleIndex][featureIndex] = double.Parse(r.ReadLine()); } } svd = new SvdResult(averageGlobalRating, userBiases, articleBiases, userFeatures, articleFeatures); for (int i = 0; i < numUsers; i++) { int userId = int.Parse(r.ReadLine()); UserArticleRatings uat = new UserArticleRatings(userId, numArticles); for (int x = 0; x < numArticles; x++) { uat.ArticleRatings[x] = double.Parse(r.ReadLine()); } ratings.Users.Add(uat); } for (int i = 0; i < numUsers; i++) { ratings.UserIndexToID.Add(int.Parse(r.ReadLine())); } for (int i = 0; i < numArticles; i++) { ratings.ArticleIndexToID.Add(int.Parse(r.ReadLine())); } } }