Вычисление сходства -> Python-код для PHP-кода - Что не так? - PullRequest
0 голосов
/ 07 мая 2011

Я пытаюсь преобразовать следующий код Python в код PHP. Можете ли вы объяснить мне, что не так в моем коде PHP, потому что я не получаю те же результаты. Если вам нужны примеры данных, пожалуйста, дайте мне знать.

# Returns a distance-based similarity score for person1 and person2

def sim_distance(prefs,person1,person2):
    # Get the list of shared_items 
    si={} 
    for item in prefs[person1]:
        if item in prefs[person2]: si[item]=1
    # if they have no ratings in common, return 0 
    if len(si)==0: return 0

    # Add up the squares of all the differences 

    sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2)
        for item in prefs[person1] if item in prefs[person2]]) 

    return 1/(1+sum_of_squares)

Мой код PHP:

$sum  = 0.0;

foreach($arr[$person1] as $item => $val)
{
    if(array_key_exists($item, $arr[$person2]))
    {
        $p = sqrt(pow($arr[$person1][$item] - $arr[$person2][$item], 2));
        $sum = $sum + $p;
    }
}


$sum = 1 / (1 + $sum);

echo $sum;

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 08 мая 2011

Основным отличием является то, что вы добавили sqrt в код PHP.PHP также не обрабатывает особый случай отсутствия общих префов, который дает 0 в версии Python и 1 в версии PHP.

Я протестировал обе версии, и это единственные различия, которые я нашел.1004 *

0 голосов
/ 07 мая 2011

это близко, поскольку я мог бы сделать прямой перевод ... (не проверено)

function sim_distance($prefs, $person1, $person2) {
    $si = array();
    foreach($prefs[$person1] as $item) {
        if($item in $prefs[$person2]) $si[$item]=1;
    }
    if(count($si)==0) return 0;

    $squares = array();
    foreach($prefs[$person1] as $item) {
        if(array_key_exists($item,$prefs[$person2])) {
            $squares[] = pow($prefs[$person1][$item]-$prefs[$person2][$item],2);
        }
    }
    $sum_of_squares = array_sum($squares);
    return 1/(1+$sum_of_squares);
}

Я действительно не знаю, что вы пытаетесь сделать, или я интерпретировал отступправильно ... но возможно это поможет.Я предполагаю, что ваши структуры данных имеют тот же макет, что и в скрипте Python.

о ... и я интерпретирую Python следующим образом:

def sim_distance(prefs,person1,person2):
    # Get the list of shared_items 
    si={} 
    for item in prefs[person1]:
        if item in prefs[person2]: si[item]=1

    # if they have no ratings in common, return 0 
    if len(si)==0: return 0

    # Add up the squares of all the differences
    sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2) for item in prefs[person1] if item in prefs[person2]]) 

    return 1/(1+sum_of_squares)
...