机器学习笔记(1)梯度下降法 线性回归C语言实现

最优解问题一直在某些自控系统中有需求,譬如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=0m(yihθ(xi))2
打公式好累
只要样本值与预测值的差的平方和最小就能得到一个较好的回归曲线。

描述回归程度的量相关系数R

总平方和(SST)
∑ i = 0 n ( y i − y ‾ ) 2 \sum_{i=0}^n{ (y^i - \overline{y})}^2 i=0n(yiy)2
回归平方和(SSR)

∑ i = 0 n ( y ^ − y ‾ ) 2 \sum_{i=0}^n{ (\hat{y} - \overline{y})}^2 i=0n(y^y)2
残差平方和(SSE)
∑ i = 0 n ( y i − y ^ ) 2 \sum_{i=0}^n{ (y^i - \hat{y})}^2 i=0n(yiy^)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=1SSE/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);
}

总结

梯度下降法在学习率(步长)的选择尤为重要,有可能选取到局部最优解而不是全局最优解。可以随机取点 比较结果取最小值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值