引言
Scikit-learn 是一个开源的机器学习库,它支持 Python 编程语言。它提供了多种机器学习算法的实现,并用于数据挖掘和数据分析
文章目录
- 引言
 - 一、正规方程的定义
 - 二、正规方程的原理
 - 三、使用 Scikit-Learn 实现基于正规方程的闭式解线性回归
 - 3.1 工具
 - 3.2 线性回归闭式解
 - 3.2.1 加载数据集
 - 3.2.2 创建并拟合模型
 - 3.2.3 查看参数
 - 3.2.4 进行预测
 
- 3.3 第二个例子
 - 3.4 总结
 
一、正规方程的定义
在机器学习中,线性回归是一种预测连续值(如房价、温度等)的监督学习算法。闭式解线性回归,也称为正规方程(Normal Equation)方法,是一种直接计算线性回归模型参数的方法,无需迭代
二、正规方程的原理
对于线性回归问题,我们通常有如下形式的模型:
  
     
      
       
       
         y 
        
       
         = 
        
       
         b 
        
       
         + 
        
        
        
          w 
         
        
          1 
         
        
        
        
          x 
         
        
          1 
         
        
       
         + 
        
        
        
          w 
         
        
          2 
         
        
        
        
          x 
         
        
          2 
         
        
       
         + 
        
       
         . 
        
       
         . 
        
       
         . 
        
       
         + 
        
        
        
          w 
         
        
          n 
         
        
        
        
          x 
         
        
          n 
         
        
       
      
        y = b + w_1x_1 + w_2x_2 + ... + w_nx_n 
       
      
    y=b+w1x1+w2x2+...+wnxn
 其中  
     
      
       
       
         y 
        
       
      
        y 
       
      
    y是目标变量, 
     
      
       
        
        
          x 
         
        
          1 
         
        
       
         , 
        
        
        
          x 
         
        
          2 
         
        
       
         , 
        
       
         . 
        
       
         . 
        
       
         . 
        
       
         , 
        
        
        
          x 
         
        
          n 
         
        
       
      
        x_1, x_2, ..., x_n 
       
      
    x1,x2,...,xn是特征, 
     
      
       
        
        
          w 
         
        
          1 
         
        
       
         , 
        
        
        
          w 
         
        
          2 
         
        
       
         , 
        
       
         . 
        
       
         . 
        
       
         . 
        
       
         , 
        
        
        
          w 
         
        
          n 
         
        
       
      
        w_1, w_2, ..., w_n 
       
      
    w1,w2,...,wn 是特征对应的权重, 
     
      
       
       
         b 
        
       
      
        b 
       
      
    b 是截距。
 我们的目标是找到权重  
     
      
       
       
         w 
        
       
      
        w 
       
      
    w 和截距 
     
      
       
       
         b 
        
       
      
        b 
       
      
    b,使得模型预测的误差最小。在正规方程方法中,我们通常使用均方误差(Mean Squared Error, MSE)作为损失函数,其形式如下:
  
     
      
       
       
         J 
        
       
         ( 
        
       
         w 
        
       
         , 
        
       
         b 
        
       
         ) 
        
       
         = 
        
        
        
          1 
         
         
         
           2 
          
         
           m 
          
         
        
        
        
          ∑ 
         
         
         
           i 
          
         
           = 
          
         
           1 
          
         
        
          m 
         
        
       
         ( 
        
        
        
          h 
         
         
         
           w 
          
         
           , 
          
         
           b 
          
         
        
       
         ( 
        
        
        
          x 
         
         
         
           ( 
          
         
           i 
          
         
           ) 
          
         
        
       
         ) 
        
       
         − 
        
        
        
          y 
         
         
         
           ( 
          
         
           i 
          
         
           ) 
          
         
        
        
        
          ) 
         
        
          2 
         
        
       
      
        J(w, b) = \frac{1}{2m} \sum_{i=1}^{m} (h_{w,b}(x^{(i)}) - y^{(i)})^2 
       
      
    J(w,b)=2m1∑i=1m(hw,b(x(i))−y(i))2
 其中  
     
      
       
       
         m 
        
       
      
        m 
       
      
    m是样本数量, 
     
      
       
        
        
          h 
         
         
         
           w 
          
         
           , 
          
         
           b 
          
         
        
       
         ( 
        
       
         x 
        
       
         ) 
        
       
      
        h_{w,b}(x) 
       
      
    hw,b(x) 是我们的假设函数(线性模型)。
 为了最小化损失函数 $J(w, b)4,我们对  
     
      
       
       
         w 
        
       
      
        w 
       
      
    w和  
     
      
       
       
         b 
        
       
      
        b 
       
      
    b进行求导,并令导数等于零。通过这种方式,我们可以得到  
     
      
       
       
         w 
        
       
      
        w 
       
      
    w 和  
     
      
       
       
         b 
        
       
      
        b 
       
      
    b 的闭式解:
  
     
      
       
       
         w 
        
       
         = 
        
       
         ( 
        
        
        
          X 
         
        
          T 
         
        
       
         X 
        
        
        
          ) 
         
         
         
           − 
          
         
           1 
          
         
        
        
        
          X 
         
        
          T 
         
        
       
         y 
        
       
      
        w = (X^T X)^{-1} X^T y 
       
      
    w=(XTX)−1XTy
  
     
      
       
       
         b 
        
       
         = 
        
        
        
          y 
         
        
          ˉ 
         
        
       
         − 
        
        
        
          w 
         
        
          T 
         
        
        
        
          x 
         
        
          ˉ 
         
        
       
      
        b = \bar{y} - w^T \bar{x} 
       
      
    b=yˉ−wTxˉ
 其中:
 - 
     
      
       
       
         X 
        
       
      
        X 
       
      
    X是一个  
     
      
       
       
         m 
        
       
         × 
        
       
         n 
        
       
      
        m \times n 
       
      
    m×n 的矩阵,包含了所有样本的特征(每一行是一个样本,每一列是一个特征)。
