Проблема
У меня есть набор данных с 4 числовыми c функциями и 1000 точками данных. Распределение значений неизвестно (numpy randint генерирует одинаковые целые числа, но это только для иллюстрации). Учитывая новый объект данных (4 числа), я хочу найти, какова совокупная вероятность (одно число) этого специфического c объекта данных.
import numpy as np
data = np.random.randint(1, 100, size=(1000, 4))
array([[28, 52, 91, 66],
[78, 94, 95, 12],
[60, 63, 43, 37],
...,
[81, 68, 45, 46],
[14, 38, 91, 46],
[37, 51, 68, 97]])
new_data = np.random.randint(1, 100, size=(1, 4))
array([[75, 24, 39, 94]])
Я пробовал:
Сципи
Может оценить pdf, не знаю, как оценить кумулятивную вероятность. Возможные способы - симуляция Монте-Карло или интеграция (scipy.integrate.nquad), которая слишком медленная для моего случая. Интегрируйте оценку плотности ядра 2D .
import scipy.stats
kde = scipy.stats.gaussian_kde(data.T)
kde.pdf(new_data)
Scikit-learn
То же, что и выше, не знаю, как оценить совокупную вероятность.
from sklearn.neighbors import KernelDensity
model = KernelDensity()
model.fit(data)
np.exp(model.score_samples(new_data))
Statsmodels
Невозможно что-либо заархивировать, так как это принимает только 1d данные.
from statsmodels.distributions.empirical_distribution import ECDF
ecdf = ECDF(data[:, 0])
ecdf(new_data[0][0])
Вопрос в том, существует быстрый и эффективный способ оценки кумулятивной вероятности для четырехмерного элемента данных, имеющего предоставленные модели scipy или sklearn (предпочтительно)? решить это? Может, вариационные автоэнкодеры это путь к go? Есть ли простые способы решить эту проблему?