首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对二维数据使用scipy.stats.gaussian_kde

对二维数据使用scipy.stats.gaussian_kde
EN

Stack Overflow用户
提问于 2010-11-09 06:23:06
回答 4查看 12.5K关注 0票数 7

我正在尝试使用the scipy.stats.gaussian_kde class来平滑一些使用纬度和经度信息收集的离散数据,因此它最终显示为有点类似于等值线图,其中高密度是峰值,低密度是谷。

我很难将二维数据集放入gaussian_kde类中。我试着弄清楚它是如何处理一维数据的,所以我认为二维应该是这样的:

代码语言:javascript
运行
复制
from scipy import stats
from numpy import array
data = array([[1.1, 1.1],
              [1.2, 1.2],
              [1.3, 1.3]])
kde = stats.gaussian_kde(data)
kde.evaluate([1,2,3],[1,2,3])

也就是说我在[1.1, 1.1], [1.2, 1.2], [1.3, 1.3]有3分。我想要在x和y轴上使用宽度为1的1到3的核密度估计。

在创建gaussian_kde时,它一直给我这个错误:

代码语言:javascript
运行
复制
raise LinAlgError("singular matrix")
numpy.linalg.linalg.LinAlgError: singular matrix

查看gaussian_kde的源代码,我意识到我思考dataset含义的方式与计算维度的方式完全不同,但我找不到任何示例代码来说明多维数据如何使用该模块。有人能帮我介绍一些使用gaussian_kde处理多维数据的示例方法吗?

EN

回答 4

Stack Overflow用户

发布于 2011-05-25 22:55:52

This example似乎就是你要找的东西:

代码语言:javascript
运行
复制
import numpy as np
import scipy.stats as stats
from matplotlib.pyplot import imshow

# Create some dummy data
rvs = np.append(stats.norm.rvs(loc=2,scale=1,size=(2000,1)),
                stats.norm.rvs(loc=0,scale=3,size=(2000,1)),
                axis=1)

kde = stats.kde.gaussian_kde(rvs.T)

# Regular grid to evaluate kde upon
x_flat = np.r_[rvs[:,0].min():rvs[:,0].max():128j]
y_flat = np.r_[rvs[:,1].min():rvs[:,1].max():128j]
x,y = np.meshgrid(x_flat,y_flat)
grid_coords = np.append(x.reshape(-1,1),y.reshape(-1,1),axis=1)

z = kde(grid_coords.T)
z = z.reshape(128,128)

imshow(z,aspect=x_flat.ptp()/y_flat.ptp())

很明显,轴心需要修复。

您还可以使用以下命令绘制数据散点图

代码语言:javascript
运行
复制
scatter(rvs[:,0],rvs[:,1])

票数 7
EN

Stack Overflow用户

发布于 2010-11-09 08:28:43

我认为你把核密度估计和插值或者核回归搞混了。如果你有一个更大的点样本,KDE估计点的分布。

我不确定你想要哪种插值,但scipy.interpolate中的样条或rbf会更合适。

如果您想要一维内核回归,那么您可以在scikits.statsmodels中找到具有多个不同内核的版本。

更新:这里有一个例子(如果这是你想要的)

代码语言:javascript
运行
复制
>>> data = 2 + 2*np.random.randn(2, 100)
>>> kde = stats.gaussian_kde(data)
>>> kde.evaluate(np.array([[1,2,3],[1,2,3]]))
array([ 0.02573917,  0.02470436,  0.03084282])

gaussian_kde在行中有变量,在列中有观察值,因此与通常的统计数据方向相反。在您的示例中,所有三个点都在一条线上,因此它具有完美的相关性。我想,这就是奇异矩阵的原因。

调整数组方向并添加一个小杂点,示例可以工作,但看起来仍然非常集中,例如,您在(3,3)附近没有任何采样点:

代码语言:javascript
运行
复制
>>> data = np.array([[1.1, 1.1],
              [1.2, 1.2],
              [1.3, 1.3]]).T
>>> data = data + 0.01*np.random.randn(2,3)
>>> kde = stats.gaussian_kde(data)
>>> kde.evaluate(np.array([[1,2,3],[1,2,3]]))
array([  7.70204299e+000,   1.96813149e-044,   1.45796523e-251])
票数 4
EN

Stack Overflow用户

发布于 2017-09-20 00:11:58

顶部答案中发布的示例对我不起作用。我不得不稍微调整一下,现在它起作用了:

代码语言:javascript
运行
复制
import numpy as np
import scipy.stats as stats
from matplotlib import pyplot as plt

# Create some dummy data
rvs = np.append(stats.norm.rvs(loc=2,scale=1,size=(2000,1)),
                stats.norm.rvs(loc=0,scale=3,size=(2000,1)),
                axis=1)

kde = stats.kde.gaussian_kde(rvs.T)

# Regular grid to evaluate kde upon
x_flat = np.r_[rvs[:,0].min():rvs[:,0].max():128j]
y_flat = np.r_[rvs[:,1].min():rvs[:,1].max():128j]
x,y = np.meshgrid(x_flat,y_flat)
grid_coords = np.append(x.reshape(-1,1),y.reshape(-1,1),axis=1)

z = kde(grid_coords.T)
z = z.reshape(128,128)

plt.imshow(z,aspect=x_flat.ptp()/y_flat.ptp())
plt.show()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4128699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档