Понижение дискретизации непрерывной переменной до равномерного распределения

Учитывая распределение, скажем, гауссово:

import pandas as pd
import numpy as np

gaussian_distribution = np.random.normal(0,1,10_000)

Этот образец выглядит так:

введите здесь описание изображения

Что я хочу сделать, так это пересэмплировать это распределение, чтобы каким-то образом получить однородное распределение, поэтому:

Pr(X) = Pr(X+W)

Меня не беспокоит окончание на n < 10_000, я просто хочу убрать пик раздачи.

Я что-то читал об интерполяции дистрибутива на этом, но не мог понять, как это работает.


person Victor Maricato    schedule 04.03.2021    source источник
comment
Что такое X и что такое W в Pr(X) = Pr(X+W)? Что вы подразумеваете под пересэмплированием дистрибутива?   -  person Chachni    schedule 09.03.2021
comment
Отвечает ли это на ваш вопрос? stackoverflow.com/questions/63738389/   -  person anon01    schedule 11.03.2021
comment
@Chachni Pr (X) = Pr (X + W) означает, что вероятность одинакова. Pr описывает функцию плотности вероятности. Повторная выборка распределения означает уменьшение исходного распределения таким образом, чтобы оно теперь распределялось как желаемое распределение (в данном случае равномерное). Повторная выборка просто для того, чтобы уточнить, что я не хочу совершенно нового равномерного распределения, я хочу, чтобы исходное выглядело как равномерное распределение.   -  person Victor Maricato    schedule 11.03.2021
comment
@anon01 Да, это именно то, что я искал   -  person Victor Maricato    schedule 11.03.2021
comment
Если найду время в эти выходные, то напишу сюда улучшенную/уточненную версию   -  person anon01    schedule 11.03.2021
comment
Если бы вы могли предоставить некоторые рекомендации о том, как найти эти sample_probs для произвольного целевого и исходного распределения, а не только для гауссовского и равномерного. Целью является только любопытство, мой вариант использования включает только униформу. Но источник может быть полезен, мое реальное распределение приблизительно соответствует гамма-распределению, а не гауссову. Я поставил гауссов в вопросе только для упрощения. :С   -  person Victor Maricato    schedule 11.03.2021
comment
есть проблема. выборки из нормального распределения неограничены, они могут быть сколь угодно большими, хотя и редкими. Это означает, что после передискретизации выходное распределение также будет неограниченным. Это проблема, потому что равномерное распределение ограничено интервалом. Ноль вне его. Таким образом, не существует четко определенного преобразования, которое преобразует нормальные выборки в равномерные. Вам нужно указать границы, например (-3,3).   -  person tstanisl    schedule 13.03.2021


Ответы (2)


Я не уверен, почему вы захотите это сделать или почему важно сохранить исходные выборки, а не повторную выборку равномерного распределения с границами, соответствующими вашей гистограмме. Но вот подход, как вы просили: возьмите гистограмму достаточной детализации и передискретизируйте точки, попадающие в каждый бин, обратно пропорционально высоте бина. В конечном итоге вы получите равное количество (примерно) очков из каждого интервала бина.

x = np.random.randn(10_000)
counts, bins = np.histogram(x, bins=10)
subsampled = []
for i in range(len(bins)-1):
  if i == len(bins)-2:
    # last bin is inclusive on both sides
    section = x[(x>=bins[i]) & (x<=bins[i+1])]
  else:
    section = x[(x>=bins[i]) & (x<bins[i+1])]
  sub_section = np.random.choice(section, np.amin(counts), replace=False)
  subsampled.extend(sub_section)

Ограничение этого быстрого и грязного решения заключается в том, что наименьший бункер определяет высоту вашего результирующего равномерного распределения. Как следствие, меньшее количество бинов в вашей гистограмме не сделает точки подвыборки однородными, но позволит вам сохранить их больше. Вы также можете отрезать хвосты, чтобы исправить это.

Оригинал: гистограмма x

Подвыборка: гистограмма подвыборки

person Myrl Marmarelis    schedule 07.03.2021
comment
Я еще не мог попробовать ваш подход, но, похоже, он действительно делает то, что я ожидал. Я думаю, что поведение, при котором наименьший бин ограничивает остальные, ожидаемо, если бы это было не так, окончательное распределение не было бы равномерным. - person Victor Maricato; 08.03.2021

Существует функция с именем np.random.uniform

import matplotlib.pyplot as plt
mu, sigma = 0, 0.1 # mean and standard deviation
s = np.random.uniform(mu, sigma, 1000)
count, bins, ignored = plt.hist(s, 30, density=True)
plt.plot(bins, 1/(sigma * np.sqrt(2 * np.pi)) *
np.exp( - (bins - mu)**2 / (2 * sigma**2) ),linewidth=2, color='r')
plt.show()

введите здесь описание изображения

person Naveenkumar    schedule 10.03.2021
comment
Я не хочу получать новое равномерное распределение. Я хочу пересэмплировать исходный дистрибутив на униформу. - person Victor Maricato; 10.03.2021