序
最优解问题一直在某些自控系统中有需求,譬如pid控制器,目前我还是凭经验调节,偶然搜到可以用机器学习调节PID参数于是乎便开始了学习。顺便复习高数线代概率论。
原理总结
是当(代价函数)Cost Function的值最小时取得的Parameters,为了达到这个目的,最值问题=求极值。多参数=求偏导。
最小二乘法(小平方法)
∑
i
=
0
m
(
y
i
−
h
θ
(
x
i
)
)
2
\sum_{i=0}^m{ (y^i - h_\theta (x_i))} ^2
i=0∑m(yi−hθ(xi))2
打公式好累
只要样本值与预测值的差的平方和最小就能得到一个较好的回归曲线。
描述回归程度的量相关系数R
总平方和(SST)
∑
i
=
0
n
(
y
i
−
y
‾
)
2
\sum_{i=0}^n{ (y^i - \overline{y})}^2
i=0∑n(yi−y)2
回归平方和(SSR)
∑
i
=
0
n
(
y
^
−
y
‾
)
2
\sum_{i=0}^n{ (\hat{y} - \overline{y})}^2
i=0∑n(y^−y)2
残差平方和(SSE)
∑
i
=
0
n
(
y
i
−
y
^
)
2
\sum_{i=0}^n{ (y^i - \hat{y})}^2
i=0∑n(yi−y^)2
关系
S
S
T
=
S
S
R
+
S
S
E
SST=SSR+SSE
SST=SSR+SSE
R
=
S
S
R
/
S
S
T
=
1
−
S
S
E
/
S
S
T
R=SSR/SST=1-SSE/SST
R=SSR/SST=1−SSE/SST
实验 梯度下降法
梯度下降 在今天的实验中由于学习率(步长)选择错误所以回归结果跑了十万八千里。让我明白了步长选择的重要性,用c语言调试不能显示散点图与回归曲线,所以很难受。
C语言结果
Python jupyter Notebook
代码
void gradient_descent_runner(double *x_data, double *y_data,double b, double k,double lr, int epochs)
{
int i,j;
double b_grad,k_grad;
double m;
m = row;
for(i=0 ; i < epochs; i++)
{
b_grad = 0;
k_grad = 0;
for (j=0 ; j<m ; j++ )
{
b_grad += (1/m) * ( ((k * x_data[j]) + b) - y_data[j] );
k_grad += (1/m) * x_data[j] * (((k * x_data[j]) + b) - y_data[j]);
printf("%lf\n",b_grad);
}
b = b - (lr * b_grad);
k = k - (lr * k_grad);
}
printf("b=%lf \nk=%lf",b,k);
}
总结
梯度下降法在学习率(步长)的选择尤为重要,有可能选取到局部最优解而不是全局最优解。可以随机取点 比较结果取最小值。