// 计算推荐电影 let recommendedMovies = []; for (let movie of moviesCollection.find({})) { let score = ; for (let user of similarUsers) { if (user.ratings.hasOwnProperty(movie.id)) { score += user.ratings[movie.id] * cosineSimilarity(user.vector, targetUser.vector); } } recommendedMovies.push({ movie: movie, score: score }); }
// 根据分数排序,返回前N个电影 recommendedMovies.sort((a, b) => b.score - a.score).slice(, 10);
// 连接MongoDB数据库
const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017/myproject';
const client = new MongoClient(url, { useNewUrlParser: true });
client.connect(function(err) {
console.log("Connected successfully to server");
const db = client.db();
const usersCollection = db.collection('users');
const moviesCollection = db.collection('movies');
// 读取用户历史评分数据
const userRatings = Array.from(await usersCollection.find({}).toArray());
// 确定目标用户和相似用户
const targetUser = userRatings[];
const similarUsers = userRatings.slice(1).filter(u => cosineSimilarity(u.vector, targetUser.vector) > .5).slice(, 5);
// 计算推荐电影
let recommendedMovies = [];
for (let movie of moviesCollection.find({})) {
let score = ;
for (let user of similarUsers) {
if (user.ratings.hasOwnProperty(movie.id)) {
score += user.ratings[movie.id] * cosineSimilarity(user.vector, targetUser.vector);
}
}
recommendedMovies.push({ movie: movie, score: score });
}
// 根据分数排序,返回前N个电影
recommendedMovies.sort((a, b) => b.score - a.score).slice(, 10);
// 将结果存入MongoDB数据库
const recommendationsCollection = db.collection('recommendations');
await recommendationsCollection.insertMany(recommendedMovies);
});
// 计算两个向量的余弦相似度
function cosineSimilarity(a, b) {
let dotProduct = , normA = , normB = ;
for (let i = ; i a.length; i++) {
dotProduct += a[i] * b[i];
normA += a[i] * a[i];
normB += b[i] * b[i];
}
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
}
```
举报 0