将在Python中创建热图的算法是内核密度估计(KDE)。
导入库实际上,Python中有一些库可用于创建热图,例如Scikit-learn或Seaborn。但是我们将只使用一些库,例如matplotlib,numpy和math。因此,我们从导入这三个库开始。
- import matplotlib.pyplot as plt
- import numpy as np
- import math
- X = [ 20,28,15,20,18,25,15,18,18,20,25,30,25,22,30,22,38,40,38,30,22,20,35,33 ]
- ÿ = [ 20,14,15,20,15,20,32,33,45,50,20,20,20,25,30,38,20,28,33,50,48,40,30,35 ]
网格大小和半径
使用KDE创建热图时,我们需要指定内核形状的带宽或半径以及输出网格的大小。对于这种情况,我使用半径10 m和栅格大小1 m。稍后,您可以更改这些参数以查看它们如何影响热图结果。
- grid_size = 1
- h = 10
要构建网格,我们使用网格。因此,我们需要找到x,y的最小值和最大值以生成x和y的序列号。然后,这些序列号将用于构建网格。为了包括所有具有更大空间的数据集覆盖范围,我用半径减去x,y最小值,然后将其相加为x,y最大值。
- #GETTING X,Y MIN AND MAX
- x_min=min(x)
- x_max=max(x)
- y_min=min(y)
- y_max=max(y)
- #CONSTRUCT GRID
- x_grid=np.arange(x_min-h,x_max+h,grid_size)
- y_grid=np.arange(y_min-h,y_max+h,grid_size)
- x_mesh,y_mesh=np.meshgrid(x_grid,y_grid)
构造完网格后。接下来,我们计算每个网格的中心点。这可以通过将x网格和y网格坐标与网格大小的一半相加来完成。稍后将使用中心点来计算每个网格到数据集点的距离。
- xc=x_mesh+(grid_size/2)
- yc=y_mesh+(grid_size/2)
为了计算点密度或强度,我们使用了一个称为kde_quartic的函数。我们正在使用四次核形状,这就是为什么它在函数名称中使用“四次”项的原因。此函数有两个参数:点距离(d)和核半径(h)。
- #使用正交核计算强度的功能
- def kde_quartic(d,h):
- dn = d / h
- P =(15/16)*(1- dn ** 2)** 2
- return P
这是这篇文章中最难的部分。计算每个网格的密度值。我们通过三个循环来执行此操作。第一个循环用于网格数据列表或网格。这些网格的每个中心点的第二个循环,以及计算中心点到每个数据集点的距离的第三个循环。使用距离,然后使用之前已定义的kde_quartic函数计算每个网格的密度值。它将返回到数据点每个距离的密度值。在这里,我们仅考虑在内核半径内具有一定距离的点。我们不考虑核半径之外的点,而是将密度值设置为0。然后,我们将网格的所有密度值求和,以获得各个网格的总密度值。然后,将总密度值存储在一个列表中,该列表为称为强度列表。
intensity_list=[]
for j in range(len(xc)):
intensity_row=[]
for k in range(len(xc[0])):
kde_value_list=[]
for i in range(len(x)):
#CALCULATE DISTANCE
d=math.sqrt((xc[j][k]-x)**2+(yc[j][k]-y)**2)
if d<=h:
p=kde_quartic(d,h)
else:
p=0
kde_value_list.append(p)
#总和所有强度值
p_total=sum(kde_value_list)
intensity_row.append(p_total)
intensity_list.append(intensity_row)
最后一部分,我们使用matplotlib彩色网格可视化结果。我们还添加了一个颜色条以查看强度值。热图结果如图2所示。
- #HEATMAP输出
完整的代码段可以在下面找到。
- import matplotlib.pyplot as plt
- import numpy as np
- import math
- #POINT DATASET
- x=[20,28,15,20,18,25,15,18,18,20,25,30,25,22,30,22,38,40,38,30,22,20,35,33,35]
- y=[20,14,15,20,15,20,32,33,45,50,20,20,20,25,30,38,20,28,33,50,48,40,30,35,36]
- #DEFINE GRID SIZE AND RADIUS(h)
- grid_size=1
- h=10
- #GETTING X,Y MIN AND MAX
- x_min=min(x)
- x_max=max(x)
- y_min=min(y)
- y_max=max(y)
- #CONSTRUCT GRID
- x_grid=np.arange(x_min-h,x_max+h,grid_size)
- y_grid=np.arange(y_min-h,y_max+h,grid_size)
- x_mesh,y_mesh=np.meshgrid(x_grid,y_grid)
- #GRID CENTER POINT
- xc=x_mesh+(grid_size/2)
- yc=y_mesh+(grid_size/2)
- #FUNCTION TO CALCULATE INTENSITY WITH QUARTIC KERNEL
- def kde_quartic(d,h):
- dn=d/h
- P=(15/16)*(1-dn**2)**2
- return P
- #PROCESSING
- intensity_list=[]
- for j in range(len(xc)):
- intensity_row=[]
- for k in range(len(xc[0])):
- kde_value_list=[]
- for i in range(len(x)):
- #CALCULATE DISTANCE
- d=math.sqrt((xc[j][k]-x[i])**2+(yc[j][k]-y[i])**2)
- if d<=h:
- p=kde_quartic(d,h)
- else:
- p=0
- kde_value_list.append(p)
- #SUM ALL INTENSITY VALUE
- p_total=sum(kde_value_list)
- intensity_row.append(p_total)
- intensity_list.append(intensity_row)
- #HEATMAP OUTPUT
- intensity=np.array(intensity_list)
- plt.pcolormesh(x_mesh,y_mesh,intensity)
- plt.plot(x,y,'ro')
- plt.colorbar()
- plt.show()
这就是使用KDE从头开始在Python中创建热图的所有方法。还有其他可用的内核形状,例如高斯,三重,Epanechnikov,三角等。请随意添加这些内核形状并修改代码。尝试通过更改一些参数(例如半径和栅格大小)进行实验,并探索结果。


雷达卡




京公网安备 11010802022788号







