Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (python, php) Помогите, пожалуйста, перевести код / 13 сообщений из 13, страница 1 из 1
05.05.2012, 00:06:04
    #37782971
anonirus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(python, php) Помогите, пожалуйста, перевести код
Доброго времени суток!
нужно написать тоже самое, только на php
это кусок кода для рекомендательных сервисов из книги Тоби Сегарана
в особенности я не поняла, что такое item
заранее всем огромное спасибо)


# Возвращает коэффициент корреляции Пирсона между p1 и p2
def sim_pearson(prefs,p1,p2):
# Получить список предметов, оцененных обоими
si={}
for item in prefs[p1]:
if item in prefs[p2]: si[item]=1

# Найти число элементов
n=len(si)
# Если нет ни одной общей оценки, вернуть 0
if n==0: return 0

# Вычислить сумму всех предпочтений
sum1=sum([prefs[p1][it] for it in si])
sum2=sum([prefs[p2][it] for it in si])

# Вычислить сумму квадратов
sum1Sq=sum([pow(prefs[p1][it],2) for it in si])
sum2Sq=sum([pow(prefs[p2][it],2) for it in si])

# Вычислить сумму произведений
pSum=sum([prefs[p1][it]*prefs[p2][it] for it in si])

# Вычислить коэффициент Пирсона
num=pSum-(sum1*sum2/n)
den=sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n))

if den==0: return 0
r=num/den
return r
...
Рейтинг: 0 / 0
05.05.2012, 06:15:28
    #37783065
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(python, php) Помогите, пожалуйста, перевести код
anonirus,


Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
function sim_pearson($prefs, $p1, $p2) {
	# Если у когото нет вообще предпочтений
	if (!isset($prefs[$p1]) || !isset($prefs[$p2]))
		return 0;
	# Получить список предметов, оцененных обоими
	$si=array();
	foreach($prefs[$p1] as $item) {
		if (in_array($item, $prefs[$p2]))
			$si[$item]=1;
	}
	# Найти число элементов
	$n=sizeof($si);
	# Если нет ни одной общей оценки, вернуть 0
	if ($n==0)
		return 0;
	$sum1 = $sum2 = $sum1Sq = $sum2Sq = $pSum = 0;
	foreach($si as $it) {
		# Вычислить сумму всех предпочтений
		$sum1 += $prefs[$p1][$it];
		$sum2 += $prefs[$p2][$it];
		# Вычислить сумму квадратов
		$sum1Sq += pow($prefs[$p1][$it],2);
		$sum2Sq += pow($prefs[$p2][$it],2);
		# Вычислить сумму произведений
		$pSum += $sum1*$sum2;
	}
	# Вычислить коэффициент Пирсона
	$num=$pSum-(($sum1*$sum2)/$n);
	$den=sqrt(($sum1Sq-pow($sum1,2)/$n)*($sum2Sq-pow($sum2,2)/$n));
	if ($den==0)
		return 0;
	return $num/$den;
}


...
Рейтинг: 0 / 0
05.05.2012, 10:01:20
    #37783200
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(python, php) Помогите, пожалуйста, перевести код
r u,

Последние три строчки можно и в тернарный оператор засунуть.
Код: php
1.
2.
3.
if ($den==0)
		return 0;
	return $num/$den;



Код: php
1.
return $den==0?0:$num/$den;
...
Рейтинг: 0 / 0
05.05.2012, 10:07:19
    #37783205
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(python, php) Помогите, пожалуйста, перевести код
Код: php
1.
return $den==0 ?: $num/$den;
...
Рейтинг: 0 / 0
05.05.2012, 12:15:32
    #37783429
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(python, php) Помогите, пожалуйста, перевести код
r u,

$pSum += $sum1*$sum2;
заменить на
$pSum += $prefs[$p1][$it]*$prefs[$p2][$it];
...
Рейтинг: 0 / 0
05.05.2012, 15:13:11
    #37783736
anonirus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(python, php) Помогите, пожалуйста, перевести код
спасибо вам огромное!!

а вы не могли бы ещё вот это перевести

# Возвращает список наилучших соответствий для человека из словаря prefs.
# Количество результатов в списке и функция подобия – необязательные
# параметры.
def topMatches(prefs,person,n=5,similarity=sim_pearson):
scores=[(similarity(prefs,person,other),other)
for other in prefs if other!=person]
# Отсортировать список по убыванию оценок
scores.sort( )
scores.reverse( )
return scores[0:n]

