Как управлять вероятностями появления поста (рейтинг, сортировка, "рекомендованное")?
Главный вопрос:
(общее кол-во лайков 266,
общее кол-во просмотров: 2199,
общее кол-во № постов 10)
ШАБЛОН
(№ поста - кол-во лайков, кол-во просмотров)
0 -20, 65
1 - 15, 200
2 - 10, 20
3 - 40, 150
4 - 35, 89
5 - 30, 100
6 - 22, 80
7 - 12, 15
8 - 50, 980
9 - 32, 500
Нужно показать 5 постов, но условие такое;
- Отбор постов должен быть случайным.
- Должно быть предпочтение на посты с большим кол-вом лайков и его соотношение с просмотрами тоже должен быть довольно велик, но в тоже время должна быть маленькая вероятность показания постов и с меньшим количеством лайков и просмотров.
Короче говоря, как сделать вероятность появления одного сайта чуть ниже, а другого чуть выше?
Дополнительный вопрос
Как создать такой алгоритм ( выборки случайных постов, но с предпочтением на больший рейтинг) на PHP?
3. в этой формуле коэффициенты a>=0, b>=0, c>=0 - это "ручки регулировки" для вашего отбора. Чем больше a, тем сильнее влияние лайков, чем больше b, тем сильнее влияние просмотров, чем больше c, тем больше "равных возможностей для всех".
Спасибо, у вас довольно обширная дискуссия на том посте, мне немножко потребуется время чтобы все понять, и я обязательно отмечу Ваш ответ как решение :)
Только я не совсмем понимаю что такое a,b, c и как мне их найти ? В плане нужно умножить кол-во лайков(А) на логарифм 1+кол-во лайков и кол-во просмотров(В) на логарифм 1+кол-во просмотров, а С это как "bound" из примера поста на который Вы дали ссылку ?
не совсмем понимаю что такое a,b, c и как мне их найти
повторю: это "ручки регулировки", их не находить, а "крутить", т.е. подбирать, пока результат не будет нравиться конкретно вам. Вот как вы звук на усилителе или на активных колонках настраиваете? Слушаете, "ага, что-то высоких частот многовато", убавляете ручкой высоких частот, и т.д. Но это субъективно, одному нравится побольше басов, другому поменьше, источники звука тоже разные... Потому и нужны эти ручки, чтобы настроить по своему вкусу. Так и здесь, в формуле. В вопросе не было чётких параметров, насколько сильно должны влиять лайки и просмотры. Начать настройку можно с любых значений.
Можно слегка упростить: давайте уберём одну ручку настройки, зафиксируем c=10. Теперь выбирайте a от 0 до 100 и b от 0 до 100.
hint000, в принципе принцип понятен :). У лайков конечно должно быть больше веса, соответственно я дам лайкам a = 40, а просмотрам b = 20, можно также рандомно дать диапазон, типа для (A) диапазон 35-45, а для (B) - диапазон от 15-25, чтобы был также случайный вес, но (С) все равно не совсем понимаю как работает, также не совсем понимаю, почему мы используем логарифмы ? )) И зачем для каждого лайка и просмотра мы добавляем + 1, если возможно, объясните пожалуйста.
Возвратимся к дискуссии в комментариях того вопроса. Именно логарифмы позволяют получить тот результат, на котором так настаивал мой оппонент Bavashi. Без логарифмов обойтись можно, но тогда у вас будут слишком часто выпадать несколько самых популярных постов, а остальные останутся в тени. Логарифмы в данном случае - это что-то вроде социализма, :) когда тоже есть бедные и богатые, но разница между бедными и богатыми в десять раз, а не в миллион раз, как при капитализме.
Почему в той дискуссии я был против "уравниловки", а здесь не против? По двум причинам:
1) там речь шла об услуге показа баннеров, и вес означал деньги, оплаченные за услугу. Там - капитализм, за сколько заплатил, столько и получил. Здесь речь о просмотрах и лайках. Просмотры и лайки сами по себе бесплатны (к тому же их легко накручивать), это штука социальная по своей природе, здесь частичное выравнивание логарифмами уместно.
2) там в программе другой уровень абстракции. Там вес - это уже исходные данные. В начале программы вес генерируется случайным образом просто для тестово-демонстрационных целей. При реальном использовании мы бы читали веса из файла или из базы данных. Здесь же иначе, здесь мы вычисляем вес на основании других параметров. Если там сделать уравниловку поверх готовых весов, это будет в некотором роде протеканием абстракции веса. Здесь уравниловка происходит на более низком уровне, и абстракция в порядке. :)
И зачем для каждого лайка и просмотра мы добавляем + 1
Частный случай, когда у поста ноль лайков или ноль просмотров. Логарифм от нуля равен минус бесконечности (ну или не определён, смотря на каком уровне говорить о математике). Приходится добавлять 1, чтобы не получить ошибку. Тогда для нуля лайков получим Log(1)=0 и всё в порядке.
можно также рандомно дать диапазон, типа для (A) диапазон 35-45, а для (B) - диапазон от 15-25
Можно, но лучше не надо. Это излишне и совсем не даст лучшего результата, чем без рандома в этом месте. Рандом уже есть при выборе постов на основании веса, этого достаточно. Но если хотите, то попробуйте.
но (С) все равно не совсем понимаю как работает
Вернёмся к Log(1)=0. Представьте пост, у которого ещё не было ни одного просмотра. Ну и, разумеется, лайков у него тоже нет.
a*Log(1+лайков[пост])+b*Log(1+просмотров[пост]) равно нулю. И если бы не было (C), то вес получился бы нулевой и этот пост никогда бы не был показан. Также величина (C) важна для тех постов, у которых есть лайки и\или просмотры, но очень мало. Т.е., возвращаясь к социализму, (C) - это вроде социального пособия или безусловного дохода. Можно жить на одно пособие, не работать, но и не умереть от голода. Пост может иметь 1-2 просмотра или не иметь вовсе, но (C) не позволит ему умереть от голода, пост будет иногда показываться.
Если (C)=0, то это чистый капитализм, безработные каждый день подыхают прямо на улицах.
Если (C)=1, это капитализм, но БОМЖам уже выдают похлёбку один раз в день.
Если (C) сделать заметно больше, чем (A) и (B) - это будет коммунистическая утопия, работать не обязательно, бутерброды растут на деревьях, робо-такси ходят бесплатно, показ постов почти не зависит от лайков и просмотров.
hint000, потрясающе ! Очень подробно и ясно теперь. Спасибо большое, теперь у меня появилось хорошая база, дальше, конечно можно комбинировать и добавлять свои плюшки, ибо формула довольно эластичная и охватывает много факторов. Еще раз спасибо !
Да, я использую MySQL, но ORDER BY это довольно сухая сортировка, а я ищу на подобии живой, умной сортировки, где рассчитывается лучшие стороны поста, и есть возможность показать посты с маленьким кол-во просмотров.
Что значит сухая?) Логику сортировки вы сами выбираете. Как напишите так и будет работать. ORDER BY RAND(), like, view
Открою тайну можно даже формулы писать с условиями. Хотя это скажется на быстродействии и нагрузке скорей всего. Поэтому вначале вам нужно самому определиться чего вы хотите, потом подготовить модель хранения данных, а потом только выводить эти данные так как запланировали