一元线性回归模型
定义: 运用一条直线,近似地表示自变量x与因变量y之间的关系
公式: Y=aX+b
问题: 以下那条直线更能代表x和y的关系?
问题: 如何理解线与散点之间的关系?
目标:一条直线使得实际y与预测y之间的距离整体最短(一条直线使得全局误差最小)
线性回归模型损失函数:
线性回归模型参数优化目标:
最小二乘法
用最小二乘法求解上述损失函数的最小值(二次函数的最小值)
关于参数a与b的损失函数:
优化目标:
优化转化:求偏导并令一阶导数为0
代入自变量x和因变量y,即可求得a和b的值。
多元线性回归模型
公式:
损失函数:
矩阵求解:
假设 x0 = 1 ,a0=b, 则多元回归模型公式可变为:
公式的向量转化:
- 将 x0,x1,…,xn 表示成为一个长度为n+1 的向量X (列向量)
- 将参数 a0,a1,…,an表示成为一个长度为n+1的向量A(列向量)
则模型公式可以转化为:
假设建模数据集有m条样本:
- 将自变量 [x00,x01,…,x0n] … [xm0,xm1,…,xmn] 表示成为一个长度为 m*(n+1) 的矩阵X
- 将y1,y2,…,ym表示成为一个长度为m的列向量Y
- 将参数a0,a1,…,an 表示成为一个长度为 n+1 的列向量A
则多元线性回归的损失函数可转化为:
对参数向量A求导:
解出A:
numpy实现多元线性回归模型
下面通过一个示例,来实现多元线性回归模型参数矩阵A的求解过程,代码示例用到的数据集:https://download.csdn.net/download/d1240673769/20910882
1.加载数据
import pandas as pd
import numpy as np
# 读取样例数据,房价数据
df = pd.read_csv('sample_data_sets.csv')
print(df.columns)
print(df.shape)
df.head()
2.提取自变量
# 提取自变量,以area和daypop为例,即房屋面积和房屋周边日均人口
x_df = df[['area','daypop']].reset_index(drop = True)
print(x_df.shape)
print(x_df.head())
3.提取因变量
# 提取因变量,房屋价格作为因变量
y_df = df['average_price'].reset_index(drop = True)
print(y_df.shape)
print(y_df.head())
4.添加x0列
# 令x0 = 1
# 方便之后将参数b转换成x0*a0
x_df['x0'] = 1 # 定义新的一列,x0 并赋值为1
print(x_df.shape)
print(x_df.head())
5.将自变量、因变量转换成矩阵形式
# 将自变量、因变量转换成矩阵形式
x_array = np.array(x_df) # 将df转化为array
xmatrix = np.mat(x_array) # 将array转化为矩阵
#将y转换成列为1的矩阵:
y_array = np.array(y_df)
ymatrix = np.mat(y_array).T # np.mat(y_array) 为行向量,转置后为列向量
print(ymatrix.shape)
6.计算X与X的转置的乘积
# 计算X与X的转置的乘积
xTx = xmatrix.T * xmatrix
print(xTx.shape)
print(xTx)
7.计算xTx的逆矩阵
# 判断xTx是否是非奇异的
if np.linalg.det(xTx) == 0:
print('对称矩阵非奇异')
else:
print('矩阵可逆')
# 如果对称矩阵不是非奇异的
# 计算xTx的逆矩阵
xTxI = xTx.I
print(xTxI)
8.估计参数
A = xTxI * xmatrix.T * ymatrix
print(A)
print(A.shape)
8.使用参数A计算预测值y
# 使用参数A计算预测值y
y_predict = xmatrix*A
#print(y_predict)