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]]
计算量并不大,自己在纸上计算一下,发现是正确的,那么就没问题