- X T X^T XT 是 X X X 的转置。
 - x ˉ \bar{x} xˉ 是所有样本特征的平均值。
 - y ˉ \bar{y} yˉ 是所有样本目标值的平均值。
 
三、使用 Scikit-Learn 实现基于正规方程的闭式解线性回归
- 利用开源的、可用于商业目的的机器学习工具包— scikit-learn实现基于正规方程的闭式解线性回归
 
3.1 工具
使用scikit-learn的函数以及matplotlib和NumPy
import numpy as np
np.set_printoptions(precision=2)
from sklearn.linear_model import LinearRegression, SGDRegressor
from sklearn.preprocessing import StandardScaler
from lab_utils_multi import  load_house_data
import matplotlib.pyplot as plt
dlblue = '#0096ff'; dlorange = '#FF9300'; dldarkred='#C00000'; dlmagenta='#FF40FF'; dlpurple='#7030A0'; 
plt.style.use('./deeplearning.mplstyle')
 
 
3.2 线性回归闭式解
Scikit-learn 有一个 线性回归模型,它实现了闭式线性回归。
 让我们使用早期实验的数据 - 一个 1000 平方英尺的房子以 30 万美元的价格售出,一个 2000 平方英尺的房子以 50 万美元的价格售出。
| 房屋面积 (1000 平方英尺) | 价格 (以千美元计) | 
|---|---|
| 1 | 300 | 
| 2 | 500 | 
3.2.1 加载数据集
X_train = np.array([1.0, 2.0])   # 特征
y_train = np.array([300, 500])   # 目标值
 
3.2.2 创建并拟合模型
下面的代码使用scikit-learn执行回归。
- 创建一个回归对象。
 - 第二步使用与对象关联的方法 
fit。这执行回归,将参数拟合到输入数据。工具包期望一个二维的 X 矩阵。 
linear_model = LinearRegression()
# X 必须是一个 2-D 矩阵
linear_model.fit(X_train.reshape(-1, 1), y_train) 
 
输出结果:
 
3.2.3 查看参数
在scikit-learn中, 
     
      
       
       
         w 
        
       
      
        \mathbf{w} 
       
      
    w 和  
     
      
       
       
         b 
        
       
      
        \mathbf{b} 
       
      
    b 参数被称为 ‘系数’ 和 ‘截距’。
b = linear_model.intercept_
w = linear_model.coef_
print(f"w = {w:}, b = {b:0.2f}")
print(f"'手动' 预测: f_wb = wx+b : {1200*w + b}")
 
3.2.4 进行预测
调用 predict 函数生成预测。
y_pred = linear_model.predict(X_train.reshape(-1, 1))
print("训练集上的预测结果:", y_pred)
X_test = np.array([[1200]])
print(f"预测 1200 平方英尺房子的价格: ${linear_model.predict(X_test)[0]:0.2f}")
 
3.3 第二个例子
第二个例子来自一个早期的实验,该实验具有多个特征。最终的参数值和预测结果与该实验中未标准化的 ‘长期运行’ 结果非常接近。那次未标准化的运行花费了数小时才产生结果,而这个几乎是即时的。闭式解在像这样的小型数据集上工作得很好,但在大型数据集上可能会计算上要求较高。
闭式解不需要标准化
# 加载数据集
X_train, y_train = load_house_data()
X_features = ['size(sqft)','bedrooms','floors','age']
linear_model = LinearRegression()
linear_model.fit(X_train, y_train) 
b = linear_model.intercept_
w = linear_model.coef_
print(f"w = {w:}, b = {b:0.2f}")
print(f"训练集上的预测结果:\n {linear_model.predict(X_train)[:4]}" )
print(f"使用 w,b 的预测结果:\n {(X_train @ w + b)[:4]}")
print(f"目标值 \n {y_train[:4]}")
x_house = np.array([1200, 3,1, 40]).reshape(-1,4)
x_house_predict = linear_model.predict(x_house)[0]
print(f" 预测一个 1200 平方英尺,3 个卧室,1 层,40 年历史的房子的价格 = ${x_house_predict*1000:0.2f}")
 
输出结果:
 
 
3.4 总结
- 利用了一个开源的机器学习工具包,
scikit-learn - 使用该工具包实现了闭式解的线性回归
 



![[QT开发_音乐播放器项目笔记01]](https://i-blog.csdnimg.cn/direct/f2e8d9042bd44fddb8654f32eb3de2bb.png)















