机器学习算法:线性回归算法原理及两种实现方法

线性回归(Linear Regression)是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。

1、问题描述

回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析,一元线性模型描述如下:

一元线性模型

如果回归分析中包括两个或两个以上的自变量,且因变量与自变量之间是线性关系,则称为多元线性回归分析,多元线性模型描述如下:

多元线性模型

不失一般性,线性回归问题可描述为:利用样本数据点

样本点

求取线性模型参数

模型参数

使得实际y值与预测值之间的平方和误差最小,即线性回归损失函数为:

损失函数

最小。

2、算法原理

将上述平方和误差整理成矩阵形式为:

损失函数的矩阵形式

根据微积分内容,对上式相对于W求导,可得:

损失函数求导

令上式等于0,可以求得W估计值:

参数估计值

值得注意的是,上式需要求逆矩阵。如果矩阵不可逆,可以采用以下两种方法:

1)岭回归思路

引入lambda:

岭回归思路估计参数

当lambda不为0时,

引入lambda后的矩阵

的逆矩阵一定存在。

2)梯度下降法

损失函数 J wi 求偏导,可得:

梯度下降法

在上式中梯度大小实际上是和样本数量m相关,m越大,累加之和越大,这是不合理的。为了使与m无关,对损失函数 J 除以m,那么损失函数变为:

使用样本点数归一化的损失函数

那么偏导数为:

梯度下降法

写成矩阵形式,偏导数改写为:

矩阵形式

其中,

矩阵X的形式

3、代码实现

1)岭回归思想代码实现

代码实现如下:

import numpy as np

from sklearn import datasets

def LRegression(x, y, lm):

    ones_v  = np.ones(np.shape(x)[0])

    ones_x  = np.column_stack((ones_v,x))

    x_matrix = np.mat(ones_x).T

    y_matrix = np.mat(y)

    xT_x    = x_matrix * x_matrix.T

    xT_x_I  = xT_x + np.eye(np.shape(x_matrix)[0])*lm

    if np.linalg.det(xT_x_I) == 0.0:

        print("矩阵不可逆!")

        return

    w = xT_x_I.I * (x_matrix * y_matrix.T)

    return w

if __name__ == '__main__':

    diabetes = datasets.load_diabetes()

    x = diabetes.data

    y = diabetes.target

    w = LRegression(x, y, 0.1)

    print(w)

利用diabetes数据集,可以计算出w0~w10如下:

[[ 152.09907261]

[  1.30734895]

[-207.19481363]

[ 489.69108009]

[ 301.76943732]

[ -83.46607377]

[ -70.82809551]

[-188.68016351]

[ 115.7127025 ]

[ 443.81405412]

[  86.74853944]]

2)梯度下降法代码实现

待添加。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容