Np.std в Python из взвешенных выборок отличается от теоретической? ⇐ Python
Np.std в Python из взвешенных выборок отличается от теоретической?
Я беру выборку из трех распределений с заданным весом и перекрестно проверяю, работает ли выборка должным образом. В конце этого кода у меня есть несколько проверок, чтобы убедиться, что ожидаемое среднее (вес * среднее значение каждого распределения) одинаково, и что стандартное отклонение также одинаково. Однако я не могу добиться совпадения стандартного отклонения? Я не знаю почему, поскольку считаю, что выборка работает так, как задумано, но мне нужна помощь, чтобы выяснить, почему std_generated и ожидаемый_std отличаются
импортировать numpy как np из scipy.stats показатель импорта np.random.seed(42) # Устанавливаем определенное начальное значение # Предполагая, что disbn_1, disbn_2 и disbn_3 являются вашими замороженными объектами распространения # и w_1, w_2, w_3 — соответствующие вероятности # Настройте объекты распространения par_1 = 2.0 # Отрегулируйте этот параметр в соответствии с вашим конкретным дистрибутивом disbn_1 = экспонента (шкала = пар_1) disbn_2 = expon(scale=1.0) # Отрегулируйте параметры по мере необходимости disbn_3 = expon(scale=0.5) # Отрегулируйте параметры по мере необходимости # Настройка вероятностей w_1, w_2, w_3 = 0,4, 0,3, 0,3 веса = np.array([w_1, w_2, w_3]) # Количество образцов, которые вы хотите сгенерировать num_samples = 5000000 # Увеличить количество выборок # Выборка из распределений с заданными вероятностями selected_distributions = [disbn_1, disbn_2, disbn_3] random_indices = np.random.choice(len(веса), size=num_samples, p=веса) # Используйте np.choose для выбора образцов на основе случайных индексов selected_samples = np.choose(random_indices, [dist.rvs(size=num_samples) для dist в selected_distributions]) # Рассчитать сводную статистику среднее_сгенерированное = np.mean(выбранные_выборки) std_generated = np.std(selected_samples,ddof=0) # Рассчитать ожидаемое среднее и стандартное значение на основе указанного распределения и вероятностей ожидаемое_среднее = np.sum(веса * np.array([dist.mean() для dist в выбранных_распределениях])) ожидаемый_std = np.sqrt(np.sum(weights * np.array([dist.var() для dist в selected_distributions]))) # Отображение результатов print(f"Среднее значение сгенерированных выборок: {mean_generated:.6f}") print(f"Ожидаемое среднее значение на основе распределения: {expected_mean:.6f}") Распечатать() print(f"Стандартное отклонение сгенерированных выборок: {std_generated:.6f}") print(f"Ожидаемое стандартное отклонение на основе распределения: {expected_std:.6f}")
Я беру выборку из трех распределений с заданным весом и перекрестно проверяю, работает ли выборка должным образом. В конце этого кода у меня есть несколько проверок, чтобы убедиться, что ожидаемое среднее (вес * среднее значение каждого распределения) одинаково, и что стандартное отклонение также одинаково. Однако я не могу добиться совпадения стандартного отклонения? Я не знаю почему, поскольку считаю, что выборка работает так, как задумано, но мне нужна помощь, чтобы выяснить, почему std_generated и ожидаемый_std отличаются
импортировать numpy как np из scipy.stats показатель импорта np.random.seed(42) # Устанавливаем определенное начальное значение # Предполагая, что disbn_1, disbn_2 и disbn_3 являются вашими замороженными объектами распространения # и w_1, w_2, w_3 — соответствующие вероятности # Настройте объекты распространения par_1 = 2.0 # Отрегулируйте этот параметр в соответствии с вашим конкретным дистрибутивом disbn_1 = экспонента (шкала = пар_1) disbn_2 = expon(scale=1.0) # Отрегулируйте параметры по мере необходимости disbn_3 = expon(scale=0.5) # Отрегулируйте параметры по мере необходимости # Настройка вероятностей w_1, w_2, w_3 = 0,4, 0,3, 0,3 веса = np.array([w_1, w_2, w_3]) # Количество образцов, которые вы хотите сгенерировать num_samples = 5000000 # Увеличить количество выборок # Выборка из распределений с заданными вероятностями selected_distributions = [disbn_1, disbn_2, disbn_3] random_indices = np.random.choice(len(веса), size=num_samples, p=веса) # Используйте np.choose для выбора образцов на основе случайных индексов selected_samples = np.choose(random_indices, [dist.rvs(size=num_samples) для dist в selected_distributions]) # Рассчитать сводную статистику среднее_сгенерированное = np.mean(выбранные_выборки) std_generated = np.std(selected_samples,ddof=0) # Рассчитать ожидаемое среднее и стандартное значение на основе указанного распределения и вероятностей ожидаемое_среднее = np.sum(веса * np.array([dist.mean() для dist в выбранных_распределениях])) ожидаемый_std = np.sqrt(np.sum(weights * np.array([dist.var() для dist в selected_distributions]))) # Отображение результатов print(f"Среднее значение сгенерированных выборок: {mean_generated:.6f}") print(f"Ожидаемое среднее значение на основе распределения: {expected_mean:.6f}") Распечатать() print(f"Стандартное отклонение сгенерированных выборок: {std_generated:.6f}") print(f"Ожидаемое стандартное отклонение на основе распределения: {expected_std:.6f}")
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение