我正在寻找一种可以计算多个数字(0-100%)相似度的算法。
这是电影数据库的一种情况:用户配置文件包含有关用户电影偏好的信息。这是使用三个属性(我有多喜欢动作、戏剧或卡通)存储的,其中包含 1-10 之间的值(10 是我非常喜欢它)。在每部电影中,您都会发现相似的值(即终结者动作 = 10,戏剧 = 5,卡通 = 1)。
现在我想计算用户的偏好与电影偏好的匹配程度。你有什么建议?(这是用 C# 制作的)
问候
我正在寻找一种可以计算多个数字(0-100%)相似度的算法。
这是电影数据库的一种情况:用户配置文件包含有关用户电影偏好的信息。这是使用三个属性(我有多喜欢动作、戏剧或卡通)存储的,其中包含 1-10 之间的值(10 是我非常喜欢它)。在每部电影中,您都会发现相似的值(即终结者动作 = 10,戏剧 = 5,卡通 = 1)。
现在我想计算用户的偏好与电影偏好的匹配程度。你有什么建议?(这是用 C# 制作的)
问候
public static double SingleSimilarity(double x, double y)
{
return (10.0 - Math.Abs(x - y)) * 10.0;
}
// 3 values of user preferences, 3 values of movie assessment
public static double Similarity(Tuple<double, double, double> user, Tuple<double, double, double> movie)
{
return (SingleSimilarity(user.Item1, movie.Item1) + SingleSimilarity(user.Item2, movie.Item2) + SingleSimilarity(user.Item3, movie.Item3)) / 3.0;
}
例子:
var similarity = Similarity(Tuple.Create(10.0, 0.0, 5.0), Tuple.Create(0.0, 10.0, 5.0));
或更通用的方法:
// 3 items (Action, Drama, Cartoon) each of which contain a value for user and movie
public static double Similarity(IEnumerable<Tuple<double, double>> list)
{
return list.Sum(t => SingleSimilarity(t.Item1, t.Item2)) / list.Count();
}
和例子:
var similarity = Similarity(new[] { Tuple.Create(10.0, 0.0), Tuple.Create(0.0, 10.0), Tuple.Create(5.0, 5.0) });
在这种情况下,结果将是 33.(3) 并且似乎是实践。
典型的解决方案使用不同的相似性度量(例如,余弦、皮尔逊、曼哈顿等)。Toby Segaran 的“编程集体智能”对所有这些都进行了精美的介绍。
这个怎么样:
var metric = (movie.actionMetric - user.actionPreference) + (movie.dramaMetric - user.dramaPreference) + (moview.cartoonMetric - user.cartoonPreference)
这个简单的算法可以在数据库查询中完成(这通常很重要),并且人们对它的偏好越高,吐出的数字越小,您还可以将值转换为百分比(1/metric) x 100
。您还可以相当轻松地对算法进行加权,例如,如果您认为“卡通”指标不如戏剧或动作那么重要:
var metric = (movie.actionMetric - user.actionPreference) + (movie.dramaMetric - user.dramaPreference) + 0.5 * (moview.cartoonMetric - user.cartoonPreference)