线性回归算法
- 一、摘要
- 二、线性回归算法概述
- 三、损失函数的定义和衡量标准
- 四、简单线性回归的求解和应用
- 五、机器学习算法一般求解思路
一、摘要
本文讲解了线性回归算法的基础知识和应用,强调线性回归主要用于解决回归问题。通过分析房产价格与房屋面积的关系,展示了线性回归的基本思想。文中提到线性回归算法的实现简单,但背后有强大的数学支撑。介绍了简单线性回归与多元线性回归的区别,并解释了如何通过最小二乘法找到最佳拟合直线。同时,探讨了线性回归算法的可解释性以及在机器学习中的重要地位,指出它是许多复杂模型的基础。此外,还提到了最优化原理在机器学习算法中的应用,以及如何通过线性回归算法学习机器学习中的重要思想。
二、线性回归算法概述
-
线性回归算法是机器学习领域的重要算法,主要用于解决回归问题,属于监督学习。
-
线性回归算法思想简单,实现容易,背后具有强大的数学性质。
-
线性回归算法是许多非线性模型的基础,如
多项式回归
、逻辑回归
和SVM
。 -
线性回归算法结果具有很好的可解释性,可以通过数据分析学习真实世界的知识。
-
线性回归算法的主要目的是通过数据拟合一条直线,最好地预测因变量(目标变量)。
-
线性回归算法的数学原理:
- 1.线性回归算法假设样本特征与样本输出标记之间存在线性关系。
- 2.通过找到一条直线,最大程度拟合样本特征和样本输出标记之间的关系。
- 3.二维平面图中,每个点表示一个数据,
横轴代表样本特征
,纵轴代表样本输出标记
。
-
线性回归分类:
- 简单线性回归
- 简单线性回归为 y=a+bx,其中a是截距,b是斜率;
- 1.简单线性回归假设样本特征只有一个,如房屋面积。
- 2.通过找到最佳拟合直线方程y=ax+b,预测样本输出标记的值。
- 3.预测值y[^i]表示为a×xi+b,其中xi是样本特征值。
- 4.
真实值y
与预测值y[^i]
之间的差距
称为误差
,线性回归算法的目标是寻找到一个函数,通过找到最佳的a和b,使得该函数的值尽可能很小,这个函数称之为损失函数。
- 多元线性回归
多元线性回归扩展到多个自变量。
- 简单线性回归
-
线性回归算法的工作流程
- 数据准备 :确保自变量和因变量独立且同分布,数据标准化可能有助于准确性。
- 模型建立 :选择
损失函数
(如最小二乘法)并通过优化算法(如梯度下降或随机森林)拟合模型。 - 评估与调优 :使用
交叉验证
评估模型性能,防止过拟合。
-
线性回归算法的应用场景
- 预测分析 :如房价、温度与气压、存活率等。
- 质量控制 :通过维度的影响评估产品性能。
- 经济预测 :用于股票价格或消费水平预测。
三、损失函数的定义和衡量标准
- 损失函数用于衡量真实值与预测值之间的差距。
- 常用的一种损失函数是平方误差损失函数,通过计算误差的平方来衡量差距。在线性回归中,损失函数通常表示为平方误差函数,即预测值与真实值之差的平方和。使用平方误差损失函数的原因包括其处处可导性,便于后续的数学计算。
- 求函数极值的基本方法是求导数并令导数等于零。通过对损失函数y分别对a和b求导,并令导数等于零,可以找到使损失函数最小的a和b值。
四、简单线性回归的求解和应用
-
简单线性回归的求解包括找到参数a和b的最小二乘解。
-
通过
最小二乘法
,a和b的求解有了直接的数学表达式。
最小二乘法
是一种数学优化技术,通过最小化误差的平方和
来寻找数据的最佳函数匹配。在监督学习中,最小二乘法用于拟合线性回归模型,通过最小化预测值与真实值之间的平方误差之和,来求解模型的参数。 -
简单线性回归的求解思路可以推广到多元线性回归的情况。
-
具体实现过程:
- 实现思路及步骤:
- 1.加载相应的库,并使用假数据进行线性回归过程。
- 2.创建xy两个np数组,并绘制散点图。
- 3.计算x和y的均值,并使用公式计算a和b。
- 4.a的计算包括分子和分母两部分,通过循环求和计算。
- 5.b的计算直接使用公式y的均值减去a乘以x的均值。
- 6.绘制ax+b的直线图,并显示预测结果。
- 代码实现过程:
-
1.先导入相关库,定义好测试数据及该数据在二维平面上的散点图分布:
# 导入型相关的库 import numpy as np import matplotlib.pyplot as plt # 定义x和y两个向量 x = np.array([1.,2.,3.,4.,5.]) y = np.array([1.,3.,2.,3.,5.]) # 先二维平面上绘图查看数据分布 plt.scatter(x,y) plt.axis([0,6,0,6]) # 定义横纵坐标值的范围为[0,6] plt.show()
执行效果如下:
-
2.根据公式求解线性方程y=ax + b
# 先分别求出x和y的均值 x_mean = np.mean(x) y_mean = np.mean(y) # 先求a的分子部分 numerator = 0.0 # 分子 denominator = 0.0 # 分母 for x_i,y_i in zip(x,y): numerator += (x_i - x_mean) * (y_i - y_mean) denominator += (x_i - x_mean)**2 # 然后在求出a的值 a = numerator / denominator # 最后再求出b的值 b = y_mean - a*x_mean # 此时可以得到线性方程中的预测值y_hat y_hat = a * x + b # 为了好看,将y_hat这条直线绘制出来 plt.scatter(x,y) # 5个点的散点图 plt.plot(x,y_hat,color='r') # 绘制直线,x还是原来的向量x(自变量),y_hat就是求出来的值(因变量) plt.axis([0,6,0,6]) plt.show()
执行效果如下:
-
3.给定假设的新样本点,带入线性回归方程中,求得预测值:
# 给一个假设的新的样本点x_predict x_predict = 6 # 调用我们的模型y=ax + b,得到一个预测值y_predict y_predict = a * x_predict + b print("预测值=",y_predict)
执行效果如下:
-
- 实现思路及步骤:
-
按照scikit-learn的代码风格,将上述代码进行封装:
- 1.创建一个simple linear regression.py文件,定义SimpleLinearRegression类。
- 2.构造函数初始化a和b参数,使用下划线命名表示这些是算法计算结果。
- 3.fit函数接收训练数据x和y,计算a和b并保存。
- 4.predict函数接收预测数据x,使用已计算的a和b进行预测。
- 5.输出a和b的值,以及预测结果。
- 6.在PyCharm中封装完成后的代码如下:
import numpy as np class SimpleLinearRegressionModel: def __init__(self): # 初始化线性回归模型的参数a和b为None self.a_ = None self.b_ = None def fit(self, x_train, y_train): """ 根据训练数据集x_train,y_train训练Simple Linear Regression模型 """ # 断言x_train的维度为1,确保是单特征训练数据 assert x_train.ndim == 1, \ "Simple Linear Regressor can only solve single feature training data." # 断言x_train和y_train的长度相等,确保数据匹配 assert len(x_train) == len(y_train), \ "the size of x_train must be equal to the size of y_train" # 先分别求出x和y的均值 x_mean = np.mean(x_train) y_mean = np.mean(y_train) # 先求a的分子部分 numerator = 0.0 # 分子 denominator = 0.0 # 分母 # 遍历训练数据,计算分子和分母 for x_i, y_i in zip(x_train, y_train): numerator += (x_i - x_mean) * (y_i - y_mean) denominator += (x_i - x_mean) ** 2 # 然后计算a的值 self.a_ = numerator / denominator # 最后计算b的值 self.b_ = y_mean - self.a_ * x_mean return self def predict(self, x_predict): """ 给定待预测数据集x_predict,返回表示x_predict的结果向量 """ # 断言x_predict的维度为1,确保是单特征数据 assert x_predict.ndim == 1, \ "Simple Linear Regressor can only solve single feature training data." # 断言模型已经训练过(a_和b_不为None) assert self.a_ is not None and self.b_ is not None, \ "must fit before predict!" # 对每个待预测数据调用_predict方法,生成预测结果数组 return np.array([self._predict(x) for x in x_predict]) def _predict(self, x_single): """ 给定单个待预测数据x_single,返回x_single的预测结果值 """ # 根据训练得到的参数a_和b_进行预测计算 return self.a_ * x_single + self.b_ def __repr__(self): # 返回模型的字符串表示形式 return "SimpleLinearRegressionModel()"
- 7.在jupyter中调用并预测:
1.实例化SimpleLinearRegression类,无需传入参数。
2.调用fit方法传入x和y数据,训练模型。
3.调用predict方法进行预测,传入预测数据x。
4.输出预测结果,以及学到的a和b参数。
5.绘制原始数据和预测直线的图表。
执行结果:# 导入在PyCharm中封装好的工程项目 import sys project_path = 'D:/PycharmProjects/pythonProject/' if project_path not in sys.path: sys.path.append(project_path) from SimpleLinearRegressionModel import SimpleLinearRegressionModel sreg = SimpleLinearRegressionModel() sreg.fit(x,y) # 给一个假设的新的样本点x_predict x_predict = 6 sreg.predict(np.array([x_predict]))
绘制图像查看下:
五、机器学习算法一般求解思路
-
机器学习算法的求解思路包括
确定目标函数
和最优化该函数
。 -
目标函数可以是
损失函数
或效用函数
。 -
参数学习算法通过学习模型的参数来最优化目标函数。
近乎所有参数学习算法
都是如图所示的套路。
-
最优化原理在机器学习算法中发挥着重要作用,常见如最优化原理和凸优化。
- 1.
最优化原理
不仅用于机器学习算法,也在传统计算机算法领域中发挥重要作用。 - 2.
凸优化
是最优化原理的一个分支领域,解决一类特殊的优化问题。
- 1.