【机器学习算法专题(蓄力计划)】十三、机器学习中线性回归
文章目录
- 线性回归
- 什么是线性回归
- 线性回归要解决什么问题
- 线性回归的一般模型
- 回归的经验误差
- 如何使用模型
- 模型计算
- 过拟合与欠拟合(underfitting and overfitting)
- 解决方法
- Code(源码实现)
- 简单线性回归(最小二乘法)
- 线性回归(梯度下降法)
线性回归
什么是线性回归
我们首先用弄清楚什么是线性,什么是非线性。
-
线性:两个变量之间的关系是一次函数关系的——图象是直线,叫做线性。
注意:题目的线性是指广义的线性,也就是数据与数据之间的关系。
-
非线性:两个变量之间的关系不是一次函数关系的——图象不是直线,叫做非线性。
相信通过以上两个概念大家已经很清楚了,其次我们经常说的回归回归到底是什么意思呢。
- 回归:人们在测量事物的时候因为客观条件所限,求得的都是测量值,而不是事物真实的值,为了能够得到真实值,无限次的进行测量,最后通过这些测量数据计算回归到真实值,这就是回归的由来。
通俗的说就是用一个函数去逼近这个真实值,那又有人问了,线性回归不是用来做预测吗?是的,通过大量的数据我们是可以预测到真实值的。
线性回归要解决什么问题
对大量的观测数据进行处理,从而得到比较符合事物内部规律的数学表达式。也就是说寻找到数据与数据之间的规律所在,从而就可以模拟出结果,也就是对结果进行预测。解决的就是通过已知的数据得到未知的结果。例如:对房价的预测、判断信用评价、电影票房预估等。
线性回归的一般模型
大家看上面图片,图片上有很多个小点点,通过这些小点点我们很难预测当x值=某个值时,y的值是多少,我们无法得知,所以,数学家是很聪明的,是否能够找到一条直线来描述这些点的趋势或者分布呢?答案是肯定的。
假设数据就是x,结果是y,那中间的模型其实就是一个方程,这是一种片面的解释,但有助于我们去理解模型到底是个什么东西。以前在学校的时候总是不理解数学建模比赛到底在做些什么,现在理解了,是从题目给的数据中找到数据与数据之间的关系,建立数学方程模型,得到结果解决现实问题。其实是和机器学习中的模型是一样的意思。那么线性回归的一般模型是什么呢?
模型神秘的面纱已经被我们揭开了,就是以上这个公式,不要被公式吓到,只要知道模型长什么样就行了。假设i=0,表示的是一元一次方程,是穿过坐标系中原点的一条直线,以此类推。
回归的经验误差
数据集D中所有点与该直线的误差加起来,再进行算术平均就是该直线在数据集D上的经验误差:
R^D(h)=1∣D∣∑i(yi−h(xi))2=1∣D∣∑i(yi−(w⋅xi+b))2\hat{R}_D(h) =\frac{1}{|D|}\sum_{i}\Big(y_i-h(x_i)\Big)^2=\frac{1}{|D|}\sum_{i}\Big(y_i-(\boldsymbol{w}\cdot\boldsymbol{x_i}+b)\Big)^2R^D(h)=∣D∣1∑i(yi−h(xi))2=∣D∣1∑i(yi−(w⋅xi+b))2
其中|D|表示该数据集的大小。
根据经验误差最小原则,只需要求出使得该经验误差函数取得最小值的w^和b^\hat{\boldsymbol{w}}和\hat{b}w^和b^:
w^,b^=*argminw,bR^D(h)\hat{\boldsymbol{w}},\hat{b}=\operatorname*{argmin}_{\boldsymbol{w},b}\hat{R}_D(h)w^,b^=*argminw,bR^D(h)
如何使用模型
我们知道x是已知条件,通过公式求出y。已知条件其实就是我们的数据,以预测房价的案例来说明:
上图给出的是某个地区房价的一些相关信息,有日期、房间数、建筑面积、房屋评分等特征,表里头的数据就是我们要的x1、x2、x3……… 自然的表中的price列就是房屋的价格,也就是y。现在需要求的就是theta的值了,后续步骤都需要依赖计算机来训练求解。
模型计算
当然,这些计算虽然复杂,但python库中有现成的函数直接调用就可以求解。我们为了理解内部的计算原理,就需要一步一步的来剖析计算过程。
为了容易理解模型,假设该模型是一元一次函数,我们把一组数据x和y带入模型中,会得到如下图所示线段。
是不是觉得这条直线拟合得不够好?显然最好的效果应该是这条直线穿过所有的点才是,需要对模型进行优化,这里我们要引入一个概念。
- 损失函数:是用来估量你模型的预测值 f(x)与真实值 YY 的不一致程度,损失函数越小,模型的效果就越好。
不要看公式很复杂,其实就是一句话,(预测值-真实值)的平法和的平均值,换句话说就是点到直线距离和最小。用一幅图来表示:
解释:一开始损失函数是比较大的,但随着直线的不断变化(模型不断训练),损失函数会越来越小,从而达到极小值点,也就是我们要得到的最终模型。
这种方法我们统称为梯度下降法。随着模型的不断训练,损失函数的梯度越来越平,直至极小值点,点到直线的距离和最小,所以这条直线就会经过所有的点,这就是我们要求的模型(函数)。
以此类推,高维的线性回归模型也是一样的,利用梯度下降法优化模型,寻找极值点,这就是模型训练的过程。
过拟合与欠拟合(underfitting and overfitting)
在机器学习模型训练当中,模型的泛化能力越强,就越能说明这个模型表现很好。什么是模型的泛化能力?
- 模型的泛化能力:机器学习模型学习到的概念在它处于学习的过程中时模型没有遇见过的样本时候的表现。
模型的泛化能力直接导致了模型会过拟合与欠拟合的情况。让我们来看看一下情况:
我们的目标是要实现点到直线的平方和最小,那通过以上图示显然可以看出中间那幅图的拟合程度很好,最左边的情况属于欠拟合,最右边的情况属于过拟合。
- 欠拟合:训练集的预测值,与训练集的真实值有不少的误差,称之为欠拟合。
- 过拟合:训练集的预测值,完全贴合训练集的真实值,称之为过拟合。
欠拟合已经很明白了,就是误差比较大,而过拟合呢是训练集上表现得很好,换一批数据进行预测结果就很不理想了,泛化泛化说的就是一个通用性。
解决方法
使用正则化项,也就是给梯度下降公式加上一个参数,即:
加入这个正则化项好处:
- 控制参数幅度,不让模型“无法无天”。
- 限制参数搜索空间
- 解决欠拟合与过拟合的问题。
Code(源码实现)
简单线性回归(最小二乘法)
### 0.引入依赖 import numpy as np import matplotlib.pyplot as plt ### 1.导入数据(data.csv) points = np.genfromtxt( "data.csv", delimiter="," ) # points# 提取points里面的两列数据为X,Y x = points[:, 0] y = points[:, 1]# 调用plt画出散点图 plt.scatter( x, y ) plt.show() ### 2.定义损失函数(损失函数是系数的函数,传入数据) def compute_cost( w, b, points ):total_cost = 0M = len( points )# 逐点计算平方损失误差,然后求平均值for i in range( M ):x = points[i, 0]y = points[i, 1]total_cost += ( y - w * x -b ) ** 2return total_cost / M### 3.定义算法拟合函数#先定义一个求平均值的函数 def average( data ):sum = 0num = len( data )for i in range( num ):sum += data[i]return sum / num# 定义核心拟合函数 def fit( points ):M = len( points )x_bar = average( points[:, 0] )sum_yx = 0sum_x2 = 0 sum_delta = 0for i in range( M ):x = points[i, 0]y = points[i, 1]sum_yx += y * ( x - x_bar )sum_x2 += x ** 2# 根据公式计算ww = sum_yx / ( sum_x2 - M *( x_bar**2 ) )for i in range( M ):x = points[i, 0]y = points[i, 1]sum_delta += ( y - w * x )b = sum_delta / Mreturn w, b### 4.测试 w, b = fit(points)print("w is :", w) print("b is :", b)cost = compute_cost(w, b, points)print("cost is :", cost) ### 5.画出拟合曲线 plt.scatter(x, y) # 针对每一个x,计算预测的y之 pred_y = w * x + b plt.plot(x, pred_y, c = "r") plt.show()线性回归(梯度下降法)
### 0.引入依赖 import numpy as np import matplotlib.pyplot as plt### 1.导入数据(data.csv) points = np.genfromtxt( "data.csv", delimiter="," ) # points# 提取points里面的两列数据为X,Y x = points[:, 0] y = points[:, 1]# 调用plt画出散点图 plt.scatter( x, y ) plt.show() ### 2.定义损失函数(损失函数是系数的函数,传入数据) def compute_cost( w, b, points ):total_cost = 0M = len( points )# 逐点计算平方损失误差,然后求平均值for i in range( M ):x = points[i, 0]y = points[i, 1]total_cost += ( y - w * x -b ) ** 2return total_cost / M### 3.定义模型的超参数 alpha = 0.0001 initial_w = 0 initial_b = 0 num_iter = 10### 4.定义核心梯度下降算法函数 def grad_desc(points, initial_w, initial_b, alpha, num_iter):w = initial_wb = initial_b# 定义一个list保存所有的损失函数值,用来显示下降的过程cost_list = []for i in range(num_iter):cost_list.append( compute_cost(w, b, points) )w, b = step_grad_desc( w, b, alpha, points )return [w, b, cost_list]def step_grad_desc( current_w, current_b, alpha, points ):sum_grad_w = 0sum_grad_b = 0M = len(points)# 对每个点,代入公式求和for i in range(M):x = points[i, 0]y = points[i, 1]sum_grad_w += ( current_w * x + current_b - y ) * xsum_grad_b += current_w * x + current_b - y# 用公式求当前梯度grad_w = 2/M * sum_grad_wgrad_b = 2/M * sum_grad_b# 梯度下降,更新当前的w和bupdated_w = current_w - alpha * grad_wupdated_b = current_b - alpha * grad_breturn updated_w, updated_b### 5.测试,运行梯度下降算法,计算最优的w和b w, b, cost_list = grad_desc( points, initial_w, initial_b, alpha, num_iter )print("w is: ", w) print("b is: ", b)cost = compute_cost(w, b, points)print("cost is: ", cost)plt.plot(cost_list) plt.show() ### 绘制拟合曲线 plt.scatter(x, y) # 针对每一个x,计算出预测的y值 pred_y = w * x + bplt.plot(x, pred_y, c='r') plt.show()总结
以上是生活随笔为你收集整理的【机器学习算法专题(蓄力计划)】十三、机器学习中线性回归的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 部队开除会影响孩子报考警校吗
- 下一篇: 【机器学习算法专题(蓄力计划)】十四、机