Используйте функцию scipy.stats.rv_histogram () для выборки из 2-й гистограммы. - PullRequest
0 голосов
/ 24 января 2019

Функция Сципи rv_histogram очень полезна, если у меня есть эмпирическое распределение, которое дается гистограммой, из которой я хочу сэмплировать. Поэтому я могу получить новые данные, как показано в этом минимальном примере:

import scipy.stats
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

x = np.array(range(2,8))
hist_1d = pd.DataFrame(np.array([11., 46., 158., 75., 90., 14.]), index=x)
plt.plot(x + 0.5, hist_1d.values)
dist = scipy.stats.rv_histogram((hist_1d.values.ravel(), np.array(range(2,9))))
plt.hist(dist.rvs(size=500), bins=len(x))

1D Histogram

Теперь я хочу сделать то же самое для 2D-распределения, указанного в этом минимальном примере:

hist_2d = pd.DataFrame(np.array([[129, 162, 178, 182, 182, 182],
                   [122, 163, 185, 191, 189, 185],
                   [115, 164, 192, 200, 197, 189],
                   [ 94, 136, 158, 162, 157, 152],
                   [ 74, 108, 124, 125, 118, 116],
                   [ 53,  80,  90,  88,  79,  80]]),
                  index=range(2,8), columns=range(8,14))
sns.heatmap(hist_2d)

enter image description here

Однако, функция rv_histogram позволяет получать только одномерные данные - или, по крайней мере, я не знаю, как передать два вектора границ бина. Возможно ли это, или в Python есть подобная функция?

Редактировать: возможное решение

Я принял ответ ниже, так как он отвечает на вопрос в виде фразы, что использование этой функции невозможно, и я не нашел похожих функций в стеке Scipy / Python.

Просто для дальнейшего использования, возможное решение, которое я нашел на основе этой реализации Walker Sampling:

from walker import WalkerRandomSampling

keys = list(itertools.product(hist_2d.index, hist_2d.columns))
values = hist_2d.values.flatten()

wrand = WalkerRandomSampling(weights=values, keys=keys)
samples = wrand.random(100000)

hist,_,_ = np.histogram2d(x= samples[:,0], y=samples[:,1], bins=6)
sns.heatmap(hist)

enter image description here

1 Ответ

0 голосов
/ 25 января 2019

Да, вся иерархия rv_generic является только 1D и включает в себя rv_histogram.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...