Скорректированное косинусное сходство

Я пытаюсь закодировать скорректированное косинусное сходство в PHP.

Я построил свои данные следующим образом:

$data[UserID][ItemID] = Rating

пример данных:

$data[1][1] = 5;
$data[1][2] = 3;
$data[1][3] = 4;

$data[2][1] = 3;
$data[2][2] = 2;
$data[2][4] = 3;
$data[2][5] = 3;

$data[3][1] = 4;
$data[3][3] = 3;
$data[3][5] = 5;

$data[4][1] = 1;
$data[4][2] = 4;
$data[4][4] = 2;
$data[4][5] = 1;

$data[5][3] = 4;
$data[5][4] = 3;

Я хочу написать функцию для вычисления скорректированного косинуса двух элементов, например

adjusted_cosine(itemID1,itemID2)

person user413266    schedule 06.08.2010    source источник
comment
Извини друг. Мы здесь не для того, чтобы писать код за вас. Если вы сначала попробуете собрать это вместе, возможно, мы сможем помочь исправить это.   -  person treeface    schedule 06.08.2010
comment
хе-хе, это не домашнее задание. Я просто хочу создать рекомендательную систему в своей сети. Но я строю только подобие Пирсона. Но во многих источниках говорится, что скорректированный косинус лучше, чем Пирсон. Но спасибо за ваш комментарий. Я ценю это. :D   -  person user413266    schedule 06.08.2010


Ответы (1)


Я думаю, что это должно сделать это:

sim(i,j) {
    item1 = 0
    item2 = 0

    // calculate the sums for the ith and jth items
    // minus each users' avg rating.
    for (k = 0; k < length(data); k++) {
        item1 += (data[k][i] - avg(data[k]))
        item2 += (data[k][j] - avg(data[k]))
    }

    result (item1*item2)/(sqrt(item1*item1)*sqrt(item2*item2))
    return result
}

Вам все равно нужно будет реализовать среднюю функцию, но я полагаю, что для этого подойдет простое среднее значение.

person Matti Lyra    schedule 06.08.2010
comment
Обратите внимание, что простое среднее значение по i и j преобразует это сходство в корреляционную функцию Пирсона. - person Medeiros; 26.06.2013