回归树是提升树的基础, 算法之前已经说过了, 现在用golang实现了一个多线程的版本, 由于没有用矩阵库,看起来比会比较啰嗦. 基本思想是通过一个函数收集所有叶子节点的地址, 然后并行地对叶子节点进行展开.
package main
import (
"bufio"
"fmt"
"io"
"os"
"sort"
"strconv"
"strings"
"sync"
)
//定义向量
type Vector []float32
//为了排序定义下面的方法
func (v Vector) Len() int {
return len(v)
}
func (v Vector) Less(i, j int) bool {
return v[i] < v[j]
}
func (v Vector) Swap(i, j int) {
v[i], v[j] = v[j], v[i]
}
func (v Vector) Mean() (res float32) {
for _, value := range v {
res += value
}
return res / float32(v.Len())
}
//定义向量组
type Data []Vector
type MSETree struct {
data Data
index []int
left *MSETree
right *MSETree
c float32
isLeaf bool
j int
s float32
}
//预测一个点的输出
func (node *MSETree) Predict(point Vector) float32 {
p := node
for {
if p.isLeaf {
return p.c
}
if point[p.j] < p.s {
p = p.left
} else {
p = p.right
}
}
}