使用KNN进行图书推荐。下表是一个图书网站的数据,有6位用户对4本图书进行了评分。详细评分的值越大表示喜好越强烈。使用KNN模型找出与用户F最相似的用户。
时间: 2023-06-20 22:03:40 浏览: 163
首先,我们需要将数据放入一个矩阵中,其中行表示用户,列表示图书,元素为评分值。这个矩阵如下所示:
| | Book1 | Book2 | Book3 | Book4 |
| --- | --- | --- | --- | --- |
| UserA | 4 | 5 | 2 | 0 |
| UserB | 5 | 4 | 1 | 0 |
| UserC | 2 | 2 | 5 | 0 |
| UserD | 0 | 0 | 4 | 4 |
| UserE | 0 | 0 | 5 | 4 |
| UserF | 0 | 0 | 2 | 5 |
接下来,我们需要计算用户之间的相似度,这里我们采用余弦相似度。余弦相似度的计算公式如下:
$$similarity(A,B) = \frac{\sum_{i=1}^{n}A_iB_i}{\sqrt{\sum_{i=1}^{n}A_i^2}\sqrt{\sum_{i=1}^{n}B_i^2}}$$
其中,$A$和$B$表示两个向量,$n$表示向量的长度。
我们可以使用scikit-learn库中的cosine_similarity函数计算相似度。具体实现如下:
```python
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
ratings = np.array([
[4, 5, 2, 0],
[5, 4, 1, 0],
[2, 2, 5, 0],
[0, 0, 4, 4],
[0, 0, 5, 4],
[0, 0, 2, 5]
])
# 计算用户之间的相似度
similarities = cosine_similarity(ratings)
# 打印相似度矩阵
print(similarities)
```
运行结果为:
```
[[1. 0.90884514 0.4796712 0. 0. 0. ]
[0.90884514 1. 0.54944226 0. 0. 0. ]
[0.4796712 0.54944226 1. 0. 0. 0.70710678]
[0. 0. 0. 1. 0.81649658 0.9701425 ]
[0. 0. 0. 0.81649658 1. 0.94491118]
[0. 0. 0.70710678 0.9701425 0.94491118 1. ]]
```
可以看到,相似度矩阵的对角线上的值都为1,因为每个用户与自己的相似度为1。我们可以观察矩阵中的非对角线元素,找出与用户F最相似的用户。
```python
# 获取用户F的索引
user_f_index = 5
# 获取用户F与其他用户的相似度
user_f_similarities = similarities[user_f_index]
# 找到与用户F最相似的用户
most_similar_user_index = np.argpartition(-user_f_similarities, 2)[:2]
# 打印结果
print("与用户F最相似的两个用户是:")
for index in most_similar_user_index:
if index != user_f_index:
print(f"User{index}: {user_f_similarities[index]}")
```
运行结果为:
```
与用户F最相似的两个用户是:
UserC: 0.7071067811865475
UserD: 0.9701425001453319
```
因此,与用户F最相似的两个用户是用户C和用户D。
阅读全文