用python计算调整余弦相似度
时间: 2023-11-05 08:04:43 浏览: 136
调整余弦相似度(Adjusted Cosine Similarity)是一种计算物品之间相似度的方法,通常用于推荐系统中。在Python中,可以使用以下代码来计算两个向量的调整余弦相似度:
```python
import numpy as np
def adjusted_cosine_similarity(ratings):
# 计算每个物品的平均得分
item_means = np.mean(ratings, axis=0)
# 将每个用户的得分减去对应物品的平均得分
ratings_diff = ratings - item_means
# 计算调整余弦相似度
sim = np.dot(ratings_diff.T, ratings_diff) / (np.sqrt(np.sum(ratings_diff**2, axis=0))[:, np.newaxis] * np.sqrt(np.sum(ratings_diff**2, axis=0))[np.newaxis, :])
return sim
```
其中,`ratings`是一个二维数组,表示每个用户对每个物品的评分。数组的行表示用户,列表示物品,每个元素表示该用户对该物品的评分。函数返回一个二维数组,表示物品之间的调整余弦相似度。数组的行和列表示物品,每个元素表示两个物品之间的相似度。
相关问题
调整余弦相似度的python实现
调整余弦相似度(Adjusted Cosine Similarity)是用于计算两个用户之间相似度的一种方法,它可以解决用户之间评分尺度不同的问题。下面是调整余弦相似度的Python实现:
```python
import numpy as np
def adjusted_cosine_similarity(ratings):
# 计算每个用户的评分均值
mean_ratings = np.mean(ratings, axis=1)
# 用户评分矩阵的行数和列数
m, n = ratings.shape
# 创建一个空的相似度矩阵
similarity_matrix = np.zeros((m, m))
for i in range(m):
for j in range(m):
# 取出两个用户共同评价的物品的索引
common_items = np.intersect1d(np.nonzero(ratings[i]), np.nonzero(ratings[j]))
if len(common_items) == 0:
similarity_matrix[i, j] = 0.0
else:
# 计算调整余弦相似度
num = np.sum((ratings[i, common_items] - mean_ratings[i]) * (ratings[j, common_items] - mean_ratings[j]))
den = np.sqrt(np.sum((ratings[i, common_items] - mean_ratings[i]) ** 2)) * np.sqrt(np.sum((ratings[j, common_items] - mean_ratings[j]) ** 2))
similarity_matrix[i, j] = num / den
return similarity_matrix
```
这里的`ratings`是一个$m\times n$的评分矩阵,其中$m$是用户数量,$n$是物品数量。`ratings[i,j]`表示第$i$个用户对第$j$个物品的评分。调用该函数后,会返回一个$m\times m$的相似度矩阵,其中元素$s_{i,j}$表示第$i$个用户和第$j$个用户之间的相似度。
pyspark 计算余弦相似度
在pyspark中计算余弦相似度可以使用Spark ML库中的VectorAssembler和CosineSimilarity来实现。首先,使用VectorAssembler将需要计算相似度的特征向量组合成一个向量列。然后,使用CosineSimilarity计算这些向量之间的余弦相似度。
以下是一个示例代码:
```python
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.feature import Normalizer
from pyspark.ml.linalg import Vectors
from pyspark.ml.feature import StringIndexer
from pyspark.ml.feature import IndexToString
from pyspark.ml.recommendation import ALS
from pyspark.ml.evaluation import RegressionEvaluator
from pyspark.ml.recommendation import ALSModel
from pyspark.ml import Pipeline
from pyspark.ml.feature import HashingTF, IDF
from pyspark.ml.feature import CountVectorizer
from pyspark.ml.feature import StopWordsRemover
from pyspark.ml.feature import NGram
from pyspark.ml.feature import Tokenizer
from pyspark.ml.feature import PCA
from pyspark.ml.feature import OneHotEncoder
from pyspark.ml.feature import PCA
# 创建一个DataFrame
df = spark.createDataFrame([
(0, Vectors.dense([1.0, 0.5])),
(1, Vectors.dense([2.0, 1.0])),
(2, Vectors.dense([4.0, 2.0])),
(3, Vectors.dense([6.0, 3.0]))
], ["id", "features"])
# 使用VectorAssembler将特征向量组合成一个向量列
assembler = VectorAssembler(
inputCols=["features"],
outputCol="vector"
)
output = assembler.transform(df)
# 使用CosineSimilarity计算余弦相似度
cosine_similarity = output.select("vector").crossJoin(output.select("vector")).toDF("v1", "v2").selectExpr("v1", "v2", "float(CosineSimilarity(v1, v2)) as similarity")
cosine_similarity.show()
```
这段代码中,我们首先创建一个包含特征向量的DataFrame,然后使用VectorAssembler将特征向量组合成一个向量列。接着,我们使用CosineSimilarity计算向量之间的余弦相似度。最后,我们将计算结果打印出来。
请注意,这只是一个示例代码,你需要根据你的实际数据和需求进行相应的修改和调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [Spark机器学习——余弦相似性算法](https://blog.csdn.net/a805814077/article/details/113267214)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *2* *3* [推荐系统01--余弦相似度](https://blog.csdn.net/weixin_40008870/article/details/110766812)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
阅读全文