梯度下降 线性回归2021-04-16

线性回归(+ )1.22 梯度下降法( ,GD)2,一元线性回归实例 3,多元线性回归及梯度下降*
线性回归 基本思想
线性回归是我们高中学习的线性回归的思想延伸,所以本人感觉不是很难接受 。
线性回归是通过若干个相关的离散的点来模拟出的能够预测(由自变量改变引起)因变量的线性图线的一种思想和方法 。
1,线性回归 1.1线性回归概念
如果研究的线性代数只包含一个自变量和一个因变量,且二者的关系可以通过一条直线近似的刻画时,这种回归就称为一元线性回归 。如果回归分析中涉及到两个及以上的自变量,且自变量与因变量是线性关系,就称为多元线性回归 。
线性关系:两个变量之间存在一次方函数关系,通俗一点讲,就是如果如果把这两个变量分别作为点的横坐标与纵坐标,其图象是平面上的一条直线,则这两个变量之间的关系就是线性关系 。
一元线性代数的公式: y = a ? x + b y=a*x+b y=a?x+b
问题:如何才能更好的去模拟现有的线性关系呢?
接下来引入的就是能解决这个问题的方法:构造损失函数(比较洋气一点的名字叫做loss 函数),首先loss函数是个怎样的概念,本人理解,loss函数就是一个把原先函数的预测值(记为 y ^ \hat{y} y^?)当做新的自变量,把L当做因变量的函数,表达式表示为 L = 1 n ∑ i = 1 n ( y i ^ ? y i ) 2 L=\frac{1}{n}\sum_{i=1}^{n}\quad(\hat{y_i}-y_i)^{2} L=n1?i=1∑n?(yi?^??yi?)2公式表达了预测值与真实值之间的平均的平方距离,一般称其为MAE(meanerror)均方误差将上面y的函数表达式代入得到: L ( a , b ) = 1 n ∑ i = 1 n ( a x i + b ? y i ) 2 L(a,b)=\frac{1}{n}\sum_{i=1}^{n}\quad(ax_i+b-y_i)^{2} L(a,b)=n1?i=1∑n?(axi?+b?yi?)2然后把a和b看成L的自变量,构造完函数就考虑求未知数的问题 。
1.2 回归参数的求解方法 1.21 最小二乘法(least
不要感觉很陌生,其实我们高中不知道用了多少次,下面的例子中的公式就是由最小二乘法得到的呀,只不过我们很少有人问为什么罢了吧 。
求出这样一些未知参数使得样本点和拟合线的总误差(距离)最小
直观感受一下:(图借鉴与知乎某作者)
由于误差有正有负,会有相互抵消的情况存在,所以我们一般求其差的平方 。
2.211 看看怎么来?
手工推导:
1.22 梯度下降法( ,GD)
梯度下降不懂得话,请点击梯度下降
在这里的应用为:a ? α δ L δ a → a a-\alpha\frac{\delta L}{\delta a}→a a?αδaδL?→a
b ? α δ L δ b → b b-\alpha\frac{\delta L}{\delta b}→b b?αδbδL?→b
2,一元线性回归实例
为了帮助大家更快的接受这个知识点,我们不如把高中的线性回归例题拿来作为实例:
我们只要解决第二问就行了,我会先归出手工推导一遍,稍后给出相应的代码实现 。
2.1 手工推导
2.2 代码实现
提示: 代码中涉及的批量与随机的方法在上面的梯度下降的链接里有讲解 。
print ("零件个数与与加工时间表")print("序号:1234")print("个数:2345")print("时间:2.5344.5\n")import matplotlib.pyplot as pltimport matplotlibfrom math import pow#做平方用import random#它的引入是为了下面的批量梯度算法的实现x = [2,3,4,5]y = [2.5,3,4,4.5]#线性回归函数为 y=b+a*x#参数定义b = 0.1#对 b 赋值a = 0.1#对 a 赋值alpha = 0.1#学习率m = len(x)count0 = 0b_list = []a_list = []#使用批量梯度下降法for num in range(10000):count0 += 1diss = 0#误差deriv0 = 0 #对 b 导数deriv1 = 0 #对 a 导数#求导for i in range(m):deriv0 += (b+a*x[i]-y[i])/mderiv1 += ((b+a*x[i]-y[i])/m)*x[i]#更新 b 和 afor i in range(m):b = b - alpha*((b+a*x[i]-y[i])/m) a = a - alpha*((b+a*x[i]-y[i])/m)*x[i]#求损失函数 J (θ)for i in range(m):diss = diss + (1/(2*m))*pow((b+a*x[i]-y[i]),2)b_list.append(b)a_list.append(a)#如果误差已经很小,则退出循环if diss