今天先从简单的线性回归入门

这几天去在B站学习吴恩达老师的机器学习课程,从最简单的线性代数入手,非常有感觉,今天试着写一篇学习笔记吧,但是多媒体那些画图不怎么会,只好调最重要的讲了。
今天只模拟了一下h\theta(x)=\theta1x,
h\theta(x)=\theta0+\theta1x的情况还不会,毕竟能力有限


简单来说,这里需要一个假设函数来对这些点拟合,设这个假设函数为h\theta(x)=\theta0+\theta1x,为了简便,我使这些点都接近y=x这条直线,此时 \theta0=0。 并把他们保存在数据框df中,其中x=1:6,保存在L1 。L2保存对应的y值


这个假设函数生成的直线拟合这些点时并不是都能和每个点拟合(其实这个名词我不太懂),所以我们引入一个代价函数J(\theta1)来表示误差。这里设J(\theta1)= 1/2m * sum( (h\theta(x(i))-y(i))2),为了计算方便,取 \theta1=-50:1:50

代价函数表示出来后需要求 \theta1,不过这个用代码写我好像不怎么会,只知道要不断更新 \theta1
\theta1 :=\theta1- \alpha * J'(\theta)(这里导数不会打)直到导数接近0

代码我写这了

import CSV
using DataFrames
using Plots

df=CSV.read("list.csv")#list.csv保存了原始的x,y数据

list=[x for x in -50:50]#这个list用来辅助下面的symbollist
symbollist=[Symbol(:D,x) for x in list]#用来命名df中的列名

for θ1 in -50:50
    df[!,symbollist[θ1+51]] = df[!,:L2] * θ1 #hθ(x) = θ1*x
end


list=Vector{Float64}(undef,101)#名字一样,不过无所谓啦,这里用作代价函数

for i in -50:50
    list[i+51] = sum((df[!,symbollist[i+51]] - df[!,:L2]).^2)/50 
end

scatter(-50:1:50,list)

这是list.csv
L1,L2
1,1.1
1,0.9
1,1.0
2,2.1
2,2.2
2,1.95
2,1.99
3,2.9
3,2.89
3,2.97
3,2.9
4,3.8
4,4.1
4,4.2
4,3.98
4,3.99
5,4.988
5,4.97
5,5.001
5,5.0
5,5.005
6,6.001
6,5.999
6,6.002
6,5.899

另外这个更新 \theta1的代码有点不想写,有哪位能借我抄一下:grin:
顺便问一下有 \theta0时这个代码逻辑是怎么样的?

理论上可以构造一个x = [x 1], 这样θ0就被"吸收"进θ1里面了;但是在具体写代码的时候就交替更新就行了,大概意思是指

dθ0, dθ1 = grad(f, x)
θ0 = θ0 - a*dθ0
θ1 = θ1 - a*dθ1

顺便问一下

df[!,symbollist[θ1+51]] = df[!,:L2]

这里面的感叹号是指啥意思呀?

以前的写法被弃用了,这个是被REPL提示的写法,自己可以试试