基于mtcars数据集提取次大余弦相似度匹配车型及值的方法
解决mtcars数据集余弦相似度匹配最相似车型的问题
嘿,我来帮你搞定这个问题!你已经完成了最麻烦的部分——计算出余弦相似度矩阵,现在只需要几步就能提取出每款车最相似的车型和对应的相似度值啦。下面是具体的R代码实现步骤:
1. 确认相似度矩阵格式(若未计算可参考此步骤)
首先确保你的余弦相似度矩阵(假设命名为cos_sim_matrix)的行名和列名都是mtcars里的汽车名称,这样才能准确匹配车型。如果还没生成矩阵,可以用下面的代码完成(先标准化数据,因为余弦相似度对变量尺度敏感):
# 先安装并加载必要的包 install.packages("lsa") library(lsa) # 标准化mtcars的变量,消除尺度差异 mtcars_scaled <- scale(mtcars) # 计算余弦相似度矩阵(转置是因为cosine函数默认计算列间相似度) cos_sim_matrix <- cosine(t(mtcars_scaled))
2. 提取每款车的最相似车型及对应相似度
核心思路是:对矩阵的每一行,先把自身匹配的相似度值(1.0)替换为NA,然后找到该行的最大值(也就是排除自身后的最高相似度),并提取对应的车型名称。代码如下:
# 遍历矩阵每一行,提取目标信息 result <- t(apply(cos_sim_matrix, 1, function(x) { # 把自身匹配的1.0替换为NA,排除自身干扰 x[x == 1] <- NA # 获取该行的最高相似度值 max_sim <- max(x, na.rm = TRUE) # 找到对应车型名称(若有多个相同最大值,取第一个) similar_car <- names(which(x == max_sim)) if (length(similar_car) > 1) similar_car <- similar_car[1] # 返回车型名称和保留4位小数的相似度 c(similar_car, round(max_sim, 4)) })) # 转换为数据框并设置列名 result_df <- as.data.frame(result, stringsAsFactors = FALSE) colnames(result_df) <- c("Most_Similar_Car", "Cosine_Similarity") # 添加原车型列并调整列顺序 result_df$Car <- rownames(result_df) result_df <- result_df[, c("Car", "Most_Similar_Car", "Cosine_Similarity")] # 查看最终结果 print(result_df)
3. 结果说明
运行完代码后,result_df就是你想要的格式:
Car列:原车型名称Most_Similar_Car列:对应最相似的车型Cosine_Similarity列:排除自身匹配后的最高余弦相似度值
这样就能得到类似你图3.2的结果啦,如果遇到多个车型和目标车相似度相同的情况,代码会取第一个匹配的车型,你也可以根据需求调整这部分逻辑。
内容的提问来源于stack exchange,提问作者user208212
相关产品推荐
相关产品推荐

