使用高斯分布生成 HeatMap
如图,需要对数据集生成对应的 HeatMap 数据,中心点值为1,向四周生成一个高斯分布。
高斯分布又叫正态分布,最近武汉新型冠状病毒的确诊人数应该就是一个很类似正态分布的图,虽然还不知道什么时候会是高峰期。
正态分布的概率密度函数为 $$f(x)=\frac{1}{\sqrt{2\pi}\sigma}e^\frac{(x-\mu)^2}{2\sigma^2}$$,对应图像如下:
根据这个公式,就可以写出生成一维高斯分布的函数:
def get_gauss(n):
u = 0 # 均值μ
sig = math.sqrt(1) # 标准差δ
x = np.linspace(u - 3*sig, u + 3*sig, n)
y = np.exp(-(x - u) ** 2 / (2 * sig ** 2))/(math.sqrt(2*math.pi)*sig)
y = normalize(y)
return y
注意此时生成的高斯分布数据还需要进行归一化:
def normalize(x):
max = x.max()
min = x.min()
return (x - min) / (max - min)
最后将两个一维的高斯分布矩阵相乘即可,完整代码如下:
import numpy as np
import math
import cv2
def normalize(x):
max = x.max()
min = x.min()
return (x - min) / (max - min)
def get_gauss(n):
u = 0 # 均值μ
sig = math.sqrt(1) # 标准差δ
x = np.linspace(u - 3*sig, u + 3*sig, n)
y = np.exp(-(x - u) ** 2 / (2 * sig ** 2))/(math.sqrt(2*math.pi)*sig)
y = normalize(y)
return y
if __name__ == "__main__":
WIDTH = 128
HEIGHT = 64
gauss1 = get_gauss(WIDTH).reshape(WIDTH, 1)
gauss2 = get_gauss(HEIGHT).reshape(1, HEIGHT)
# print(gauss1.shape, gauss2.shape)
gauss_matrix = gauss1 * gauss2
gauss_matrix = gauss_matrix * 255
print(gauss_matrix.shape)
cv2.imwrite('gauss_test.png', gauss_matrix)
宽高写反啦
谢谢,已更改
为什么这里的高斯分布数据还需要进行归一化呀
均值μ控制x轴偏移,标准差δ控制分布斜率,这样y轴最大值肯定是会比1小。但是想生成的heatmap期望是要顶到1,否则不归一化最大值一定比1小,学到的特征整体权重就会偏小,模型效果会比较差。比如图中红线最大值只有0.4,那就全是负样本了