我有3D數據集(X,Y,Z)。我想執行KDE,繪製數據和估計。然後,獲得過零點並用KDE繪製它。我的嘗試如下。我有以下問題:如何在python中繪製3D數據的核心密度估計(KDE)和過零點?
- 線
X, Y = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
和positions = np.vstack([X.ravel(),Y.ravel(),Z.ravel()])
爲here(KDE文檔)將他們在可視化的原始數據真實估計任何影響?我真的不明白爲什麼我必須使用我的min和max來執行KDE,然後使用ravel()
? 爲什麼我要轉的
f = np.reshape(kernel(positions).T, X.shape)
的數據是正確的代碼?
我失敗過零密謀與KDE估計和KDE估計/原始數據的原始數據:
應該過零點是矢量?在下面的代碼它的元組
df = pd.read_csv(file, delimiter = ',') Convert series from data-frame into arrays X = np.array(df['x']) Y = np.array(df['y']) Z = np.array(df['z']) data = np.vstack([X, Y, Z]) # perform KDE kernel = scipy.stats.kde.gaussian_kde(data) density = kernel(data) fig, ax = plt.subplots(subplot_kw=dict(projection='3d')) x, y, z = data scatter = ax.scatter(x, y, z, c=density) xmin = values[0].min() xmax = values[0].max() ymin = values[1].min() ymax = values[1].max() zmin = values[2].min() zmax = values[2].max() X,Y, Z = np.mgrid[xmin:xmax:100j,ymin:ymax:100j,zmin:zmax:100j] positions = np.vstack([X.ravel(),Y.ravel(),Z.ravel()]) f = np.reshape(kernel(positions).T, X.shape) derivative = np.gradient(f) dz, dy, dx = derivative xdiff = np.sign(dx) # along X-axis ydiff = np.sign(dy) # along Y-axis zdiff = np.sign(dz) # along Z-axis xcross = np.where(xdiff[:-1] != xdiff[1:]) ycross = np.where([ydiff[:-1] != ydiff[1:]]) zcross = np.where([zdiff[:-1] != zdiff[1:]]) Zerocross = xcross + ycross + zcross
三維數據加密度總共是四維的。以有意義的方式可視化這些數據非常困難。 2-D KDE非常容易操作(如果使用'seaborn',只需一行)。也許考慮通過PCA降維來將3D轉換爲2D而不會丟失太多信息。 –
因爲'scipy.stats.gaussian_kde'確切地計算了KDE,所以永遠不會出現零交叉(除了在無窮遠處)。你想解決什麼問題? –
@JoeKington它看起來像她想估計內核密度函數的導數的零交叉 –