Вычисление сходства -> код Python с кодом php — что не так?

Я пытаюсь преобразовать следующий код 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;

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


person Community    schedule 07.05.2011    source источник
comment
Какие результаты вы получаете?   -  person Pekka    schedule 07.05.2011
comment
пожалуйста, исправьте отступ для вашего скрипта Python. пробел важен   -  person mpen    schedule 07.05.2011
comment
кроме того, в скрипте Python нет квадратного корня. ваш код делает что-то другое.   -  person mpen    schedule 07.05.2011


Ответы (2)


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

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.

о... и я интерпретирую питон так:

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)
person mpen    schedule 07.05.2011
comment
Я не уверен, насколько это поможет опубликовать непроверенный перевод, потому что теперь у OP есть две подозрительные версии PHP для отладки. Я протестировал его и обнаружил некоторые регрессии в вашей версии по сравнению с оригиналом. - person Mu Mind; 08.05.2011
comment
э... ну ладно. если бы он разместил тестовые данные и ожидаемый результат, было бы легче тестировать. - person mpen; 08.05.2011
comment
Спасибо, я нашел проблему. Код предназначен только для поиска сходства в базе данных, чтобы генерировать некоторые рекомендации для других пользователей... - person ; 08.05.2011

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

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

person Mu Mind    schedule 07.05.2011
comment
Также обратите внимание: код Python имеет некоторые проблемы. Строка return 1/(1+sum_of_squares), вероятно, должна быть return 1.0/(1+sum_of_squares), поэтому она будет выполнять деление с плавающей запятой, даже если все входные данные являются целыми числами. Всю верхнюю часть функции также можно было бы переписать if not any(item in prefs[person2] for item in prefs[person1]): return 0. - person Mu Mind; 08.05.2011