Сэмплинг Томпсона с Джанго — Часть 2
Добро пожаловать обратно! Во второй части я покажу вам, как отобразить рекламу, выбранную вашим алгоритмом, на странице, как добавить кнопки, чтобы пользователи могли получать изображения «Мне нравится» или «Не нравится», тем самым помогая программе стать лучше, и я бы добавил некоторые бонусы. в смеси.
Если вы пропустили предыдущую часть, вам действительно стоит взглянуть на нее здесь, прежде чем продолжить.
Давайте начнем
В домашней функции файла ads/views
добавьте следующий код:
ads = Ad.objects.all() context = { 'clicks' : ads_rewards, 'numb1' : numbers_of_rewards_1, 'numb0' : numbers_of_rewards_0, 'selected' : ads_selected,#The ads displayed to all users 'ad' : ads[ad]#The last ad selected by the algorithm } return render(request,'ads/home.html', context)
Создадим страницу, которая будет получать эти переменные
Создайте папку templates
внутри папки объявлений, затем создайте другую папку с именем ads
, затем создайте в ней страницу home.html
.
Я знаю, Джанго может раздражать.
Теперь добавьте следующий код на вашу страницу home.html.
{% load static %} <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous"> <title>Adverts</title> </head> <body> <h1>Thomas Sampling Ads</h1> <div class="container"> <div class="row"> <div class="col-4"> <img src="{{ad.image.url}}" alt="" class="img-fluid"> </div> <div class="col-4"> <a class="btn btn-small btn-primary" href="{% url 'like-ad' ad.id %}">Like</a> <a class="btn btn-small btn-danger" href="{% url 'dislike-ad' ad.id %}">Dislike</a> <br/>Indexes of ads that has been shown to different users - {{ selected }} <br> Reward 1 : {{ numb1 }} <br> Reward 0 : {{ numb0 }} <br> Clicks as seen in db : {{ clicks }} </div> </div> </div> </body> </html>
Я не тратил время на дизайн, так как это не учебник по дизайну
Пфф! я ужасен в дизайне
Я добавил кнопки для того, чтобы понравиться и не понравиться рекламному изображению, показываемому пользователю, поэтому давайте создадим маршрут для этого, а также соответствующие методы.
Нравится и не нравится реклама:
Добавьте следующие элементы в список URL-адресов файла youadd/urls.py
.
path('like/<int:ad>', views.like, name ='like-ad'), path('dislike/<int:ad>', views.dislike, name ='dislike-ad')
Теперь мы создадим функции like
и dislike
в файле ad/views.py
для обработки каждого нажатия кнопки.
def like(request, ad): inter_id = 0 cell = f"ad_{ad}" inter_id = request.session['user_interaction_id'] Interaction.objects.filter(pk=inter_id).update(**{cell : 1}) return redirect( reverse_lazy('ads-home') ) def dislike(request, ad): inter_id = 0 cell = f"ad_{ad}" inter_id = request.session['user_interaction_id'] Interaction.objects.filter(pk=inter_id).update(**{cell : 0}) return redirect( reverse_lazy('ads-home') )
И мы закончили.
Вы можете запустить сервер и перейти на localhost:8000, чтобы увидеть, как работает ваше новое приложение. Каждая перезагрузка или взаимодействие (Нравится или Не нравится) дает новую рекламу, которая была выбрана нашим алгоритмом, который использует предыдущие взаимодействия с рекламой, чтобы выбрать, какая реклама будет нам показана.
Дополнительный:
Если вы похожи на меня, у вас нет роскоши сотен пользователей для тестирования нашего приложения, чтобы дать нам конвергенцию, которую мы надеемся найти, поэтому я сделал следующее:
Случайным образом создайте X пользователей, которые будут делать случайные «клики» по объявлениям, добавив это в верхней части домашней функции:
X = 500 for n in range(500): cell = f"ad_{random.randint(1,10)}" new = Interaction_Thomas(**{cell : 1}) new.save()
Запустите это только один раз, после чего вы должны прокомментировать или удалить его, чтобы не создавать 500 новых взаимодействий с пользователем каждый раз, когда вы загружаете эту страницу.
Чтобы еще больше ускорить эту конвергенцию, я создал сеанс для хранения number_of_rewards_0
и number_of_rewards_1
следующим образом:
После цикла по пользователям я добавил следующий код:
request.session['thomas_rewards_0'] = numbers_of_rewards_0 request.session['thomas_rewards_1'] = numbers_of_rewards_1
Затем перед циклом я добавил следующий код:
if not request.session.get('thomas_rewards_0', None): numbers_of_rewards_1 = [0] * d numbers_of_rewards_0 = [0] * d else: numbers_of_rewards_0 = request.session['thomas_rewards_0'] numbers_of_rewards_1 = request.session['thomas_rewards_1']
При этом number_of_rewards
, используемый в алгоритме, становится постоянным, и мы сможем увидеть конвергенцию всего за 3–5 перезагрузок вместо того, чтобы ждать, скажем, 1500 взаимодействий пользователей с нашей рекламой.
Я надеюсь, что это было полезно для вас, и я хочу поблагодарить вас за чтение этого поста. Хлопните в ладоши, если это было полезно, чтобы другие тоже могли найти это. Вы также можете дать предложения в разделе комментариев.
Наконец, вы можете получить доступ к полному исходному коду этой программы в этом Github Repo.