-1

うまくいけば、Pythonで実行したい単純な空間分析があります。ただし、Python でやりたいことを実行させる方法を完全には理解していません。

ヒットまたはミス、X ロケーション、Y ロケーションの 3 つの重要な列を含む CSV ファイルがあります。各行は、ヒットまたはミスが発生したかどうか、およびそのヒットまたはミスの x 座標と y 座標が何であったか (たとえば、「ヒット、10、58」) のインスタンスです。

分かりやすくするために、これらの点が何十万もあり、すべてが 100 x 100 グリッド (0,0 = 左下隅、100,100 = 右上隅) 内のどこかにあると想像してください。ヒットとミスはグリッド全体に分散され、一部の場所ではヒットとミスが重複し、一部の場所ではヒットのみまたはミスのみが発生し、一部の場所ではどちらも発生しません。

私の最終的な目標は、グリッド全体の相対精度 (ヒット/(ヒット + ミス)) を視覚化するヒート マップを作成することです。

私が思いついた最良のアイデアは、ヒットとミスを同じ散布図にプロットし、ポイントの不透明度を減らし、ポイントの密度によって色相が決定されるようにすることです。これにより、相対的な精度が表されます... .しかし、これはひどいように見えます....

私の次のアイデアはビンを作ることです。したがって、グリッドは 50 個の 2x2 ビンに分割され、プログラムで各ビンの精度分析 (ヒット/(ヒット + ミス)) を実行します。しかし、残念ながら、これを行う方法がわかりません。

誰にもアイデアはありますか?

ありがとう!

4

1 に答える 1

0

scipy.stats の Kernel Density Estimator を使用できます。これはあなたが望むことだけを行うべきだと思います。データがクラスター化する傾向がある場所を示します。KDE は 2 次元確率密度の推定値を作成します。次に、その KDE エスティメーターを 100x100 グリッドで評価します。カウンター プロットを使用して結果をプロットできます。

コードは次のようになります。

import numpy as np
from scip.stats import kde
import matplotlib.pyplot as plt

ndiv = 101
xr = np.linspace(0.0, 100.0 ndiv)
yr = np.linspace(0.0, 100.0 ndiv)
x,y = np.meshgrid(xr, yr)

# points here would be your 'hits' or 'miss' subset
estimator = kde.gaussian_kde(points)

# this turns the grid into a list of points that will
# be used by the KDE for evaluation
grid_coords = np.append(x.reshape(-1, 1), y.reshape(-1, 1), axis=1)
z = estimator(grid_coords.T)
z = z.reshape(ndiv, ndiv)

# you can specify contour levels
lvls = np.array([.05, .5, .75, 1.0]) * z.max()  
cfset = plt.contourf(x, y, z, cmap='jet', levels=lvls)
于 2016-06-17T16:20:35.193 に答える