Изчисляване на приликата -› код на 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