使用python的2D散点图的高斯求和

时间:2018-03-23 14:22:36

标签: python numpy matplotlib gaussian kde

我想确定人们会松散地称之为自制的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矢量,以便我可以用它绘制二维散点图(x,y),其中z值为给定颜色着色的密度像这样的地图:

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

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

的启发

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

1 个答案:

答案 0 :(得分:0)

我实际上是有点想法自己解决问题。还要感谢帮助和富有洞察力的评论。

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).sort()
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")