用Golang实现线性回归
您是否想知道线性回归为什么在统计和
机器学习中起重要作用?它见证了线性回归是常用和良好的最多一个- 了解算法小号。
回归是一种用于计算变量之间关系的统计方法。这是最流行的,最简单的回归技术的一个小号 ,并 是 了解你的数据一个很好的办法。请注意,即使您使用高阶(非线性)多项式,回归技术也不是100%准确的。与大多数机器学习技术一样,回归的关键是找到一个足够好的技术,而不是完美的技术和模型。
这篇文章是从书中掌握围棋的节选-第二版 由 Mihalis Tsoukalos 。 Mihalis 深入研究Go的细微差别,提供了有关类型和结构,包,并发,网络编程和编译器设计的深入指南。在本文中,我们将看到在Go中构建机器学习系统,从简单的统计回归到复杂的
神经网络。
为您的数据建模
线性回归背后的想法很简单:您正在尝试使用一级方程式对数据建模。一级方程可以表示为 y = ax + b 。
有许多方法可以让您找出可以建模数据的一阶方程式-所有技术都可以计算 a 和 b 。
大号inear回归
本节的Go代码将保存在 gression.go中,它将分为三个部分。程序的输出将是两个浮点数,它们 在一级方程式中定义 了a 和 b 。
第一部分 regression.go 包含下面的代码:
import ( "encoding/csv" "flag" "fmt" "gonum.org/v1/gonum/stat" "os" "strconv" ) type xy struct { x []float64 y []float64 }
该 XY 结构用来保存数据,并应根据自己的数据格式和值的变化。
的第二部分 regression.go 如下:
func main(){
flag.Parse()
如果len(flag.Args())== 0 {
fmt.Printf(“用法:回归文件名\ n”)
返回
}
文件名:= flag.Args()[0]
文件,err:= os.Open(文件名)
如果err!= nil {
fmt.Println(err)
返回
}
延迟file.Close()
r:= csv.NewReader(文件)
记录err:= r.ReadAll()
如果err!= nil {
fmt.Println(err)
返回
}
大小:= len(记录)
数据:= xy {
x:make([[float64,size),
y:make([[float64,size),
}
最后一部分 regression.go 如下:
对于我,v:=范围记录{
如果len(v)!= 2 {
fmt.Println(“期望两个元素”)
继续
}
如果s,err:= strconv.ParseFloat(v [0],64); err == nil {
data.y
= s
}
如果s,err:= strconv.ParseFloat(v [1],64); err == nil {
data.x = s
}
}
b,a:= stat.LinearRegression(data.x,data.y,nil,false)
fmt.Printf(“%。4v x +%.4v \ n”,a,b)
fmt.Printf(“ a =%.4v b =%.4v \ n”,a,b)
}
来自数据文件的数据被读入 数据 变量。实现线性回归的函数是 stat.LinearRegression() ,它以特定顺序返回两个数字,分别是 b 和 a 。
此时,是下载gonum 软件包的好时机 :
$ go get -u gonum.org/v1/gonum/stat
执行 regression.go 与存储在输入数据 reg_data.txt 将产生以下输出:
$运行 regression.go reg_data.txt
0.9463 x + -0.3985
a = 0.9463 b = -0.3985
返回的两个数字是 一个 和 b 从 Y = AX + B 的公式。
reg_data.txt 的内容 如下:
$ cat reg_data.txt
1
3
2.1
4
5
-5,-5.1
绘制 数据
现在是时候绘制结果和数据集了,以测试线性回归技术的结果的准确性。为此,我们将使用plotLR.go 的Go代码,该代码分为四个部分。 plotLR.go 需要三个命令行参数,它们是 一个 和 b 从 Y = AX + B 式中,和包含该数据点的文件。plotLR.go 不能单独计算 a 和 b 的事实 使您有机会 使用自己的值或由其他实用程序计算出的值来试验a 和 b 。
plotLR.go 的第一部分 如下:
包主
导入(
“编码/ csv”
“旗”
“ fmt”
“ gonum.org/v1/plot”
“ gonum.org/v1/plot/plotter”
“ gonum.org/v1/plot/vg”
“图像/颜色”
“ os”
“ strconv”
)
输入xy struct {
x [] float64
y [] float64
}
func(d xy)Len()int {
返回len(dx)
}
func(d xy)XY(i int)(x,y float64){
x = dx
y = dy
返回
}
该 LEN() 和 XY() 需要用于绘制部分的方法,而 图像/色彩 是需要在输出改变颜色包。
plotLR.go 的第二部分 包含以下代码:
func main(){
flag.Parse()
如果len(flag.Args())<3 {
fmt.Printf(“用法:plotLR文件名ab \ n”)
返回
}
文件名:= flag.Args()[0]
文件,err:= os.Open(文件名)
如果err!= nil {
fmt.Println(err)
返回
}
延迟file.Close()
r:= csv.NewReader(文件)
a,错误:= strconv.ParseFloat(flag.Args()[1],64)
如果err!= nil {
fmt.Println(a,“无效的浮点数!”)
返回
}
b,错误:= strconv.ParseFloat(flag.Args()[2],64)
如果err!= nil {
fmt.Println(b,“无效的浮点数!”)
返回
}
记录err:= r.ReadAll()
如果err!= nil {
fmt.Println(err)
返回
}
程序的此部分与命令行参数和数据读取一起使用。
plotLR.go 的第三部分 如下:
大小:= len(记录)
数据:= xy {
x:make([[float64,size),
y:make([[float64,size),
}
对于我,v:=范围记录{
如果len(v)!= 2 {
fmt.Println(“每行预期有两个元素!”)
返回
}
s,err:= strconv.ParseFloat(v [0],64)
如果err == nil {
data.y = s
}
s,err = strconv.ParseFloat(v [1],64)
如果err == nil {
data.x = s
}
}
plotLR.go 的最后一部分 如下:
行:= plotter.NewFunction(func(x float64)float64 {return a * x + b})
line.Color = color.RGBA {B:255,A:255}
p,错误:= plot.New()
如果err!= nil {
fmt.Println(err)
返回
}
plotter.DefaultLineStyle.Width = vg.Points(1)
plotter.DefaultGlyphStyle.Radius = vg.Points(2)
散点图,错误:= plotter.NewScatter(data)
如果err!= nil {
fmt.Println(err)
返回
}
scatter.GlyphStyle.Color = color.RGBA {R:255,B:128,A:255}
p.Add(散点图,行)
w,err:= p.WriterTo(300,300,“ svg”)
如果err!= nil {
fmt.Println(err)
返回
}
_,err = w.WriteTo(os.Stdout)
如果err!= nil {
fmt.Println(err)
返回
}
}
使用plotter.NewFunction() 方法定义将要绘制的函数 。
此时,您应该通过执行以下命令来下载一些外部软件包:
$ go get -u gonum.org/v1/plot
$ go get -u gonum.org/v1/plot/plotter
$ go get -u gonum.org/v1/ plot / vg
执行 plotLR.go 将生成以下类型的输出:
$运行 plotLR.go reg_data.txt
用法: plotLR 文件名ab
$运行 plotLR.go reg_data.txt 0.9463 -0.3985
<?xml version =“ 1.0”?>
<!- 由SVGo 和 Plotinum VG 生成 ->
/ span> svg width =“ 300pt” height =“ 300pt” viewBox =“ 0 0 300 300”
xmlns =“ http://www.w3.org/2000/svg”
xmlns:xlink =“ http://www.w3.org/1999/xlink”>
<g transform =“ scale(1,-1)translate(0,-300)”>
。
。
。
因此,在使用生成的输出之前,应将其保存在文件中:
$去运行plotLR.go reg_data.txt 0.9463 -0.3985> output.svg
由于输出为 可缩放矢量图形 (SVG)格式,因此应将其加载到Web浏览器中才能查看结果。下图显示了我们数据的结果。
图1:plotLR的输出。去程序
图像的输出还将显示如何使用线性方程式对数据进行建模。
深入研究Go中的机器学习,指导您从基础统计技术到简单的回归和聚类,再到分类,神经网络和异常检测。从Mihalis Tsoukalos 编写的最新著作Mastering Go- Second Edition成为Go的专家 。

关注 CDA人工智能学院 ,回复“录播”获取更多人工智能精选直播视频!