我记得我去年做过一次梯度下降的程序,用的是CSDN一位博主的方法,然后过了好久也没在意,这次终于有时间继续学习机器学习。
不过我从这里学习梯度下降的时候,我看不懂numpy代码,我就试试能不能用Julia对照原理来一遍,但是我调试的时候发现得到的Theta越来越大,我也不知道我哪里写错了,请各位帮我看看
function sgd(lr,X,Y)
m = size(X)[1]
Θ = vcat(X[1,:],1)
# X: n * m
# w: m * 1
# 模型函数
linreg(w,b) = map(x->x+b,X*w)
# 梯度损失 导数
derive_lose(Θ) = begin
y = linreg(Θ[1:end-1],Θ[end])
1/m * reduce(+,
map(i->vcat(X[i,:],1) * (y[i] - Y[i]),1:m))
end
limit = 0.001
# 梯度下降 迭代
iter = function iter(Θ,gradient,count)
if all(x->abs(x) < limit,
map(num->lr*num,gradient)) || count == 100
Θ
else
Θ_next = Θ - lr * gradient
gradient_next = derive_lose(Θ_next)
iter(Θ_next,gradient_next,count+1)
end
end
iter(Θ,derive_lose(Θ),1)
end
测试方法:
矩阵X为reshape(1:100,(100,1))
,
矩阵Y为map(+,X,rand(-0.1:0.02:0.1,100))
学习率lr = 0.01
测试sgd(lr,X,Y)