背景
破电脑装不了VS、Py、IDea、Golang等主流编译器或其语言运行环境,但是自带.Net FrameWork 3.5,可以使用VBScript进行脚本编写,无所谓,反正都是了解底层原理学习,大不了手搓机器学习框架。
分析
了解线性回归的深度学习算法原理之后,就可以使用vbs进行代码实现,深入体会这个算法的精髓了。
假设有训练集
x(10)={1,2,3,4,5,6,7,8,9,10}
y(10)={11,21,31,41,51,61,71,81,91,101}
相信大家已经看出来了,y(i)=x(i)*10+1,其中i=0~9
但是计算机是不知道这个的,我们需要告诉计算机算法,让它自己求出系数k=10,截距b=1,然后让它计算测试集
input(11)={20,21,22,23,24,25,26,27,28,29,30}对应的结果output(11)的值
定义求和函数Result,进行前向运算
' 前向运算
Function Result(x,k,b)
Result=x*k+b
End Function
定义损失函数Loss,进行损失求值
' 损失值
Function Loss(res,y)
Loss=(res-y)^2/2
End Function
系数k、截距b初始化为0~1的一个随机数
' 随机种子
Randomize
' 初始给k、b随机赋值
Dim k,b
k=Rnd()
b=Rnd()
迭代500轮训练后,得到结果
可以看出,结果符合预期,算法掌握得还可以,代码结构化、模式化、工程化还有待提高,望与诸君再接再厉。
完整代码[main.vbs]
' 启用显式编程风格,所有变量使用前必须定义
Option Explicit
' 简单封装输出函数
Sub Echo(s)
Wscript.Echo s
End Sub
' 训练数据 x、y
Dim x:x=Array(1,2,3,4,5,6,7,8,9,10)
Dim y:y=Array(11,21,31,41,51,61,71,81,91,101)
' 随机种子
Randomize
' 初始给k、b随机赋值
Dim k,b
k=Rnd()
b=Rnd()
' 前向运算
Function Result(x,k,b)
Result=x*k+b
End Function
' 损失值
Function Loss(res,y)
Loss=(res-y)^2/2
End Function
' 训练轮数
Dim epoch:epoch=500
' 学习率
Dim lr:lr=0.01
Dim i,j
' 预测值
Dim yh
' 损失总和
Dim ls
' 系数损失
Dim kh
' 截距损失
Dim bh
' 训练
For i=0 To epoch
For j=0 To UBound(x)
yh=Result(x(j),k,b)
ls=Loss(yh,y(j))
kh=(yh-y(j))*x(j)
bh=yh-y(j)
k=k-kh*lr
b=b-bh*lr
Echo ls
Next
Next
' k、b保留最后三位小数
Echo "k="&k
Echo "b="&b
Echo "保留三位小数"
k=Round(k,3)
b=Round(b,3)
Echo "k="&k
Echo "b="&b
' 测试集
Dim input:input=Array(20,21,22,23,24,25,26,27,28,29,30)
Dim output
For i=0 To UBound(input)
output=Result(input(i),k,b)
' 结果保留三位小数
output=Round(output,3)
Echo input(i)&"*"&k&"+"&b&"="&output
Next