数字相似度算法

时间:2013-08-12 10:47:20

标签: c# math similarity

我正在寻找一种可以计算几个数字(0-100%)相似度的算法。

这是电影数据库的一种情况: 用户配置文件包含有关用户电影首选项的信息。这是使用三个属性(我多喜欢动作,戏剧或卡通)存储,包含1-10之间的值(10是我喜欢它的很多)。在每部电影中你会发现类似的值(即终结者行动= 10,戏剧= 5,卡通= 1)。

现在我想计算一下用户的偏好与电影偏好的匹配程度。你有什么建议? (这是用C#制作的)

此致

3 个答案:

答案 0 :(得分:0)

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)并且似乎是练习。

答案 1 :(得分:0)

怎么样:

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)

答案 2 :(得分:0)

典型的解决方案使用不同的相似性度量(例如余弦,皮尔森,曼哈顿等)。在Toby Segaran的"Programming Collective Intelligence"中,它们都被很好地覆盖。