机器学习全解 - 一般线性回归最佳拟合直线(含算法介绍,公式,手写代码实现,调包实现)

在日常生活学习工作过程中,回归分析的重要性就不言而喻了。对于数据分析初学者而言,回归分析基本可以说占了半壁江山。无论是时间序列,预测模型,还是相关性分析,线性回归都是老生常谈的模型。那么今天我们就先来介绍一下回归当中最简单的线性回归。

1. 线性回归

1.1 概念

Y=β0​+β1​x

这是一个简单的一元线性方程,和我们中学所学的函数一样,因变量的值随着自变量的变化而变化,能想到这里,OK,线性回归你已经掌握一半了。

这是线性回归的一般表达式,x为自变量,y为因变量,w为特征的系数,b为偏置

让我们使用矩阵将这个式子化简得到:

线性回归中,模型的参数包括W(特征系数矩阵)和偏置量(b)。这些参数通过学习算法进行调整,以使模型尽可能准确地拟合训练数据,这就是线性回归中模型的拟合要素。找到最佳的系数和偏置,最小化预测值与实际值之间的差距。常用的方法包括最小二乘法和梯度下降法。

1.2 系数推导求解

1.2.1 最小二乘法

最小二乘法是通过最小化残差平方和来找到最佳拟合线,实质就是预测值与实际值的残差的平方和最小化。按照常理而言,预测的数据和真实的数据差距越小,那说明预测的效果也很好,最小二乘法就是利用了这一点。

对这个函数进行求导我们可以得到核心公式:

对于系数代入我们的样本就很easy的求出来了。

具体求导过程可以看看这篇文章:线性回归 - 小时百科

1.2.2 梯度下降法

梯度下降法,额听着就复杂,笔者初次接触这个概念时头都大了,实际上,狐假虎威罢,大家千万不要被这么高大上的名称给吓到了!

通过字面意思我们类比在现实世界,想想大家平常下楼梯的目的是什么,是到更低的地方去,梯度下降就是让数字降低到低处,也就是最小值处。

(此处借用一下别的博主的图)

梯度下降的目的就是求函数的极小值点,梯度上升就是求函数的极大值点。

什么是函数的梯度的,可以类比一个梯子大小,我们往前走一定距离能往下走多少距离就是梯度。细心的读者已经发现了,这就是斜率的定义。函数中每一个点的斜率不就是求函数的导数嘛。OK easy!

 

理解了这个就很简单了,剩下的交给数学。

这是线性方程的损失函数,将损失函数最小化是我们的目标。

求这个函数系数的偏导数化简我们可以得到:

顺水推舟代入我们的梯度下降公式:

在此解释一下,\alpha是步长,也就是上述所说你的步伐长度,选择步长也是一门学问,能太大也不能太小,太小的话,可能导致迟迟走不到最低点,太大的话,会导致错过最低点。

最后不断迭代得到最优的系数矩阵。

详细的推导方式可以看看这个:梯度下降算法(Gradient descent)_梯度下降法-CSDN博客

2. 源码实现

2.1 最小二乘法

def standRegres(xArr,yArr):
    xMat = np.mat(xArr);yMat = np.mat(yArr)
    xTx = xMat.T * xMat
    if np.linalg.det(xTx) == 0.0:
        print('This matrix is singular,cannot do inverse')
    else:
        ws = xTx.T * (xMat.T*yMat) #代入公式直接计算
        return ws

2.2 梯度下降法

#数据预处理
def preprocess_data(X):
    m = X.shape[0] #获得数据集的样本数
    X_plus = np.ones((m,1))
    X_train = np.hstack((X_plus,X)) #将常数项添加
    return X_train

首先将数据进行处理,每一个样本处添加为1的数据,方便使用梯度下降求偏置量(b)

def init_parameter(shape):
    np.random.seed(0)
    m,n = shape
    theta_init = np.random.rand(m,n) #根据有几个变量定义参数
    return theta_init

随机初始化系数值

def compute_predict_Y(X,theta):
    predict_Y = np.dot(X,theta) #矩阵的乘法运算
    return predict_Y

计算预测值

#计算损失函数
def compute_J(predict_Y,y):
    m = y.shape[0]
    loss = (1/(2*m)) * np.sum(np.power((predict_Y - y),2)) #向量中求损失函数,根据列求和
    return loss

#计算参数的梯度
def compute_gradient(predict_Y,Y,X):
    m = X.shape[0]
    gradients = (1/m) * np.dot(X.T,predict_Y-Y) 
    return gradients

通过公式将损失函数以及参数的梯度值计算

#更新参数
def update_parameter(theta,gradients,learning_rate=0.0001):
    parameters = theta - np.dot(learning_rate,gradients)
    return parameters
theta_one_iter = update_parameter(theta,gradients_first)

#实现训练函数
def model(X,Y,theta,iter_num=100,learning_rate=0.0001):
    loss_history = []
    theta_history = []
    for i in range(iter_num):
        predict_Y = compute_predict_Y(X,theta)
        loss = compute_J(predict_Y,Y)
        gradients = compute_gradient(predict_Y,Y,X)
        theta = update_parameter(theta,gradients)
        loss_history.append(loss)
        theta_history.append(theta)
    return loss_history,theta_history,theta

最后将我们所有的函数进行汇总迭代iter_num次,步长为0.0001梯度下降获得最优系数

3. 调包实现

from sklearn.linear_model import LinearRegression #sklearn中,线性回归模型在linear_model模块中
import numpy as np
# 调取sklearn中自带的数据集
X_train = np.array([[2,4],[3,5],[4,6],[5,7],[6,8]])
y_train = np.array([[8],[15],[24],[35],[48]])
Model = LinearRegression() #初始化一个线性回归模型
Model.fit(X_train,y_train) #fit函数用于训练
Model.predict(X_train)
Model.coef_

4. 线性回归优点及局限性

4.1 优点

1. 简单易懂:线性回归是初学者也是日常生活中使用最频繁的模型,易于理解。

2. 可解释性强:回归模型的系数可以直接解释为特征对目标变量的影响程度,提供了很好的解释性。

3. 计算速度快以及适用范围广泛。

4.2 局限性

1. 对线性关系的拟合能力有限:无法捕捉到复杂的线性关系

2. 容易受到共线性的影响:当自变量高度相关时,会导致模型系数估计不准确,降低模型的可靠性。

3. 需要满足线性假设: 要求自变量与因变量之间的关系是线性的,如果数据不满足线性假设,则预测效果会受到影响

4. 只能处理数值型特征。

5. 应用场景

1. 经济学和金融领域:用于预测股票价格,商品价格,通货膨胀率等经济指标。

2. 市场营销:用于销售预测,市场份额分析。

3. 社会科学:用于分析教育水平与收入关系,犯罪率等。

4. 资源管理: 能源消耗预测,自然资源利用规划等。

总的来说,只要数据符合线性关系假设,且要进行预测等问题,都可以考虑使用线性回归模型。

6. 参考资料

回归问题经典算法 | 线性回归:梯度下降法_回归分析梯度下降法-CSDN博客

梯度下降算法(Gradient descent)_梯度下降法-CSDN博客

线性回归 - 小时百科

  • 35
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值