用java写一段推荐算法
时间: 2023-07-19 15:14:49 浏览: 42
好的,这里给出一个简单的基于内容的推荐算法的Java代码示例:
```java
import java.util.*;
public class ContentBasedRecommendation {
// 物品特征向量
private static final Map<String, double[]> itemFeatures = new HashMap<String, double[]>() {{
put("item1", new double[]{0.8, 0.5, 0.2});
put("item2", new double[]{0.4, 0.7, 0.6});
put("item3", new double[]{0.3, 0.2, 0.9});
put("item4", new double[]{0.6, 0.3, 0.5});
put("item5", new double[]{0.1, 0.8, 0.4});
}};
// 用户历史行为和偏好数据
private static final Map<String, List<String>> userBehavior = new HashMap<String, List<String>>() {{
put("user1", Arrays.asList("item1", "item2", "item3"));
put("user2", Arrays.asList("item1", "item4", "item5"));
put("user3", Arrays.asList("item2", "item3", "item5"));
}};
/**
* 基于内容的推荐算法
* @param user 用户名
* @return 推荐的物品列表
*/
public static List<String> contentBasedRecommendation(String user) {
List<String> items = new ArrayList<>();
double[] userVector = getUserVector(user);
for (Map.Entry<String, double[]> entry : itemFeatures.entrySet()) {
String item = entry.getKey();
double[] itemVector = entry.getValue();
double similarity = cosineSimilarity(userVector, itemVector);
if (similarity > 0.5) { // 相似度阈值
items.add(item);
}
}
return items;
}
/**
* 获取用户特征向量
* @param user 用户名
* @return 用户特征向量
*/
private static double[] getUserVector(String user) {
List<String> history = userBehavior.get(user);
double[] userVector = new double[itemFeatures.size()];
Arrays.fill(userVector, 0.0);
for (String item : history) {
double[] itemVector = itemFeatures.get(item);
for (int i = 0; i < itemVector.length; i++) {
userVector[i] += itemVector[i];
}
}
return userVector;
}
/**
* 计算余弦相似度
* @param vector1 向量1
* @param vector2 向量2
* @return 余弦相似度
*/
private static double cosineSimilarity(double[] vector1, double[] vector2) {
double dotProduct = 0.0;
double norm1 = 0.0;
double norm2 = 0.0;
for (int i = 0; i < vector1.length; i++) {
dotProduct += vector1[i] * vector2[i];
norm1 += vector1[i] * vector1[i];
norm2 += vector2[i] * vector2[i];
}
return dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2));
}
public static void main(String[] args) {
List<String> items = contentBasedRecommendation("user1");
System.out.println("Recommended items for user1: " + items);
}
}
```
在这个示例中,我们使用了一个包含5个物品的特征向量和3个用户的历史行为和偏好数据。在`contentBasedRecommendation()`方法中,我们计算了用户的特征向量,并根据余弦相似度和相似度阈值(这里设为0.5)来推荐物品。最后在`main()`方法中演示了对`user1`的推荐结果。