Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Программирование на PHP

  Все выпуски  

RFpro.ru: Программирование на PHP


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Советник
Рейтинг: 10889
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Советник
Рейтинг: 4016
∙ повысить рейтинг »
LfiN
Статус: Специалист
Рейтинг: 706
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / PHP

Номер выпуска:1268
Дата выхода:30.05.2014, 15:03
Администратор рассылки:Устинов С.Е. (Профессионал)
Подписчиков / экспертов:59 / 26
Вопросов / ответов:2 / 2

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


Консультация # 187862: Здравствуйте! Прошу помощи в следующем вопросе: Как будет выглядеть эта функция (в приложении), написанная на python, на языке PHP?...

Консультация # 187858:

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

Дата отправки: 24.05.2014, 14:55
Вопрос задал: Sandor (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Коцюрбенко Алексей aka Жерар (Советник):

Здравствуйте, Sandor!

Если переводить дословно, оператор за оператором, то будет примерно так:

Код (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));
}

Но можно воспользоваться некоторыми функциями PHP для работы с массивами, тогда код получится короче:

Код (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));
}

Здесь 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.

Консультировал: Коцюрбенко Алексей aka Жерар (Советник)
Дата отправки: 24.05.2014, 17:24

5
Благодарю за подробный ответ!
-----
Дата оценки: 24.05.2014, 17:42

Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 187862:

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

Дата отправки: 27.05.2014, 00:16
Вопрос задал: Sandor (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Коцюрбенко Алексей aka Жерар (Советник):

Здравствуйте, Sandor!

Примерно так:

Код (PHP):
function getRecommendations($prefs, $person, $similarity='sim_pearson')
{
$totals = array();
$simSums = array();
 foreach ($prefs as $other_key=>$other_value)
 {
# don't compare me to myself
  if ($other_key==$person) continue;
 $sim = $similarity($prefs, $person, $other_key);
# ignore scores of zero or lower
  if ($sim<=0) continue;
  foreach ($other_value as $item_key=>$item_value)
# only score movies I haven't seen yet
   if (!array_key_exists($item_key, $prefs[$person]) || $prefs[$person][$item_key]==0)
   {
# Similarity * Score
   $totals[$item_key] = $item_value*$sim + (isset($totals[$item_key])?$totals[$item_key]:0);
# Sum of similarities
   $simSums[$item_key] = $sim + (isset($simSums[$item_key])?$simSums[$item_key]:0);
   }
 }
# Create the normalized list
 foreach ($totals as $item=>$total) $rankings[$item] = $total / $simSums[$item];
# Return the sorted list
arsort($rankings, SORT_NUMERIC);
return $rankings
}

Здесь функция сравнения передаётся через переменную $similarity, поэтому и вызывается через неё как $similarity($prefs, $person, $other_key). Функция array_key_exists($key, $array) проверяет наличие индекса $key в ассоциативном массиве $array - аналогично выражению key in array в Python для словаря array. Вместо двух Python'овских методов sort и reverse используется одна функция arsort сортировки элементов массива по убыванию с сохранением индексов (параметр SORT_NUMERIC означает сравнение элементов как чисел). К сожалению, в PHP нет аналога Python'овского метода setdefault для ассоциативных массивов, поэтому вместо него используется обычная для такого случая конструкция вида isset($array[$key])?$array[$key]:0, которая возвращает элемент массива $array с индексом $key, если элемент с таким индексом существует, и значение по умолчанию (н апример, 0), если он не существует.

Консультировал: Коцюрбенко Алексей aka Жерар (Советник)
Дата отправки: 27.05.2014, 06:51

5
нет комментария
-----
Дата оценки: 28.05.2014, 10:11

Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


© 2001-2012, Портал RFPRO.RU, Россия
Авторское право: ООО "Мастер-Эксперт Про"
Калашников О.А. | Гладенюк А.Г.
Версия системы: 2011.6.36 от 26.01.2012

В избранное