【发布时间】:2020-08-05 09:37:57
【问题描述】:
问题
我有一个包含 4 个数字特征和 1000 个数据点的数据集。值的分布是未知的(numpy randint 生成统一的整数,但这只是为了说明)。给定新的数据点(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,不知道如何估计累积概率。可能的方法是 monte-carlo sim 或集成 (scipy.integrate.nquad),这对我的情况来说太慢了 Integrate 2D kernel density estimate。
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))
统计模型
无法存档任何内容,因为它只接受一维数据。
from statsmodels.distributions.empirical_distribution import ECDF
ecdf = ECDF(data[:, 0])
ecdf(new_data[0][0])
问题是,是否有一种快速有效的方法来估计具有提供的 scipy 或 sklearn(最好)模型的 4 维数据点的累积概率?
我是朝着正确的方向前进还是有完全不同的方法来解决这个问题?也许变分自动编码器是要走的路?有没有简单的方法来解决这个问题?
【问题讨论】:
-
IIUC 你想做类似 ecdf(new_data) 的事情并得到一个结果元组,对吗?
-
不,我想要的是一个数据点的这 4 个特征值的单个累积概率。例如输入=数组([[75,24,39,94]]),输出=0.01。
标签: python scikit-learn scipy probability-density kernel-density