机器学习之线性回归及其python实现(一)

前言:萌新整理了一些上课笔记,以及一些课外资料,网课资料等,稍稍总结一下




--------------------------------正文分割线------------------------------------------

1.基本形式和常见类别

1.1 基本形式

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

img

1.2 常见类别

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

img

img

img

img

img

2.定义

img

3.确定模型的思路

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

img

4.损失函数

img

在这里插入图片描述

5.多元线性回归

5.1 基本原理

img

补充解释:

w为x的回归系数矩阵

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

其他形式

img

w1~wn为回归系数

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

在这里插入图片描述

5.2 损失函数

img

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

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

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

img

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

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




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

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

​ 列式如下:

img

img

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


5.4 正则化

img

img

img



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)回归

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章