【问题标题】:How to find the similarity in R?如何找到R中的相似性?
【发布时间】:2020-09-20 05:09:57
【问题描述】:

我有一个如下所示的数据集:

它显示了哪家商店出售了哪本书。

df <- tribble(
 ~shop,  ~book_id,  
  "A",       1,      
  "B",       1,      
  "C",       2,      
  "D",       3,      
  "E",       3,      
  "A",       3,      
  "B",       4,      
  "C",       5,      
  "D",       1,      
)

在数据集中,

  • 店铺A卖1、3
  • 店铺B卖1、4
  • 店铺C卖2、5
  • 店铺D卖3、1
  • 店铺E只卖3个

所以现在,我想在这里计算 Jaccard 指数。例如,我们以 shop Ashop B 为例。 A 和 B 出售 三本 不同的书(书 1、书 3、书 4)。但是,两家商店只出售 一种 产品(这是产品 1)。所以,这里的Jaccard index应该是33.3% (1/3)

这是所需数据的示例:

df <- tribble(
  ~shop_1, ~shop_2, ~similarity,  
    "A",    "B",         33.3,  
    "B",    "A",         33.33,
    "A",    "C",          0,
    "C",    "A",          0,
    "A",    "D",         100,
    "D",    "A",         100,
    "A",    "E",          50,
    "E",    "A",          50,

)

非常感谢任何 cmets/协助!提前致谢。

【问题讨论】:

  • 这个问题是关于如何进行比较的数学和/或理论。为此,我建议Cross ValidatedData Science,但SO 不是问如何做到这一点的地方。如果你对一个你已经知道的函数有问题,那是一回事,但不是这个。
  • 感谢您的评论@r2evans。我想有人可能知道一个 R 包来做这个比较。这就是为什么我想写一个帖子来获得建议。如果你能暂时放下它,我会很高兴。
  • 一些问题 (1) 对于这个问题,ID 和 Type 之间的区别重要吗?例如,如果 A 店卖 1X,B 店卖 1Y,是否应该算作有些相似,而完全匹配(1X 到 1X)会更相似?您的文字说“基于book_id 的商店之间的相似性”,这表明type 与这个问题无关。如果是这种情况,我建议从您的示例数据中删除 type。 (2) 我们需要更多关于“相似性”的细节——你在这个度量中寻找什么。一些值得思考的例子......
  • 我明白,但也请注意 StackOverflow 明确尝试成为推荐引擎,根据其 off-topic 的列表,包括 “询问我们推荐或查找书籍、工具、软件库、教程”.
  • (a) 两家书店售出的图书数量如何?这确实是一个数据操作问题。那会做你想要的吗?为什么或者为什么不? (b) 或者可能是百分比重叠 - 商店 B 销售的商店 A 书籍的百分比是多少? (c) 是否需要对称? - 也就是说,每对一个分数?如果 A 店卖 5 本书,B 店卖 50 本书,包括 A 卖的所有书,你想要 A 和 B 之间的相似度一个分数,或者 A,B 得一分,B,A 得不同的分数?

标签: r machine-learning dplyr statistics


【解决方案1】:

我不了解包,但您可以编写自己的函数。我猜你所说的相似度是这样的:

similarity <- function(x, y) {
  k <- length(intersect(x, y))
  n <- length(union(x, y))
  k / n
}

然后你可以使用tidyr::crossing将同一个数据框与自身合并

dfg <- df %>% group_by(shop) %>% summarise(books = list(book_id))
crossing(dfg %>% set_names(paste0, "_A"), dfg %>% set_names(paste0, "_B")) %>% 
  filter(shop_A != shop_B) %>% 
  mutate(similarity = map2_dbl(books_A, books_B, similarity))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-19
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 2021-03-29
    • 1970-01-01
    • 2021-08-02
    相关资源
    最近更新 更多