【问题标题】:Gaussian summation for 2D scatter plots using python使用python对二维散点图进行高斯求和
【发布时间】:2018-09-02 06:12:41
【问题描述】:

我想确定人们会松散地称为自制 KDE 的东西 - 我想。我正在尝试评估一组相当大的数据点的密度。特别是,对于散点图有很多数据点,我想使用颜色渐变来表示密度(请参见下面的链接)。

为了举例,我在下面提供了一对随机的 (x,y) 数据。真实数据会分布在不同的尺度上,因此 X 和 Y 网格点间距存在差异。

import numpy as np
from matplotlib import pyplot as plt

def homemadeKDE(x, xgrid, y, ygrid, sigmaX = 1, sigmaY = 1):

    a = np.exp( -((xgrid[:,None]-x)/(2*sigmaX))**2 )
    b = np.exp( -((ygrid[:,None]-y)/(2*sigmaY))**2 ) 

    xweights = np.dot(a, x.T)/np.sum(a)
    yweights = np.dot(b, y.T)/np.sum(b)  

    return xweights, yweights

x = np.random.rand(10000)
x.sort()
y = np.random.rand(10000)

xGrid = np.linspace(0, 500, 501)
yGrid = np.linspace(0, 10, 11)

newX, newY = homemadeKDE(x, xGrid, y, yGrid)

我坚持的是,如何将这些值投影回原始 x 和 y 向量,以便我可以使用它来绘制 2D 散点图 (x,y),其中 az 值为给定颜色着色的密度像这样的地图:

plt.scatter(x, y, c = z, cmap = "jet")

绘图和 KDE 方法实际上是受到这个伟大的 answer 的启发

编辑 1 为了消除一些混乱,这个想法是做一个高斯 KDE,它会在一个更粗糙的网格上。 SigmaX 和 sigmaY 分别反映内核在 x 和 y 方向的带宽。

【问题讨论】:

  • 我在理解代码时遇到了一些问题。函数中的参数是否与调用函数的方式相反?什么是大写X?最后但并非最不重要的一点是,这个函数的目的是什么?
  • 修正了语法。很抱歉。
  • 不过,这些权重是多少?为什么两个权重都计算为具有相同x 的产品?
  • 权重只是对遵循此定义的点的基于网格的权重:mccormickml.com/2014/02/26/kernel-regression
  • 也许这会有所帮助,看看如何生成多变量 KDE:sebastianraschka.com/Articles/…

标签: python numpy matplotlib gaussian kde


【解决方案1】:

我实际上——稍加思考——能够自己解决问题。还要感谢帮助和有见地的 cmets。

import numpy as np
from matplotlib import pyplot as plt

def gaussianSum1D(gridpoints, datapoints, sigma=1):

    a = np.exp( -((gridpoints[:,None]-datapoints)/sigma)**2 )

    return a

#some test data
x = np.random.rand(10000)
y = np.random.rand(10000)

#create grids
gridSize = 100
xedges = np.linspace(np.min(x), np.max(x), gridSize)
yedges = np.linspace(np.min(y), np.max(y), gridSize)

#calculate weights for both dimensions seperately
a = gaussianSum1D(xedges, x, sigma=2)
b = gaussianSum1D(yedges, y, sigma=0.1)

Z = np.dot(a, b.T).T

#plot original data
fig, ax = plt.subplots()
ax.scatter(x, y, s = 1)
#overlay data with contours 
ax.contour(xedges, yedges, Z, cmap = "jet")

【讨论】:

  • 感谢您指出这一点。但是,一份清晰的错误报告将有助于修复代码。
  • TypeError: unsupported operand type(s) for *: 'NoneType' and 'float' 是错误消息,但现在已修复。
猜你喜欢
  • 2019-02-08
  • 2015-08-02
  • 2015-01-17
  • 2019-03-03
  • 2014-02-14
  • 2015-07-21
  • 1970-01-01
  • 2013-09-12
  • 2020-08-05
相关资源
最近更新 更多