多元线性回归的简单实现

前言
前面一直讨论的都是机器学习中的分类问题,今天来实现一个简单的回归问题。线性回归,分为一元线性回归和多元线性回归,前者自变量只有一个特征,后者自变量具有多个特征。本文不从数学角度来理解,忽略背后的数学原理和证明过程,有兴趣的读者可参考其他相关资料。
一、算法简介
首先来说,线性回归在我们生活中有着极其广泛的应用,房价预测、销量预测、价格预测等都有其身影。算法的目的是求得一条最佳的线性拟合直线,让它更可能多的去拟合数据点。在这拟合示例里插入图片描述 既然是预测,那就必然会存在着误差,即预测值h(x)与真实值y的差,要寻得一条最佳拟合的直线,等价于找一条误差最小的直线。在线性回归中,误差分析准则是著名的最小二乘法,即累加每个实例的预测值与真实值的差值的平方,然后让其和最小,按照这个原则求得的回归系数,即为最佳拟合直线的回归系数,这样也就确定了拟合直线。
二、梯度下降法算法实现
通过上面的分析,要求得最贱拟合直线,本质上是一个优化问题,即让误差取得最小值,接下来就是数学问题了,常见的一种求解方式是梯度下降法。对误差函数求偏导,给定一个初值x0,然后再指定一个 步长,逐步迭代x0,直到达到函数收敛为止。这里的关键是步长的选择,因为如果步长设置的太大目标函数在迭代的过程中就可能会“错过”收敛点,就不容易收敛了,如果设置的太小了,必然会增加迭代次数,这样会导致计算成本增加。这里先结合一个demo,演示一下梯度下降法的实现,然后再利用梯度下降法的思想来实现逻辑回归。

import numpy as np
import matplotlib.pyplot as plt
"""
梯度下降demo 以凸函数y=x^2为例来简单实现一下其过程
"""
def func(x):#目标函数y=x^2
    return np.square(x)
def dfunc(x):#目标函数的导数
    return 2 * x
def GD(x_start,epochs,lr,df=dfunc):
    """
       梯度下降法。给定起始点与目标函数的一阶导函数,求在epochs次迭代中x的更新值
       :param x_start: x的起始点
       :param df: 目标函数的一阶导函数
       :param epochs: 迭代周期(次数)
       :param lr: 学习率
       :return: x在每次迭代后的位置(取值)(包括起始点),长度为epochs+1
    """
    xs = np.zeros(epochs + 1)#返回的列表
    x = x_start#起始迭代点
    xs[0] = x#返回列表的第一个元素为x的起始值
    for i in range(epochs):#开始迭代
        dx = df(x)#其实严格来说,这里应该输入原函数,但是这里仅作为demo演示过程,已经提前固定好原函数和导数了 读者知道即可
        v = - dx * lr#每次迭代要改变的值
        x += v#累加改变值
        xs[i+1] = x #把更新后的取值存进列表中
    return xs #最后返回列表
def demo_GD():#演示如何使用梯度下降法
    line_x = np.linspace(-5,5,100)
    line_y = func(line_x)
    x_start = -5
    epochs = 5
    lr = 0.9
    xs = GD(x_start,epochs,lr)#返回5次迭代后的列表
    print(xs)
    color = "r"#画红线
    plt.plot(xs,func(xs),c="b",label="lr={}".format(lr))#设置画板格式
    plt.scatter(xs,func(xs),c=color)#绘制散点图
    plt.legend()#用于设置图例
    plt.show()
if __name__ == "__main__":
    demo_GD()

代码有详细注释,我就不啰嗦了。

博主在学习的过程中也发现了一篇不错的梯度下降实现的博客,也可以参考一下:https://www.cnblogs.com/focusonepoint/p/6394339.html

三、线性回归实现
算法实现的步骤非常简单
1、获取数据集
2、用数据集生成模型
3、模型调优
4、模型测试与应用
代码实现和数据集可去我github上面下载:https://github.com/GritCoder/LR/tree/master
四、补充(若详细了解可参考相关资料)
1、上面提到的是线性回归,那么肯定就也存在非线性的情况,非线性的情况本质上与线性都是一样的,只不过在线性的基础上加了一个惩罚因子,最后还是化作线性的情况来处理。
2、利用梯度下降法来求解最小二乘法,有一定弊端,就是它不一定能收敛在最优点处,而且梯度下降法对步长的选择极其敏感,如果步长设置的不合理,往往会得到一个比较糟糕的模型。面对这个情况,我们可以利用牛顿法或者拟牛顿法来解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值