下面是一个交易数据集,请使用余弦相似度,计算任意两个用户之间的相似度
时间: 2025-06-21 14:29:01 浏览: 8
### 使用 Python 和 R 计算交易数据集中用户间余弦相似度
#### Python 实现
为了计算交易数据集中任意两位用户间的余弦相似度,可以采用 `scipy` 或者 `sklearn` 库来实现这一目标。下面展示了一个基于这两个库的方法。
首先安装并导入所需的包:
```python
import numpy as np
from sklearn.preprocessing import StandardScaler
from scipy.spatial.distance import cosine
from sklearn.metrics.pairwise import cosine_similarity
```
假设有一个简单的交易矩阵,其中每一行代表一位用户的购买记录,而列则对应不同的商品种类。这里创建一个模拟的数据集作为例子:
```python
# 创建示例交易数据集 (用户 vs 商品)
transactions = np.array([
[5, 3, 0, 1],
[4, 0, 0, 1],
[1, 1, 0, 5],
[1, 0, 0, 4],
[0, 1, 5, 4],
])
```
标准化处理这些数据是非常重要的一步,因为不同尺度下的特征可能会影响最终的结果[^1]。使用 `StandardScaler` 对原始数据进行预处理:
```python
scaler = StandardScaler()
scaled_transactions = scaler.fit_transform(transactions)
```
现在可以选择两种方式之一来计算余弦相似度:一种是通过 `scipy.spatial.distance.cosine` 函数逐对比较;另一种则是利用 `sklearn.metrics.pairwise.cosine_similarity` 来一次性获得整个矩阵内的所有成对比结果。
方法一:单独计算每一对用户之间的余弦相似度
```python
def compute_cosine_sim(user_a, user_b):
"""Compute the cosine similarity between two users."""
return 1 - cosine(user_a, user_b)
user_pair_similarity = []
for i in range(len(scaled_transactions)):
for j in range(i + 1, len(scaled_transactions)):
sim = compute_cosine_sim(scaled_transactions[i], scaled_transactions[j])
print(f"Cosine Similarity between User {i} & User {j}: {sim}")
user_pair_similarity.append((f"{i}-{j}", sim))
```
方法二:批量计算所有用户组合的余弦相似度
```python
pairwise_similarities = cosine_similarity(scaled_transactions)
print("Pairwise Cosine Similarities:\n", pairwise_similarities)
```
#### R 实现
同样地,在R语言中也可以很容易地完成这项工作。以下是相应的代码片段:
```r
library(proxy) # 提供了多种距离测量函数,包括cosine distance/similarity
library(dplyr)
# 构建类似的交易数据框
transaction_df <- data.frame(
item1=c(5,4,1,1,0),
item2=c(3,0,1,0,1),
item3=c(0,0,0,0,5),
item4=c(1,1,5,4,4))
rownames(transaction_df) <- paste('User', seq_len(nrow(transaction_df)))
# 计算两两之间的余弦相似度
cosine_matrix <- dist(t(as.matrix(transaction_df)), method="cosine")
# 将其转换为更容易理解的形式
as.dist(cosine_matrix) %>%
as.matrix() -> cos_sim_mat
diag(cos_sim_mat) <- NA # 设置自相关系数为空值以便更好地查看其他位置上的关联程度
print(round(cos_sim_mat, digits=2)) # 输出保留两位小数后的结果
```
上述过程展示了如何在Python和R环境中分别计算给定交易数据集中各用户之间的余弦相似度。值得注意的是,实际应用时应当考虑更多因素,比如缺失值填充策略以及是否需要进一步优化性能等问题。
阅读全文
相关推荐


















