文章目录

  • 1.基本形式和常见类别
  • 1.1 基本形式
  • 1.2 常见类别
  • 2.定义
  • 3.确定模型的思路
  • 4.损失函数
  • 5.多元线性回归
  • 5.1 基本原理
  • 5.2 损失函数
  • 5.3 最小二乘法求解多元线性回归的参数
  • 5.4 正则化
  • 6.linear_model.LinearRegression
  • 7.实战演练
  • 8.自己实现最小二乘法尝试
  • 9.补充说明


1.基本形式和常见类别

1.1 基本形式

线性回归是线性模型的一种,其基本形式如下

python对线性分析 输出分析结果 python线性分类_python对线性分析 输出分析结果

1.2 常见类别

sklearn中的线性模型模块为linear_model。linear_model包含了多种多样的类和函数,例如,普通线性回归,多项式回归,岭回归,LASSO,以及弹性网等。

python对线性分析 输出分析结果 python线性分类_python对线性分析 输出分析结果_02

python对线性分析 输出分析结果 python线性分类_python对线性分析 输出分析结果_03

python对线性分析 输出分析结果 python线性分类_python对线性分析 输出分析结果_04

python对线性分析 输出分析结果 python线性分类_机器学习_05

python对线性分析 输出分析结果 python线性分类_最小二乘法_06

2.定义

python对线性分析 输出分析结果 python线性分类_损失函数_07

3.确定模型的思路

模型的确定有统计学角度和机器学习的角度,在本文中,使用的是机器学习的角度,从矩阵形式来理解之。

python对线性分析 输出分析结果 python线性分类_最小二乘法_08

4.损失函数

python对线性分析 输出分析结果 python线性分类_机器学习_09

python对线性分析 输出分析结果 python线性分类_损失函数_10

5.多元线性回归

5.1 基本原理

python对线性分析 输出分析结果 python线性分类_最小二乘法_11

补充解释:

w为x的回归系数矩阵

b为截距(intercept),又可以写作w0等形式,它代表一个常数

其他形式

python对线性分析 输出分析结果 python线性分类_损失函数_12

w1~wn为回归系数

b为截距(intercept),又可以写作w0等形式,它代表一个常数

python对线性分析 输出分析结果 python线性分类_最小二乘法_13

5.2 损失函数

python对线性分析 输出分析结果 python线性分类_损失函数_14

这个损失函数代表了(yi-Xiw)的L2范式的平方结果,L2范式的本质是就是欧式距离,即是两个向量上的每个点对应相减后的平方和再开平方.

现在只实现了向量上每个点对应相减后的平方和,并没有开方,所以损失函数是L2范式,即欧式距离的平方结果。

预测结果和真实值差异越小越好, 此时,求解目标就可以转化成如下形式:


python对线性分析 输出分析结果 python线性分类_多元线性回归_15

这个式子,也正是sklearn当中,用在类Linear_model.LinerRegression背后使用的损失函数。

该式即为我们熟知的SSE(Sum of Sqaured Error,误差平方和)或者RSS(Residual Sum of Squares 残差平方和)。在sklearn官网文档中,一般称之为RSS残差平方和。


5.3 最小二乘法求解多元线性回归的参数

问题转换成了求解让RSS最小化的参数向量 ,这种通过最小化真实值和预测值之间的RSS来求解参数的方法叫【最小二乘法】。

列式如下:


python对线性分析 输出分析结果 python线性分类_多元线性回归_16

python对线性分析 输出分析结果 python线性分类_损失函数_17

在这里,逆矩阵存在的充分必要条件是特征矩阵不存在多重共线性



5.4 正则化

python对线性分析 输出分析结果 python线性分类_机器学习_18

python对线性分析 输出分析结果 python线性分类_最小二乘法_19

python对线性分析 输出分析结果 python线性分类_机器学习_20


6.linear_model.LinearRegression

class sklearn.linear_model.LinearRegression (fifit_intercept=True, normalize=False, copy_X=True, n_jobs=None)

参数

含义

fit_intercept

bool,可不填,默认为True。 是否计算该模型的截距,若为False,则不计算

normalize

bool,可不填,默认为False。 当fit_intercept设置为False时,将忽略此参数。如果为True,则特征矩阵X在进入回归之前将 会被减去均值(中心化)并除以L2范式(缩放)。如果你希望进行标准化,请在fifit数据之前 使用preprocessing模块中的标准化专用类StandardScaler 。

copy_X

bool, 可不填,默认为True。若为真,则在X.copy()上进行操作,否则的话原本的特征矩阵X可能被线性回归影响并覆盖。

n_jobs

整数或者None,可不填,默认为None 用于计算的作业数。只在多标签的回归和数据量足够大的时候才生效。除非None在 joblib.parallel_backend上下文中,否则None统一表示为1。如果输入 -1,则表示使用全部的CPU来进行计算。


7.实战演练

详情请见我得另一篇博文


8.自己实现最小二乘法尝试

# 自定义最小二乘法尝试
def my_least_squares(x_array, y_array):
    '''
    :param x: 列表,表示m*n矩阵
    :param y: 列表,表示m*1矩阵
    :return: coef:list 回归系数(1*n矩阵)   intercept: float 截距
    '''
    # 矩阵对象化
    arr_x_01 = np.array(x_array)
    arr_y_01 = np.array(y_array)

    # x_array由 m*n矩阵转化为 m*(n+1)矩阵,其中第n+1列系数全为1
    # 获取行数
    row_num = arr_x_01.shape[0]

    # 生成常量系数矩阵  m*1矩阵
    arr_b = np.array([[1 for i in range(0, row_num)]])

    # 合并成m*(n+1)矩阵
    arr_x_02 = np.insert(arr_x_01, 0, values=arr_b, axis=1)

    # 矩阵运算
    w = np.linalg.inv(np.matmul(arr_x_02.T, arr_x_02))
    w = np.matmul(w, arr_x_02.T)
    w = np.matmul(w, arr_y_01)
    
    # w为1*(n+1)矩阵
    # print(w)
    result = list(w)
    coef = result.pop(-1)
    intercept = result
    
    return coef, intercept



9.补充说明

模型优化

岭(ridge)回归和拉索(lasso)回归

等会后续在我的博客中补充