Консультация № 187858
24.05.2014, 14:55
105.34 руб.
0 4 1
Здравствуйте! Прошу помощи в следующем вопросе:
Как будет выглядеть эта функция (в приложении), написанная на python, на языке PHP?



Приложение:
from math import sqrt
# Возвращает оценку подобия person1 и person2 на основе расстояния
def sim_distance(prefs,person1,person2):
# Получить список предметов, оцененных обоими
si={}
for item in prefs[person1]:
if item in prefs[person2]:
si[item]=1
# Если нет ни одной общей оценки, вернуть 0
if len(si)==0: return 0
# Сложить квадраты разностей
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)

Обсуждение

давно
Старший Модератор
312929
1973
24.05.2014, 17:24
общий
это ответ
Здравствуйте, Sandor!

Если переводить дословно, оператор за оператором, то будет примерно так:
[code lang=php]
# Возвращает оценку подобия person1 и person2 на основе расстояния
function sim_distance($prefs, $person1, $person2)
{
# Получить список предметов, оцененных обоими
$si = array();
foreach ($prefs[$person1] as $key=>$value) if (array_key_exists($key, $prefs[$person2])) $si[$key] = 1;
# Если нет ни одной общей оценки, вернуть 0
if (count($si)==0) return 0;
# Сложить квадраты разностей
$sum_of_squares = 0;
foreach ($prefs[$person1] as $key=>$value) if (array_key_exists($key, $prefs[$person2])) $sum_of_squares += pow($prefs[$person1][$key]-$prefs[$person2][$key],2);
return 1/(1+sqrt($sum_of_squares));
}[/code]
Но можно воспользоваться некоторыми функциями PHP для работы с массивами, тогда код получится короче:

[code lang=php]
# Возвращает оценку подобия person1 и person2 на основе расстояния
function sim_distance($prefs, $person1, $person2)
{
# Получить список индексов предметов, оцененных обоими
$keys = array_intersect(array_keys($prefs[$person1]), array_keys($prefs[$person2]));
# Если нет ни одной общей оценки, вернуть 0
if (count($keys)==0) return 0;
# Сложить квадраты разностей
$sum_of_squares = 0;
foreach ($keys as $key) $sum_of_squares += pow($prefs[$person1][$key]-$prefs[$person2][$key],2);
return 1/(1+sqrt($sum_of_squares));
}[/code]
Здесь foreach ($array as $value) - аналог Python'овского for (value in array) для списка array, foreach ($array as $key=>$value) для ассоциативного массива $array - аналог for (key,value in array.items()) для словаря array, функция array_keys($array) возвращает массив индексов массива $array (как метод array.keys() - список индексов словаря array), функция array_intersect возвращает пересечение массивов, функции count и pow соответствуют Python'овским len и pow.
5
Благодарю за подробный ответ!
давно
Старший Модератор
312929
1973
24.05.2014, 17:46
общий
Кстати, у Вас в исходном тексте указана функция sqrt, но она нигде не используется. Нет ли ошибки в коде?
Неизвестный
24.05.2014, 18:52
общий
24.05.2014, 20:00
Адресаты:
Да, ошибка имеется, квадратный корень должен извлекаться из суммы квадратов разности.
давно
Старший Модератор
312929
1973
27.05.2014, 04:39
общий
В PHP квадратный корень тоже вычисляется функцией sqrt, причём она встроенная (подключать, импортировать не нужно), так что проблем не будет.
Форма ответа