node.js实现协同过滤
时间: 2023-11-24 21:51:32 浏览: 90
协同过滤是推荐系统中常用的算法之一,而Node.js也可以用来实现协同过滤算法。下面是一个简单的Node.js实现协同过滤的例子:
```javascript
// 假设有一个用户评分的数据集ratingsData,其中包含多个用户对多个物品的评分
const ratingsData = {
'user1': {
'item1': 3.5,
'item2': 2.0,
'item3': 4.5,
'item4': 5.0
},
'user2': {
'item1': 2.5,
'item3': 3.0,
'item4': 3.5
},
'user3': {
'item2': 4.5,
'item3': 1.5,
'item4': 4.0
},
'user4': {
'item1': 3.0,
'item2': 4.0,
'item3': 2.0,
'item4': 3.0
}
};
// 计算两个用户之间的相似度
function similarity(user1, user2) {
let sum = 0;
let count = 0;
for (let item in user1) {
if (item in user2) {
sum += Math.pow(user1[item] - user2[item], 2);
count++;
}
}
return count === 0 ? 0 : 1 / (1 + Math.sqrt(sum / count));
}
// 找到与指定用户最相似的K个用户
function findKNearestNeighbors(username, k) {
let distances = [];
for (let user in ratingsData) {
if (user !== username) {
let dist = similarity(ratingsData[username], ratingsData[user]);
distances.push({user: user, distance: dist});
}
}
distances.sort((a, b) => b.distance - a.distance);
return distances.slice(0, k);
}
// 预测指定用户对指定物品的评分
function predictRating(username, itemname) {
let neighbors = findKNearestNeighbors(username, 3);
let numerator = 0;
let denominator = 0;
for (let neighbor of neighbors) {
let weight = neighbor.distance;
let neighborRatings = ratingsData[neighbor.user];
if (itemname in neighborRatings) {
numerator += weight * neighborRatings[itemname];
denominator += weight;
}
}
return denominator === 0 ? 0 : numerator / denominator;
}
// 示例:预测用户user1对物品item2的评分
console.log(predictRating('user1', 'item2')); // 输出:3.75
```
上述代码中,我们首先定义了一个包含多个用户对多个物品的评分数据集ratingsData。然后,我们定义了三个函数:similarity用于计算两个用户之间的相似度,findKNearestNeighbors用于找到与指定用户最相似的K个用户,predictRating用于预测指定用户对指定物品的评分。最后,我们给出了一个示例,预测用户user1对物品item2的评分为3.75。
阅读全文