文章目录
- 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 基本形式
线性回归是线性模型的一种,其基本形式如下
1.2 常见类别
sklearn中的线性模型模块为linear_model。linear_model包含了多种多样的类和函数,例如,普通线性回归,多项式回归,岭回归,LASSO,以及弹性网等。
2.定义
3.确定模型的思路
模型的确定有统计学角度和机器学习的角度,在本文中,使用的是机器学习的角度,从矩阵形式来理解之。
4.损失函数
5.多元线性回归
5.1 基本原理
补充解释:
w为x的回归系数矩阵
b为截距(intercept),又可以写作w0等形式,它代表一个常数
其他形式
w1~wn为回归系数
b为截距(intercept),又可以写作w0等形式,它代表一个常数
5.2 损失函数
这个损失函数代表了(yi-Xiw)的L2范式的平方结果,L2范式的本质是就是欧式距离,即是两个向量上的每个点对应相减后的平方和再开平方.
现在只实现了向量上每个点对应相减后的平方和,并没有开方,所以损失函数是L2范式,即欧式距离的平方结果。
预测结果和真实值差异越小越好, 此时,求解目标就可以转化成如下形式:
这个式子,也正是sklearn当中,用在类Linear_model.LinerRegression背后使用的损失函数。
该式即为我们熟知的SSE(Sum of Sqaured Error,误差平方和)或者RSS(Residual Sum of Squares 残差平方和)。在sklearn官网文档中,一般称之为RSS残差平方和。
5.3 最小二乘法求解多元线性回归的参数
问题转换成了求解让RSS最小化的参数向量 ,这种通过最小化真实值和预测值之间的RSS来求解参数的方法叫【最小二乘法】。
列式如下:
在这里,逆矩阵存在的充分必要条件是特征矩阵不存在多重共线性。
5.4 正则化
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)回归
等会后续在我的博客中补充