Netflix가 이전에 보았고보고 즐겼던 영화를 기반으로 한 특정 영화를 어떻게 추천하는지 보았습니까? 나는 똑같은 일을하려하지만 일련의 책들을 위해 노력하고있다.이 방법으로 여러 책의 친밀도를 계산하려면 어떻게해야합니까?
53 권의 도서와 32 명의 사용자가 있습니다. 32 명의 사용자가 5 권에서 5 권 사이의 책을 평가했으며 5 권은 내가 좋아하는 책이었습니다. 서로가에 다음과 같이 사용되는 공식은 두 권의 책을 비교하는 방법 "유사한"계산하기 :
x1*y1
책 x와 책 Y의 사용자가 하나의 등급을 나타냅니다, x2*y2
이 2 사용자의 등급에 나타냅니다 모든 사용자를 위해 계속되는 동일한 2 권의 책.
이 메서드에 전달되는 배열은 주 배열입니다. 주 배열의 각 요소는 사용자에 해당하고 사용자 배열의 각 요소는 책에 해당합니다. (각각 32 개의 사용자 배열, 각 요소는 53 요소 배열 임)
각 사용자의 등급을 보유하는 배열은 첫 번째 사용자의 첫 번째 사용자 등급을 나타내는 compValuehold[0][0]
이고 첫 번째 사용자 등급은 compValuehold[0][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;
}
}
첫 번째 책과 나머지 책을 비교할 수있는 코드를 작성할 수 있습니다. 제 문제는 각 책이 가장 유사한 책을 찾아야한다는 것입니다. 이는 수식을 여러 번 계산한다는 의미입니다. 모든 책에서이 작업을 수행하는 방법을 모르겠습니다.
예. @dckrooney. 이 말이 맞습니다. 코사인 유사성. 나는 for 루프에 어려움을 겪고있다. 나는 거의 이것을 가지고있다. 그러나 for 루프를 적절하게 가져와 아마도 다른 가변 배열을 소개 할 필요가 있지만, 내 머리 속의 구현은 headaching이다. –
해결할 수 있도록 코드의 변경 사항을 제안 할 수 있습니까? 나는 somehwhere와 다른 지그재그 배열을위한 루프가 필요하다고 생각한다. –
이 코드를 작성해 주셔서 감사합니다. 나는 당신의 코드를보기 전에 작동 시켰고, 내가 한 것은 지그재그 배열을 가진 루프를 3 개 사용했다는 것이다. 귀하의 솔루션은 아마도 조직 된 고장 때문에 더 이해할 수 있습니다. –