Go语言 距离矩阵的计算

  在数据分析中,尤其是多元统计分析,距离矩阵的计算无处不在,Go语言计算距离矩阵需要:二元切片计算,和一些向量运算

 

计算步骤:

  两个向量(go语言切片),向量做差,向量元素平方和。分别由以下三个函数实现(需要import "math")

func subtract(v1 []float64, v2 []float64) []float64 {
    var res []float64
    var n int = len(v2)
    for i := 0; i < n; i++ {
        res = append(res, v1[i]-v2[i])
    }
    // fmt.Println(res)
    return res
}

func square(v []float64) []float64 {
    var res []float64
    var n int = len(v)
    for i := 0; i < n; i++ {
        res = append(res, v[i]*v[i])
    }
    return res
}

func sum(slice []float64) float64 {
    var result float64 = 0
    for i := 0; i < len(slice); i++ {
        result += slice[i]
    }
    return result
}

  然后计算距离矩阵,取矩阵中任意两行计算其做差平方和的平方根(向量之间的欧氏距离),两两计算一次。假如矩阵是m行的,会得到m*m个结果,刚好距离矩阵是对角线为0的对称方阵,计算如下:

func distance(M [][]float64) [][]float64 {
    var m, n int = len(M), len(M[0])
    var dist [][]float64
    for i := 0; i < m; i++ {
        var temp float64 = 0
        var tempSlice []float64
        for j := 0; j < m; j++ {
            temp = sum(square(subtract(M[i], M[j])))
            tempSlice = append(tempSlice, math.Sqrt(temp))
        }
        dist = append(dist, tempSlice)
    }
    return dist
}

计算案例:

Example:主函数中编写如下代码(import "fmt")

        M := [][]float64{

               {4, 2, 8, 7},

               {3, 5, 6, 9},

               {4, 2, 4, 4},

        }

        var d = distance(M)

        fmt.Println(d)

结果如下:

[[0 4.242640687119285 5]

[4.242640687119285 0 6.244997998398398]

[5 6.244997998398398 0]]

计算量并不大,自己在纸上计算一下,发现是正确的,那么就没问题

posted @ 2021-01-20 17:42  倦鸟已归时  阅读(476)  评论(0编辑  收藏  举报