梯度下降法 不懂的可以见斯坦福大学的公开课 :机器学习 第二课。
现有一个方程:y=1+2x
给一个训练样本 x,y= {0,1},{1,3},{2,5},{3,7},{4,9},{5,11},{6,13},{7,15}
要拟合出θ0,θ1 即y=θ0*x0+θ1 *x1;
根据课程:(训练样本中没有x0=1,初始化的时候补上) 初始步长ε=0.006555代码中用a表示,θ0,θ1都为0
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
|
public
class
Test1 {
static
float
a=
0
.006555f;
//步长
static
float
A[][]={
//初始化矩阵
{1f,0f,1f},{1f,1f,3f},{1f,2f,5f},{1f,3f,7f},{1f,4f,9f},{1f,5f,11f},{1f,6f,13f},{1f,7f,15f}
};
static
float
B[]={0f,0f};
//初始化参数
public
static
void
main(String[] args) {
int
n=
0
;
float
g1,g2;
while
(n<
1000
){
g1=T(
0
);
g2=T(
1
);;
if
((Math.abs(g1)<
0.000001
)&&(Math.abs(g2)<
0.000001
)){
break
;
}
//更新参数
B[
0
]-=g1;
B[
1
]-=g2;
System.out.println(B[
0
]+
","
+B[
1
]);
n++;System.out.println(
"n:"
+n);
}
}
static
float
T(
int
s){
float
sum=
0
;
for
(
int
i=
0
;i<A.length;i++){
sum+=(B[
0
]*A[i][
0
]+B[
1
]*A[i][
1
]-A[i][
2
])*A[i][s];
}
return
sum*a;
}
}
|
0.9999359,2.000013经过597步计算,拟合出θ0,θ1分别为: