Эксперимент
Оптимизация производительности игры с помощью экспериментов: руководство для начинающих
Понимание случайных экспериментов, квазислучайных экспериментов и многоруких бандитов для игровых экспериментов
Разработка игр — это быстрорастущая область, которая в значительной степени зависит от принятия решений на основе данных. Дизайнеры и разработчики игр используют эксперименты для оценки и оптимизации функций и механизмов своих игр. Однако разработка экспериментов, позволяющих эффективно собирать данные, может быть сложной задачей. Случайные эксперименты, квазислучайные эксперименты и многорукие бандиты — три популярные стратегии, которые можно использовать для разработки экспериментов для игр. В этом сообщении блога мы подробно рассмотрим эти три стратегии, включая их математические основы, практические приложения и реализации Python.
Случайные эксперименты
Случайные эксперименты включают случайное назначение лечения группе участников и измерение результата. Цель случайных экспериментов состоит в том, чтобы свести к минимуму предвзятость и гарантировать, что группы лечения сопоставимы во всех аспектах, кроме самого лечения.
Планирование случайных экспериментов
Случайные эксперименты могут быть спланированы несколькими способами, в том числе:
- Простая случайная выборка: это включает в себя случайный выбор участников из популяции и распределение их по группам лечения.
- Стратифицированная случайная выборка: это включает в себя разделение населения на подгруппы на основе характеристик, таких как возраст или пол, а затем случайный выбор участников из каждой подгруппы.
- Кластерная случайная выборка: это включает в себя случайный выбор кластеров, таких как школы или районы, а затем распределение участников внутри кластера по лечебным группам.
Самый распространенный метод анализа случайных экспериментов – проверка гипотез. Это включает в себя сравнение результатов лечения и контрольной группы с использованием статистических тестов, чтобы определить, имело ли лечение значительный эффект.
Реализация Python
Чтобы проиллюстрировать, как провести случайный эксперимент в Python, мы будем использовать следующий пример:
Предположим, мы хотим проверить, увеличивает ли новая игровая функция, например обучение, удержание игроков. Мы можем случайным образом распределить участников в лечебную группу, где они получают обучающее пособие, или в контрольную группу, где они этого не делают. Затем мы можем измерить коэффициент удержания каждой группы и сравнить их с помощью проверки гипотез.
Вот пример кода Python для проведения случайного эксперимента:
import numpy as np from scipy.stats import ttest_ind # Generate random data for treatment and control groups treatment = np.random.normal(10, 2, size=100) control = np.random.normal(8, 2, size=100) # Calculate the mean and standard deviation of each group treatment_mean = np.mean(treatment) control_mean = np.mean(control) treatment_std = np.std(treatment) control_std = np.std(control) # Conduct a two-sample t-test to compare the means of the two groups t_stat, p_value = ttest_ind(treatment, control, equal_var=False) # Print the results print("Treatment Mean:", treatment_mean) print("Control Mean:", control_mean) print("Treatment Std:", treatment_std) print("Control Std:", control_std) print("T-Statistic:", t_stat) print("P-Value:", p_value)
Квазислучайные эксперименты
Квазислучайные эксперименты подобны случайным экспериментам, но в них используется более систематический подход к назначению лечения. Вместо случайного распределения участников по группам лечения в квазислучайных экспериментах используется заранее определенный метод, чтобы гарантировать, что каждая группа лечения похожа во всех аспектах, кроме самого лечения.
Планирование квазислучайных экспериментов
Существует несколько методов планирования квазислучайных экспериментов, в том числе:
- Стратифицированная выборка: это включает в себя разделение населения на подгруппы на основе характеристик, таких как возраст или пол, а затем распределение участников из каждой подгруппы по лечебным группам.
- Сопоставление: это включает в себя сопоставление участников экспериментальной группы с участниками контрольной группы на основе схожих характеристик, таких как возраст, пол или уровень навыков.
- Рандомизация блоков: это включает в себя разделение населения на блоки на основе характеристик, таких как местоположение или время, а затем случайное назначение лечения в каждом блоке.
Анализ квазислучайных экспериментов аналогичен анализу случайных экспериментов. Проверка гипотез может быть использована для сравнения результатов лечения и контрольной группы и определения того, имело ли лечение значительный эффект.
Реализация Python
Чтобы проиллюстрировать, как проводить квазислучайный эксперимент в Python, мы будем использовать следующий пример:
Предположим, мы хотим проверить, повышает ли вовлеченность игроков новая функция игры, например система вознаграждений. Мы можем использовать рандомизацию блоков, чтобы разделить игроков на блоки в зависимости от их местоположения, а затем случайным образом назначить лечение в каждом блоке. Затем мы можем измерить уровень вовлеченности каждой группы и сравнить их с помощью проверки гипотез.
Вот пример кода Python для проведения квазислучайного эксперимента:
import numpy as np from scipy.stats import ttest_ind # Generate random data for treatment and control groups locations = np.array(['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C']) treatment = np.array([1, 0, 1, 0, 0, 0, 1, 0, 1]) control = np.array([0, 1, 0, 1, 1, 1, 0, 1, 0]) # Calculate the mean and standard deviation of each group treatment_mean = np.mean(treatment) control_mean = np.mean(control) treatment_std = np.std(treatment) control_std = np.std(control) # Conduct a two-sample t-test to compare the means of the two groups t_stat, p_value = ttest_ind(treatment, control, equal_var=False) # Print the results print("Treatment Mean:", treatment_mean) print("Control Mean:", control_mean) print("Treatment Std:", treatment_std) print("Control Std:", control_std) print("T-Statistic:", t_stat) print("P-Value:", p_value) if p_value < 0.05: print('Treatment & control group are different')
Многорукие бандиты
Многорукие бандиты — это тип дизайна эксперимента, который позволяет динамически распределять лечение для максимизации желаемого результата. В многоруких бандитах участников случайным образом распределяют по разным видам лечения, а распределение лечения корректируется на основе результатов предыдущих участников.
Проектирование многоруких бандитов
Существует несколько методов конструирования многоруких бандитов, в том числе:
- Эпсилон-жадный: этот метод включает случайный выбор лечения с вероятностью 1 эпсилон и выбор наиболее эффективного лечения с вероятностью эпсилон.
- Верхняя доверительная граница (UCB): этот метод включает выбор обработок на основе верхней доверительной границы эффективности обработки, которая уравновешивает разведку и эксплуатацию.
- Выборка Томпсона: этот метод включает моделирование распределения вероятностей эффективности каждого лечения и случайный выбор лечения на основе распределения вероятностей.
Анализ многоруких бандитов включает в себя измерение эффективности стратегии распределения в максимизации желаемого результата, такого как удержание или вовлеченность игроков.
Реализация Python
Чтобы проиллюстрировать, как провести эксперимент с многоруким бандитом в Python, мы будем использовать следующий пример:
Предположим, мы хотим протестировать несколько различных функций игры, таких как обучение, система вознаграждений и система чата, чтобы определить, какая функция максимально удерживает игроков. Мы можем использовать эпсилон-жадный метод для динамического распределения процедур на основе результатов предыдущих участников.
Вот пример кода Python для проведения эксперимента с многорукими бандитами:
import numpy as np # Define the treatments treatments = ['Tutorial', 'Reward System', 'Chat System'] # Define the epsilon value epsilon = 0.2 # Initialize the rewards and counts for each treatment rewards = [0] * len(treatments) counts = [0] * len(treatments) # Define the function for selecting a treatment def select_treatment(): if np.random.rand() < epsilon: # Select a random treatment return np.random.choice(len(treatments)) else: # Select the treatment with the highest expected reward expected_rewards = [rewards[i] / counts[i] if counts[i] > 0 else 0 for i in range(len(treatments))] return np.argmax(expected_rewards) # Simulate the experiment for 100 participants for i in range(100): # Select a treatment and record the outcome treatment = select_treatment() if treatment == 0: outcome = np.random.binomial(1, 0.9) elif treatment == 1: outcome = np.random.binomial(1, 0.7) else: outcome = np.random.binomial(1, 0.5) # Update the rewards and counts for the selected treatment rewards[treatment] += outcome counts[treatment] += 1 # Print the results for i in range(len(treatments)): print(treatments[i], "Reward:", rewards[i], "Count:", counts[i])
Связанная записная книжка Kaggle -
Заключение
Проведение экспериментов в играх имеет решающее значение для повышения вовлеченности игроков, удержания и общей производительности игры. Случайные эксперименты — это самый простой тип дизайна эксперимента, в то время как квазислучайные эксперименты и многорукие бандиты позволяют более динамично распределять методы лечения. Каждый метод имеет свои сильные и слабые стороны, и выбор плана эксперимента зависит от вопроса исследования и доступных ресурсов. Тщательно разрабатывая и анализируя эксперименты, разработчики игр могут оптимизировать свои игры и обеспечить лучший игровой опыт для своих игроков.
Рекомендации
- https://en.wikipedia.org/wiki/Эксперимент_(теория_вероятности)
- https://en.wikipedia.org/wiki/Квази-эксперимент
- https://en.wikipedia.org/wiki/Многорукий_бандит
- https://booking.ai/how-booking-com-increases-the-power-of-online-experiments-with-cuped-995d186fff1d
Если вы дочитали до сих пор, большое спасибо за чтение! Надеюсь, эта статья окажется для вас полезной.Если хотите, добавьте меня в LinkedIn!
Удачи на этой неделе,
Пратюш