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

问题描述 投票:1回答:1

问题

我有一个有4个数字特征和1000个数据点的数据集。这些值的分布是未知的(numpy randint会生成均匀的ints,但这只是为了说明问题)。给定新的数据点(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, 91, 46],
       [37, 51, 68, 97]])

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

我已经尝试过了。

Scipy

可以估计pdf,不知道如何估计累积概率。可能的方法是蒙卡洛模拟或积分(scipy.integration.nquad),但对我来说太慢了。整合二维核密度估计.

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))

统计模型

由于只接受1维数据,所以不能存档。

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

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

我的方向是对的,还是有完全不同的方法来解决这个问题?也许变异的自动编码器是最好的方法?有没有简单的方法来解决这个问题?

python scikit-learn scipy probability-density kernel-density
1个回答
2
投票

在一个点上的多变量ecdf只是计算观测值小于该点的部分。

类似于下面的内容

np.random.seed(0)
data = np.random.randint(1, 100, size=(1000, 4))
new_data = np.random.randint(1, 100, 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要在很多点进行评估的话。

© www.soinside.com 2019 - 2024. All rights reserved.