tests/testthat/test-dissimilarity.R

library("testthat")
library("recommenderlab")

set.seed(1234)

context("dissimilarity")

# check structure
db <- matrix(
  as.numeric(sample(
    c(NA, 0:5), 100, replace = TRUE,
    prob = c(.7, rep(.3 / 6, 6))
  )),
  nrow = 10,
  ncol = 10,
  dimnames = list(
    users = paste('u', 1:10, sep = ''),
    items = paste('i', 1:10, sep = '')
  )
)

x <- as(db, "realRatingMatrix")

s <- similarity(x)
expect_is(s, "dist")
expect_equal(attr(s, "Size"), nrow(x))

s <- similarity(x, x)
expect_is(s, "crossdist")
expect_equal(dim(s), c(nrow(x), nrow(x)))

# which = "items"
s <- similarity(x, which = "items")
expect_is(s, "dist")
expect_equal(attr(s, "Size"), ncol(x))

s <- similarity(x, x, which = "items")
expect_is(s, "crossdist")
expect_equal(dim(s), c(ncol(x), ncol(x)))

## min_matching, min_predictive
s_cd <- similarity(x, x, min_matching = 2, min_predictive = 1)
s_d <- similarity(x, min_matching = 2, min_predictive = 1)
expect_equivalent(as.vector(s_cd[lower.tri(s_cd)]), as.vector(s_d))

# TODO: write a test
similarity(
  x,
  x,
  which = "items",
  min_matching = 0,
  min_predictive = 0
)
similarity(
  x,
  x,
  which = "items",
  min_matching = 2,
  min_predictive = 0
)
similarity(
  x,
  x,
  which = "items",
  min_matching = 2,
  min_predictive = 1
)

## Test measures
compn <- function(x, n = 3)
  round(as.vector(x), n)
sim2sim <- function(x)
  (x + 1) / 2

## realRatingMatrix
x <- rbind(c(1,-1), c(-1, 1))
x
rating <- as(matrix(x, ncol = 2), "realRatingMatrix")
rating

# Cosine
ibcf <- Recommender(rating,
  method = 'IBCF',
  parameter = list(method = 'cosine',
    k = 1))

# this is between items
d <- 2
expect_equal(as(ibcf@model$sim, "matrix")[1, 2], sim2sim(1 - d))
# same as: 1 - proxy::dist(t(x), method = "cosine")
expect_equal(compn(dissimilarity(
  rating, method = "cosine", which = "items"
)), d)
expect_equal(compn(similarity(
  rating, method = "cosine", which = "items"
)), sim2sim(1 - d))

# this is between users
d <- 2
expect_equal(compn(dissimilarity(rating, method = "cosine")), d)
expect_equal(compn(similarity(rating, method = "cosine")), sim2sim(1 - d))

# Others
d <- 2
expect_equal(compn(dissimilarity(rating, method = "pearson")), 2)
expect_equal(compn(similarity(rating, method = "pearson")), sim2sim(1 - d))
expect_equal(compn(dissimilarity(
  rating, method = "pearson", which = "items"
)), 2)
expect_equal(compn(similarity(
  rating, method = "pearson", which = "items"
)), sim2sim(1 - d))

# only between items
# TODO: Make sure these are correct. Especially conditional!!!
#expect_equal(compn(dissimilarity(
#  rating, method = "karypis", which = "items"
#)), 1)
expect_equal(compn(dissimilarity(
  rating, method = "conditional", which = "items"
)), 0)

## binaryRatingMatrix

x <- rbind(c(1, 0), c(0, 1), c(1, 1), c(1, 0))
x
rating <- as(matrix(x, ncol = 2), "binaryRatingMatrix")
rating

# Cosine
ibcf <- Recommender(rating,
  method = 'IBCF',
  parameter = list(method = 'cosine',
    k = 1))

d <- 0.5917517
expect_equal(compn(as(ibcf@model$sim, "matrix")[1, 2]), compn(sim2sim(1 -
    d)))
# same as: 1 - proxy::dist(t(x), method = "cosine")

expect_equal(compn(dissimilarity(
  rating, method = "cosine", which = "items"
)), compn(d))
expect_equal(compn(similarity(
  rating, method = "cosine", which = "items"
)), compn(sim2sim(1 - d)))

# this is between users
d <- c(1.000, 0.293, 0.000, 0.293, 1.000, 0.293)
expect_equal(compn(dissimilarity(rating, method = "cosine")), d)
expect_equal(compn(similarity(rating, method = "cosine")), compn(sim2sim(1 -
    d)))

# Others
res <- c(1.0, 0.5, 0.0, 0.5, 1.0, 0.5)
expect_equal(compn(dissimilarity(rating, method = "jaccard")), res)
expect_equal(compn(dissimilarity(
  rating, method = "jaccard", which = "items"
)), 0.75)

# only between items
# TODO: Make sure these are correct. Especially conditional!!!
#expect_equal(compn(dissimilarity(
#  rating, method = "karypis", which = "items"
#)), 0.826)
expect_equal(compn(dissimilarity(
  rating, method = "conditional", which = "items"
)), 0.667)

Try the recommenderlab package in your browser

Any scripts or data that you put into this service are public.

recommenderlab documentation built on Sept. 20, 2023, 9:06 a.m.