Python 中的空间精度分析
Spatial Accuracy Analysis in Python
我有一个,希望,我想在 python 中执行简单的空间分析。但是,我还没有完全弄清楚如何让 python 做我想让它做的事。
我有一个包含 3 个关键列的 CSV 文件:命中或未命中、X 位置、Y 位置。每行都是一个实例,说明是否发生了命中或未命中,以及该命中或未命中的 x 和 y 坐标(例如,"hit, 10, 58")。
为了给您一个更好的画面,假设有数十万个这样的点,它们都落在 100 x 100 网格中的某个位置(其中 0,0 = 左下角,100,100 = 右上角)。命中和未命中分布在整个网格中,其中一些位置的命中和未命中重叠,一些位置只有命中或只有未命中,而一些位置两者都没有。
我的最终目标是制作一个热图,以可视化整个网格的相对准确性(命中/(命中+未命中))。
我能想到的最好的主意是在同一个散点图上绘制命中和未命中,降低点的不透明度,让点的密度决定色调,然后代表相对准确度....但这看起来很糟糕....
我的下一个想法是制作垃圾箱。因此,网格将被分成 50 个 2x2 的箱子,我会让我的程序对每个箱子执行准确度分析(命中/(命中+未命中))。但是,唉,我不知道该怎么做。
有人有什么想法吗?
谢谢!
您可以使用 scipy.stats 中的核密度估计器。我认为这应该做你想要的。它将显示数据倾向于聚集的位置。 KDE 将建立二维概率密度的估计。然后,您在 100x100 网格上评估该 KDE 估计器。您可以使用计数器图绘制结果。
您的代码可能如下所示:
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)
我有一个,希望,我想在 python 中执行简单的空间分析。但是,我还没有完全弄清楚如何让 python 做我想让它做的事。
我有一个包含 3 个关键列的 CSV 文件:命中或未命中、X 位置、Y 位置。每行都是一个实例,说明是否发生了命中或未命中,以及该命中或未命中的 x 和 y 坐标(例如,"hit, 10, 58")。
为了给您一个更好的画面,假设有数十万个这样的点,它们都落在 100 x 100 网格中的某个位置(其中 0,0 = 左下角,100,100 = 右上角)。命中和未命中分布在整个网格中,其中一些位置的命中和未命中重叠,一些位置只有命中或只有未命中,而一些位置两者都没有。
我的最终目标是制作一个热图,以可视化整个网格的相对准确性(命中/(命中+未命中))。
我能想到的最好的主意是在同一个散点图上绘制命中和未命中,降低点的不透明度,让点的密度决定色调,然后代表相对准确度....但这看起来很糟糕....
我的下一个想法是制作垃圾箱。因此,网格将被分成 50 个 2x2 的箱子,我会让我的程序对每个箱子执行准确度分析(命中/(命中+未命中))。但是,唉,我不知道该怎么做。
有人有什么想法吗?
谢谢!
您可以使用 scipy.stats 中的核密度估计器。我认为这应该做你想要的。它将显示数据倾向于聚集的位置。 KDE 将建立二维概率密度的估计。然后,您在 100x100 网格上评估该 KDE 估计器。您可以使用计数器图绘制结果。
您的代码可能如下所示:
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)