Python Scipy高斯KDE:矩阵不是正定的
我试图使用scipy来估计数据集在某些点上的密度Python Scipy高斯KDE:矩阵不是正定的,python,scipy,kernel-density,Python,Scipy,Kernel Density,我试图使用scipy来估计数据集在某些点上的密度 from scipy.stats import gaussian_kde import numpy as np 我有一个3D点的数据集(这只是一个最小的例子。我的实际数据有更多的维度和更多的样本) 我想估算密度的点 B = np.array([[0.40209377, 0.21063273, 0.75885516], [0.91709997, 0.79303252, 0.65156937]]) 但我似乎无法使用gaussian
from scipy.stats import gaussian_kde
import numpy as np
我有一个3D点的数据集(这只是一个最小的例子。我的实际数据有更多的维度和更多的样本)
我想估算密度的点
B = np.array([[0.40209377, 0.21063273, 0.75885516],
[0.91709997, 0.79303252, 0.65156937]])
但我似乎无法使用gaussian_kde
函数
result = gaussian_kde(A.T)(B.T)
返回
LinAlgError: Matrix is not positive definite
如何修复此错误?如何获得样本的密度?TL;博士:
您的数据中有高度相关的特征,这会导致数值错误。有几种可能的方法来解决这个问题,每种方法都有利弊。下面建议为gaussian_kde
减少替代类别
诊断的
您的数据集
(即,您在创建gaussian_kde
对象时输入的矩阵,而不是在使用它时输入的矩阵)可能包含高度依赖的特征。这一事实(可能与低数值分辨率(如float32
和“太多”数据点)相结合)导致协方差矩阵具有接近零的特征值,由于数值误差,特征值可能会低于零。这反过来将破坏在数据集协方差矩阵上使用Cholesky分解的代码(具体细节请参见解释)
假设您的数据集具有形状(dims,N)
,您可以通过np.linalg.eigh(np.cov(数据集))[0]来测试这是否是您的问题
LinAlgError: Matrix is not positive definite