以前に見て楽しんだ映画に基づいて、Netflixが特定の映画をどのように推奨するかを見たことがありますか? 私は同じことをしようとしていますが、本のセットです。
53 冊の本と 32 人のユーザーがいます。32 人のユーザーが各本を 5 から -5 のスケールで評価しました。5 はとても気に入りました。2 冊の本がどのように「似ている」かを計算するために使用される式は、次のとおりです。
x1*y1
は本 x と本 y に対するユーザー 1 の評価をx2*y2
表し、同じ 2 本に対する 2 番目のユーザーの評価を表し、すべてのユーザーについて続きます。
このメソッドに渡される配列はメイン配列です。メイン配列の各要素はユーザーに対応し、ユーザー配列の各要素は本に対応します。(32 個のユーザー配列。それぞれが 53 要素の配列です)
各ユーザーの評価を保持する配列はcompValuehold[0][0]
、最初の本に対するcompValuehold[0][2]
最初のユーザーの評価を表し、2 番目の本に対する最初のユーザーの評価を表すなどの順序で並んでいます。
public static void DisplayRatings(double[][] compValuehold)
{
double eachUserProduct = 0;
double denominatorXSum = 0;
double denominatorYSum = 0;
double Score = 0;
int counterForScore = 0;
double[] calculatedValues = new double[52];
//this for loop should calculate each book's ratings and store it
//in an array
for (int i = 0; i < 52; i++)
{
for (int j = 0; j < 32; j++)
{
eachUserProduct += compValuehold[j][i] * compValuehold[j][i + 1];
denominatorXSum += compValuehold[j][i] * compValuehold[j][i];
denominatorYSum += compValuehold[j][i + 1] * compValuehold[j][i + 1];
}
denominatorXSum = Math.Sqrt(denominatorXSum);
denominatorYSum = Math.Sqrt(denominatorYSum);
Score = eachUserProduct / (denominatorXSum * denominatorYSum);
calculatedValues[counterForScore] = Score;
counterForScore += 1;
denominatorXSum = 0;
denominatorYSum = 0;
eachUserProduct = 0;
}
}
最初の本と残りの本を比較するコードを書くことができます。私の問題は、各本について、どの本が最も似ているかを調べる必要があることです。これは、その式を何度も計算することを意味します。すべての本でこれを行う方法がわかりません。