线性回归的基本含义
在该直线中,房子的面积 x为自变量,房子的价格 y为因变量。而“线性回归”的目的就是,利用自变量 x与因变量 y,来学习出这么一条能够描述两者之间关系的线。对于一元线性回归来说就是学习出一条直线,而对于多元线性回归来说则是学习出一个面或超平面。
一元线性回归模型
在概念上理解了线性回归是什么之后,我们就需要将线性回归的问题进行抽象化,转换成我们能够求解的数学问题。
在上面的例子中,我们可以看出自变量 x与因变量 y致成线性关系,因此我们可以对因变量做如下假设(hypothesis):
或者记作:
其中 i=1,2,...,mi=1,2,...,m
在这里使用是由于通过观察,我们可以发现直线并没有完全拟合数据,而是存在一定的误差。该假设即为一元线性函数的模型函数,其中含有两个参数与。其中可视为斜率, 为直线在y 轴上的截距。接下来的任务就是如何求得这两个未知参数。
优化算法
在这里我们将使用两种方法进行参数的求解:(1)最小二乘法(2)梯度下降法
1、最小二乘法
最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。
简单推导过程:
2、梯度下降法
如下图所示,将梯度下降的原理形象地描述为下山,直到获得一个局部或者全局最小值。在每次迭代中,根据给定的学习速率和梯度的斜率,能够确定每次移动的步幅,按照步幅沿着梯度方向前进一步。
简单代码实现如下:
1 class LinearModel(object): 2 def __init__(self): 3 # 初始值 4 self.w = np.random.randn(1)[0] 5 self.b = np.random.randn(1)[0] 6 7 def model(self,x):#线性模型 8 return self.w * x + self.b 9 10 def cost(self,x,y): 11 c = (self.model(x) - y)**2 12 # 偏导数(包含导数) = 梯度 13 dw = 2*(self.model(x) - y)*x 14 db = 2*(self.model(x) - y)*1 15 return c,dw,db 16 # 梯度下降更新数据 17 def gradient_descent(self,dw,db,step): 18 self.w -= dw*step 19 self.b -= db*step 20 21 def fit(self,X,y): 22 w_last = self.w + 0.1 23 b_last = self.b + 0.1 24 length = len(X) 25 count = 1 26 while True: 27 if (abs(self.w - w_last) < 1e-4) and (abs(self.b - b_last) < 1e-4): 28 print(\'*********************\') 29 break 30 cost_ = 0 31 derivative_w = 0 32 derivative_b = 0 33 for xi,yi in zip(X,y): 34 c_,dw_,db_ = self.cost(xi[0],yi)# 求解的是每一个样本的损失、w偏导、b偏导 35 cost_ += c_/length 36 derivative_w += dw_/length 37 derivative_b += db_/length 38 # cost_、derivative_w、derivative 整体的损失,偏导 39 w_last = self.w 40 b_last = self.b 41 42 self.gradient_descent(derivative_w,derivative_b,0.01) 43 44 print(\'--------------------------------梯度下降更新次数是:%d。损失是:%0.4f\'%(count,cost_)) 45 count +=1 46 47 print(\'++++++++++++++++++++++++++++++++++梯度下降计算的斜率是:%0.4f。计算的截距是:%0.4f\'%(self.w,self.b)) 48 49 linear_model = LinearModel() 50 linear_model.fit(X,y)
线性回归算法的优缺点
优点:
缺点: