.net core协同过滤算法实现完整代码
时间: 2023-10-09 20:11:31 浏览: 78
以下是一个简单的基于 .NET Core 的协同过滤算法实现示例:
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
namespace CollaborativeFiltering
{
public class Rating
{
public int UserId { get; set; }
public int ItemId { get; set; }
public double Score { get; set; }
}
public class CollaborativeFiltering
{
private List<Rating> ratings;
public CollaborativeFiltering(List<Rating> ratings)
{
this.ratings = ratings;
}
public double Predict(int userId, int itemId)
{
// 找到所有用户对该物品的评分
var itemRatings = ratings.Where(r => r.ItemId == itemId).ToList();
// 找到所有评价者对该物品的评分的用户
var users = itemRatings.Select(r => r.UserId).Distinct();
// 找到相似度最高的用户
var similarities = new Dictionary<int, double>();
foreach (var user in users)
{
var userSimilarity = CalculateSimilarity(userId, user);
similarities[user] = userSimilarity;
}
var mostSimilarUser = similarities.OrderByDescending(x => x.Value).First().Key;
// 返回最相似用户的评分作为预测值
var prediction = ratings.FirstOrDefault(r => r.UserId == mostSimilarUser && r.ItemId == itemId)?.Score;
return prediction ?? 0;
}
private double CalculateSimilarity(int user1Id, int user2Id)
{
// 找到两个用户评价过的所有物品
var user1Items = ratings.Where(r => r.UserId == user1Id).Select(r => r.ItemId).ToList();
var user2Items = ratings.Where(r => r.UserId == user2Id).Select(r => r.ItemId).ToList();
// 找到两个用户都评价过的物品
var commonItems = user1Items.Intersect(user2Items);
// 计算两个用户对这些物品评分的差值
var differences = new List<double>();
foreach (var item in commonItems)
{
var user1Rating = ratings.FirstOrDefault(r => r.UserId == user1Id && r.ItemId == item)?.Score ?? 0;
var user2Rating = ratings.FirstOrDefault(r => r.UserId == user2Id && r.ItemId == item)?.Score ?? 0;
differences.Add(user1Rating - user2Rating);
}
// 计算两个用户评分差值的平方和
var sumOfSquares = differences.Sum(d => d * d);
// 返回相似度
return 1 / (1 + Math.Sqrt(sumOfSquares));
}
}
}
```
上述代码中,`Rating` 类表示用户对物品的评分,`CollaborativeFiltering` 类封装了协同过滤算法的实现,包括预测用户对物品的评分和计算用户之间的相似度。在 `Predict` 方法中,我们首先找到所有用户对该物品的评分,然后找到所有评价者对该物品的评分的用户,并计算这些用户与当前用户的相似度。最后,返回相似度最高的用户的评分作为预测值。
在 `CalculateSimilarity` 方法中,我们首先找到两个用户评价过的所有物品,然后找到两个用户都评价过的物品,并计算这些物品上两个用户评分的差值。最后,我们计算两个用户评分差值的平方和,并返回相似度。
需要注意的是,这只是一个简单的协同过滤算法的实现示例,实际应用中还需要考虑一些问题,比如数据稀疏性、冷启动问题等。
阅读全文