使用正规方程来求解线性回归问题
1、接续前面两小节(1-线性回归之单变量线性回归基本原理的python实现_骑着蜗牛环游深度学习世界的博客-CSDN博客和2-线性回归之多变量线性回归基本原理的python实现_骑着蜗牛环游深度学习世界的博客-CSDN博客)
2、正规方程的使用受限:
①特征数不能太多,通常来说当n小于10000 时还是可以接受的
②只适用于线性模型,不适合逻辑回归模型等其他模型
3、正规方程的优点:
①无需进行特征缩放(即无需归一化)
②不需要迭代
1正规方程原理简述
- 正规方程是通过求解式(1)来找出使得代价函数最小的参数的:
∂ ∂ θ j J ( θ j ) = 0 (1) \frac{\partial }{\partial {{\theta }_{j}}}J\left( {{\theta }_{j}} \right)=0 \tag{1} ∂θj∂J(θj)=0(1)
- 对于训练集的特征矩阵 X X X(已包含 x 0 = 1 x_0=1 x0=1),标签向量 y y y,利用正规方程解出向量 θ = ( X T X ) − 1 X T y \theta ={{\left( {{X}^{T}}X \right)}^{-1}}{{X}^{T}}y θ=(XTX)−1XTy,(具体的推导过程可以看下图)
2python实操
- 构建正规方程函数:
# 正规方程
def normalEqn(X, y):
# 如果使用pinv则可以处理逆矩阵不存在的情况
theta = np.linalg.inv(X.T@X)@X.T@y # X.T@X等价于X.T.dot(X)
return theta
- 使用正规方程求解参数向量(这里使用的是第二篇文章的多特征数据集,为了与使用梯度下降的结果进行对比,还是进行了特征缩放):
# 多变量正规方程求解
raw_data = pd.read_csv('ex1data2.txt', names=['square', 'bedrooms', 'price'])
# 实际数据规范化结果
data = normalize_feature(raw_data)
X = get_X(data)
y = get_y(data)
final_theta2=normalEqn(X, y)
final_theta2
# 结果如下:
- 从结果来看,还是有差距的