具有强度的热图算法

时间:2019-05-07 20:29:34

标签: algorithm math

我正在研究一个热图(对于这种情况,这可能是一个不正确的术语),用户将获得包含坐标和强度值的点。我所见过的每个实现都基于颜色的点密度,这不是我想要的。我一直在研究此主题一两天,并且一直在尝试寻找从坐标生成这种热图的最佳方法。

我目前一直在研究多变量内核密度估计,并且不确定这是否是正确的方法。我曾想过使用3d向量,其中x和y为坐标,z为强度,但是我不确定这是否可行。我看到的所有示例都是基于点密度的颜色。

当前我正在使用以下代码:

for p in points{ // loop over all measured points
    // points are stored in a dict with the key being x+y*NUM_COL
    let pX = p.key % NUM_COL
    let pY = p.key / NUM_COL
    let intensity = points[p.key]!.getAvg()

    // loop over all surrounding points within square with size of radius * 2
    for i in 0..<Int(pow(Double(2*RADIUS),2)){
        let dX = (i % (2*RADIUS)) - RADIUS
        let dY = (i / (2*RADIUS)) - RADIUS
        let x = pX + dX
        let y = pY + dY
        let dist = (pow(Double(x-pX),2) + pow(Double(y-pY),2)).squareRoot()
        // check if coordinate is in bounds and is not a measured value
        if (x < 0 || x >= NUM_COL || y < 0 || y >= NUM_ROW || dist > Double(RADIUS) || points[x+y*NUM_COL] != nil){
            continue
        }
        grid[y][x] += intensity * (1 - (dist/RADIUS))
    }
}

结果类似(黑点是测量点):

Heatmap

我的问题是,无论是在性能上还是视觉上,我都可以做些什么来改善它? 我应该继续推动mvkde的发展吗?有没有更好的方法来查找循环更少的值?

注意:

  • 使用50个测量点,屏幕(768,1024),网格(768,1024),半径40生成了图片,并花费6:21生成数据并绘制到屏幕上

  • 切换到(768/4,1024/4)的网格大小和15的半径需要15-20秒,这是生成的图片:lower res

  • 我希望将其用作动态地图上的覆盖(会发生滚动和缩放),其数据集介于100到50000个测量点之间(尽管我在考虑是否这样做了)将需要结合一些观点)。但是,即使叠加层花了不到30秒的时间出现在地图上,也没问题

1 个答案:

答案 0 :(得分:0)

由于@NicoSchertler,我一直在寻找“分散的数据插值”