Сэмплинг Томпсона с Джанго — Часть 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.