hangscer

我的第一个ML算法(linear regression gradient descent)

2017/05/12

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
object Main extends App{
def 0:Double1:Double,x:Double):Double01*x
def costFunction0:Double1:Double):Double={
val m=data.size
var squreSum=0.0
data.foreach{case (x,y)=>{
squreSum+= (Hθ(θ01,x)-y)*(Hθ(θ01,x)-y)
}}
squreSum/(2.0*m)
}
val data=List((3,4),(2,1),(4,3),(0,1))//数据集比较少 😂
val α=0.1 //learning rate
var θ0=0.0 //参数1
var θ1=0.0 //参数2
var temp=0.0 // 累积和 变量
val m:Double=data.size*1.0 // 数据个数
breakable{
for(i<- 1 to 10000){ //最大迭代10000
temp=0.0
data.foreach{case (x,y)=>{
temp=temp+ Hθ(θ01,x)-y
}}
val tempθ0 = α*(1.0/m)*temp //记录变化
θ00 - α*(1.0/m)*temp
temp=0.0
data.foreach{case (x,y)=>{
temp=temp+(Hθ(θ01,x)-y)*x
}}
val tempθ1 = α*(1.0/m)*temp //记录变化
θ11- α*(1.0/m)*temp
if(doesEqualZero(tempθ0) && doesEqualZero(tempθ1))
break() //变化已经很小时 break退出迭代
}
}
println(s"θ0:$θ0 θ1:$θ1")
def doesEqualZero(a:Double):Boolean=if(a<=0.0001 && a >= -0.0001) true else false
val xs=for(item<-data)yield item._1
val ys=for(item<-data) yield item._2
val xs1=for(i<- -100 to 100)yield i
val ys1=for(x <- xs1)yield Hθ(θ01,x)
val p=Plot().withScatter(xs,ys,ScatterOptions().mode(ScatterMode.Marker))
.withScatter(xs1,ys1,ScatterOptions().mode(ScatterMode.Line))
draw(p,"ML")
}

结果为(数据可视化采用的是plot.ly,支持scala):


回归是从已知的数据集来预测另一个数值型的目标值.比如房子的价格与房子的面积,房间个数等等有关.假设他们满足线性关系,为简化问题,这里假设只有y与x的关系.我们只有已知的离散数据点,目标是找出一个,用这个函数来拟合已知离散数据点.

cost function(loss function)

我们把以下公式成为cost function

此公式的意义在于衡量拟合值与已知数据的实际值之间的差距.
我们选取梯度下降算法(gradient descent),目的在于使这个差距最小.

gradient descent(梯度下降)

数学上讲,梯度方向垂直等高线方向.


公式为:

a为学习速率,
以下是求偏导数之后的公式: