2010-08-06 8 views
0

Я пытаюсь ввести код adjusted cosine similarity в 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; 

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

adjusted_cosine(itemID1,itemID2) 
+2

Похоже, домашнее задание для меня. –

+0

Извините, приятель. Мы не здесь, чтобы написать ваш код для вас. Если вы сначала попытаетесь собрать это вместе, мы сможем его исправить. – treeface

+1

hehehe, это не домашнее задание. Я просто хочу создать систему рекомендаций в своей сети. Но я только построил сходство с пирсоном. Но во многих источниках, которые говорят, что скорректированный косинус лучше, чем pearson. Благодарю вас за ваш комментарий. Я буду оценивать это. : D – user413266

ответ

2

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

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 
} 

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

+0

большое спасибо maffel. Я попробую. : D – user413266

+0

Обратите внимание, что простое среднее значение по i и j преобразует это сходство в корреляционной функции Пирсона. – Medeiros