2

複数の数値 (0 ~ 100%) の類似性を計算できるアルゴリズムの実装を探しています。

これは映画データベースのシナリオの 1 つです。ユーザー プロファイルには、ユーザーの映画の好みに関する情報が含まれています。これは、1 ~ 10 の値を含む 3 つの属性 (アクション、ドラマ、または漫画がどれくらい好きか) を使用して保存されます (10 はとても好きです)。各映画で、同様の値が見つかります (つまり、ターミネーター アクション = 10、ドラマ = 5、カートゥーン = 1)。

ここで、ユーザーの好みが映画の好みとどの程度一致するかを計算したいと思います。あなたの提案は何ですか?(これはC#で作成されています)

よろしく

4

3 に答える 3

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) になり、練習のようです。

于 2013-08-12T10:57:59.347 に答える
0

典型的なソリューションでは、さまざまな類似性尺度 (コサイン、ピアソン、マンハッタンなど) が使用されます。Toby Segaran の"Programming Collective Intelligence"ですべてが美しくカバーされています。

于 2013-08-12T11:26:13.117 に答える
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)
于 2013-08-12T11:03:02.203 に答える