n维数据的估计经验分布的累积概率

问题

我有一个包含4个数字特征和1000个数据点的数据集。值的分布是未知的(numpy randint生成统一的int,但这仅出于说明目的)。给定新的数据点(4个数字),我想查找此特定数据点的累积概率(单个数字)。

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,[37,51,97]])

new_data = np.random.randint(1,size=(1,4))
array([[75,24,39,94]])

我尝试过:

Scipy

可以估计pdf,不知道如何估计累积概率。可能的方法是monte-carlo sim或Integration(scipy.integrate.nquad),这对我的情况Integrate 2D kernel density estimate而言太慢了。

import scipy.stats
kde = scipy.stats.gaussian_kde(data.T)
kde.pdf(new_data)

Scikit学习

与上述相同,不知道如何估算累积概率。

from sklearn.neighbors import KernelDensity
model = KernelDensity()
model.fit(data)
np.exp(model.score_samples(new_data))

统计模型

无法存档任何内容,因为这仅接受一维数据。

from statsmodels.distributions.empirical_distribution import ECDF
ecdf = ECDF(data[:,0])
ecdf(new_data[0][0])

问题是,是否存在一种快速有效的方法来估计具有提供的scipy或sklearn(最好)模型的4维数据点的累积概率?

我是朝着正确的方向前进吗,还是有完全不同的方式来解决这个问题?也许可变自动编码器是要走的路?有解决这个问题的简单方法吗?

ZXY199 回答:n维数据的估计经验分布的累积概率

某个点处的多变量ecdf只会计算值小于该点的观测分数。

类似以下内容

np.random.seed(0)
data = np.random.randint(1,100,size=(1000,4))
new_data = np.random.randint(1,size=(2,4))

def ecdf_mv(new_data,data):
    new_data = np.atleast_2d(new_data)
    ecdf = []
    for row in new_data:
        ecdf.append((data <= row).all(1).mean())

    return np.asarray(ecdf)

ecdf_mv(new_data,data)

array([0.039,0.002])

一些检查:

ecdf_mv(np.ones(4) * 100 / 2,data),0.5**4
(array([0.067]),0.0625)

marginal = 100 * np.ones((4,4)) - 50 * np.eye(4)
ecdf_mv(marginal,data)
array([0.521,0.515,0.502,0.54 ])

在单变量情况下,我们可以对数据进行排序,以获得快速算法来计算原始点的ecdf。
我不知道是否需要在许多方面对ecdf进行评估,从而得出一种数据结构或算法在计算上比蛮力比较更有效。

本文链接:https://www.f2er.com/2384546.html

大家都在问