# Получить рекомендации для заданного человека, пользуясь взвешенным средним
# оценок, данных всеми остальными пользователями
def getRecommendations(prefs,person,similarity=sim_pearson):
totals={}
simSums={}
for other in prefs:
# сравнивать меня с собой же не нужно
if other==person: continue
sim=similarity(prefs,person,other)
# игнорировать нулевые и отрицательные оценки
if sim<=0: continue
for item in prefs[other]:
# оценивать только фильмы, которые я еще не смотрел
if item not in prefs[person] or prefs[person][item]==0:
# Коэффициент подобия * Оценка
totals.setdefault(item,0)
totals[item]+=prefs[other][item]*sim
# Сумма коэффициентов подобия
simSums.setdefault(item,0)
simSums[item]+=sim
# Создать нормализованный список
rankings=[(total/simSums[item],item) for item,total in totals.items( )]
# Вернуть отсортированный список
rankings.sort( )
rankings.reverse( )
return rankings

>> reload(recommendations)
>> recommendations.topMatches(recommendations.critics,'Toby',n=3)

>>> reload(recommendations)
>>> recommendations.getRecommendations(recommendations.critics,'Toby')
>>> recommendations.getRecommendations(recommendations.critics,'Toby',
... similarity=recommendations.sim_distance)



опять же, заранее всех благодарю))
...
Рейтинг: 0 / 0
05.05.2012, 15:22:37
    #37783760
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(python, php) Помогите, пожалуйста, перевести код
anonirus,

А самому? Хотя, впрочем, дядя r u переведёт. :)
...
Рейтинг: 0 / 0
05.05.2012, 15:27:18
    #37783766
anonirus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(python, php) Помогите, пожалуйста, перевести код
ShSerge,

я до сих пор, к сожалению, так и не поняла python...вчера пол дня над ним просидела и без особых результатов

извините, если слишком настойчива..
...
Рейтинг: 0 / 0
05.05.2012, 16:00:17
    #37783837
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(python, php) Помогите, пожалуйста, перевести код
anonirus,

Пардон! Я не знал, что Вы женского полу. :)
...
Рейтинг: 0 / 0
06.05.2012, 11:08:40
    #37784452
anonirus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(python, php) Помогите, пожалуйста, перевести код
будьте человеками!

мне больше не у кого попросить

настоящий питерский шоколад моему спасителю прямо в руки почтой России)))
...
Рейтинг: 0 / 0
11.05.2012, 07:14:08
    #37788711
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(python, php) Помогите, пожалуйста, перевести код
anonirus,

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
function topMatches($prefs, $person, $n=5, $similarity='sim_pearson') {
	$scores = array();
	foreach($prefs as $other) {
		if ($other!=$person)
			$scores[] = array($similarity($prefs,$person,$other), $other);
	}
	sort($scores);
	return array_slice(array_reverse($scores), 0, $n);
}
...
Рейтинг: 0 / 0
11.05.2012, 07:35:10
    #37788715
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(python, php) Помогите, пожалуйста, перевести код
anonirus,

из за отсутствия отступов возможно я гдето и ошибся. надо проверять

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
function getRecommendations($prefs,$person,$similarity='sim_pearson') {
	$totals=array();
	$simSums=array();
	foreach($prefs as $other) {
		# сравнивать меня с собой же не нужно
		if ($other==$person)
			continue;
		$sim = $similarity($prefs,$person,$other);
		# игнорировать нулевые и отрицательные оценки
		if ($sim<=0)
			continue;
		foreach($prefs[$other] as $item) {
			# оценивать только фильмы, которые я еще не смотрел
			if (!in_array($item, $prefs[$person]) || $prefs[$person][$item]==0) {
				# Коэффициент подобия * Оценка
				if (!isset($totals[$item]))
					$totals[$item] = 0;
				$totals[$item] += $prefs[$other][$item]*$sim;
				# Сумма коэффициентов подобия
				if (!isset($simSums[$item]))
					$simSums[$item] = 0;
				$simSums[$item] += $sim;
			}
		}
		# Создать нормализованный список
		$rankings = array();
		foreach($totals as $item=>$total) {
			$rankings[] = array($total/$simSums[$item], $item);
		}
		# Вернуть отсортированный список
		sort($rankings);
		return array_reverse($rankings);
	}
}


...
Рейтинг: 0 / 0
23.05.2012, 18:57:32
    #37808512
anonirus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(python, php) Помогите, пожалуйста, перевести код
r u,
спасибо огромное!!
давай адрес и жди посылку)))
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (python, php) Помогите, пожалуйста, перевести код / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]