Взвешенный наклон один алгоритм? (портирующий от Python до R)

private - инкапсуляции в классе / scope / struct ect '.

внутренняя - герметизация в сборках.

7
задан Charles 9 December 2013 в 05:13
поделиться

1 ответ

Некоторое время назад я использовал ту же ссылку (код Python Брайана О'Салливана) для написания R-версии Slope One. Я вставляю приведенный ниже код на случай, если он поможет.

predict <- function(userprefs, data.freqs, data.diffs) {
    seen <- names(userprefs)

    preds <- sweep(data.diffs[ , seen, drop=FALSE], 2, userprefs, '+') 
    preds <- preds * data.freqs[ , seen]
    preds <- apply(preds, 1, sum)

    freqs <- apply(data.freqs[ , seen, drop=FALSE], 1, sum)

    unseen <- setdiff(names(preds), seen)
    result <- preds[unseen] / freqs[unseen]
    return(result[is.finite(result)])
}

update <- function(userdata, freqs, diffs) {
    for (ratings in userdata) {
        items <- names(ratings)
        n <- length(ratings)

        ratdiff <- rep(ratings, n) - rep(ratings, rep(n, n))
        diffs[items, items] <- diffs[items, items] + ratdiff

        freqs[items, items] <- freqs[items, items] + 1
    }
    diffs <- diffs / freqs
    return(list(freqs=freqs, diffs=diffs))
}


userdata <- list(alice=c(squid=1.0, cuttlefish=0.5, octopus=0.2),
                 bob=c(squid=1.0, octopus=0.5, nautilus=0.2),
                 carole=c(squid=0.2, octopus=1.0, cuttlefish=0.4, nautilus=0.4),
                 dave=c(cuttlefish=0.9, octopus=0.4, nautilus=0.5))

items <- c('squid', 'cuttlefish', 'nautilus', 'octopus')
n.items <- length(items)
freqs <- diffs <- matrix(0, nrow=n.items, ncol=n.items, dimnames=list(items, items))

result <- update(userdata, freqs, diffs)
print(result$freqs)
print(result$diffs)

userprefs <- c(squid=.4)
predresult <- predict(userprefs, result$freqs, result$diffs)
print(predresult)
9
ответ дан 7 December 2019 в 03:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: