我正在尝试建立一个人们可能宽泛称为自制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方向核带宽。