目录

1 机器学习

监督学习与无监督学习

(一)监督学习(Supervised learning)

(二)无监督学习(Unsupervised learning)

2 一元线性回归(单变量线性回归)

2.1 线性回归模型

2.1.1 认识数据集

2.1.2 公式

2.2 成本函数(代价函数)

2.2.1 公式

2.2.2 直观理解 

2.3 梯度下降

2.3.1 原理

2.3.2 直观理解

2.3.3 学习率

2.3.4 线性回归的梯度下降

3 多元线性回归 (多变量线性回归)

3.1 多变量的模型预测

3.1.1 多类特征

3.1.2 公式

3.2 用多个变量计算成本

3.3 多元线性回归的梯度下降

 梯度下降的一种替代方法——正规方程(Normal Equation)

3.4 特征缩放

3.4.1 除以最大值

3.4.2 均值归一化(Mean normalization)

3.4.3 Z-分数归一化(Z - score normalization)

3.5 检查梯度下降是否收敛

3.5.1 观察学习曲线

3.5.2 使用自动收敛测试

 3.6 学习率的选择

3.7 特征工程

3.8 多项式回归

4 逻辑回归 (logistic regression)

4.1 分类——逻辑回归

4.1.1 二元分类问题

4.1.2 线性回归对于分类问题的局限性

4.1.3 Sigmoid 函数

 4.1.4 决策边界

4.2 逻辑回归的代价函数

简化版代价函数

4.3 逻辑回归的梯度下降

4.4 过拟合问题

高偏差(High Bias)——欠拟合

高方差(High Variance)——过拟合

 4.5 解决过拟合

4.5.1 收集更多的训练数据 

4.5.2 减少特征,进行“特征选择” 

 4.5.3 正则化(Regularization)

正则化代价函数

正则化参数的作用 

正则化线性回归

代价函数

梯度函数 

正则化逻辑回归

 代价函数

 梯度函数 


1 机器学习

监督学习与无监督学习

(一)监督学习(Supervised learning)

监督学习是在已知正确答案(标签)的数据集上进行训练的学习方式。其主要任务分为回归和分类。

回归:预测连续型数值。例如,根据房屋的各种特征(面积、房间数量等)预测房价,这里房价是一个连续的数值。

分类:预测离散型类别。比如,根据肿瘤的大小判断其是良性还是恶性,结果只有 “良性” 和 “恶性” 两种类别。

(二)无监督学习(Unsupervised learning)

无监督学习是在没有预先标注标签的数据集上进行学习。它旨在发现数据中的内在结构和模式。无监督学习不需要预先知道数据的类别,能够帮助我们从复杂的数据中挖掘出有价值的信息。

聚类:将相似的数据点归为一组,实现对数据的分类整理。在新闻领域,可把主题相同的新闻文章归在一起;在客户数据分析中,依据客户的特征和行为,划分不同的市场细分群体。

降维:用较少的数据表示原有数据,降低数据维度,去除冗余信息,在不损失关键信息的前提下简化数据,提升处理效率。

异常检测:找出数据集中与其他数据差异较大、不符合常规模式的异常点。在网络安全监测、设备故障检测等方面有重要应用,及时发现异常情况,保障系统正常运行。

2 一元线性回归(单变量线性回归)

2.1 线性回归模型

2.1.1 认识数据集

2.1.2 公式

f_{w, b}(x) = wx + b 

通过训练数据集来调整 \(w\) 和 \(b\) 的值,使得模型能够尽可能准确地预测目标值。

2.2 成本函数(代价函数)

2.2.1 公式

成本函数衡量模型预测值与真实值的差距,目标是找到使成本最小的 w 和 b。

一个变量的成本方程式是:

J(w, b) = \frac{1}{2m} \sum_{i=0}^{m-1} \left( f_{w, b}(x^{(i)}) - y^{(i)} \right)^2

 m是数据集中的训练实例的数量

计算成本的函数如下:

def compute_cost(x, y, w, b): 
    """
    Computes the cost function for linear regression.
    
    Args:
      x (ndarray (m,)): Data, m examples 
      y (ndarray (m,)): target values
      w,b (scalar)    : model parameters  
    
    Returns
        total_cost (float): The cost of using w,b as the parameters for linear regression
               to fit the data points in x and y
    """
    # number of training examples
    m = x.shape[0]    #通过x数组的形状获取训练样本的数量m
    
    cost_sum = 0 
    for i in range(m): 
        f_wb = w * x[i] + b   
        cost = (f_wb - y[i]) ** 2  
        cost_sum = cost_sum + cost  
    total_cost = (1 / (2 * m)) * cost_sum  

    return total_cost

2.2.2 直观理解 

2.3 梯度下降

2.3.1 原理

梯度下降通过迭代更新参数,逐步逼近成本函数的最小值:

w = w - \alpha \frac{\partial J(w, b)}{\partial w}

b = b - \alpha \frac{\partial J(w, b)}{\partial b}

2.3.2 直观理解

2.3.3 学习率

2.3.4 线性回归的梯度下降

梯度的定义为:

\frac{\partial J(w, b)}{\partial w} = \frac{1}{m} \sum_{i=0}^{m-1} (f_{w, b}(x^{(i)}) - y^{(i)}) x^{(i)}

\frac{\partial J(w, b)}{\partial b} = \frac{1}{m} \sum_{i=0}^{m-1} (f_{w, b}(x^{(i)}) - y^{(i)})

计算梯度公式:

def compute_gradient(x, y, w, b): 
    """
    Computes the gradient for linear regression 
    Args:
      x (ndarray (m,)): Data, m examples 
      y (ndarray (m,)): target values
      w,b (scalar)    : model parameters  
    Returns
      dj_dw (scalar): The gradient of the cost w.r.t. the parameters w
      dj_db (scalar): The gradient of the cost w.r.t. the parameter b     
     """
    
    # Number of training examples
    m = x.shape[0]    
    dj_dw = 0
    dj_db = 0
    
    for i in range(m):  
        f_wb = w * x[i] + b 
        dj_dw_i = (f_wb - y[i]) * x[i] 
        dj_db_i = f_wb - y[i] 
        dj_db += dj_db_i
        dj_dw += dj_dw_i 
    dj_dw = dj_dw / m 
    dj_db = dj_db / m 
        
    return dj_dw, dj_db

3 多元线性回归 (多变量线性回归)

3.1 多变量的模型预测

3.1.1 多类特征

3.1.2 公式

3.2 用多个变量计算成本

有多个变量的成本方程式是:

J(\mathbf{w}, b) = \frac{1}{2m} \sum_{i=0}^{m-1} (f_{\mathbf{w}, b}(\mathbf{x}^{(i)}) - y^{(i)})^2

其中

 f_{\mathbf{w}, b}(\mathbf{x}^{(i)}) = \mathbf{w} \cdot \mathbf{x}^{(i)} + b

 \mathbf{w}\mathbf{x}^{(i)}是支持多个特征的向量而不是标量。

def compute_cost(X, y, w, b): 
    """
    compute cost
    Args:
      X (ndarray (m,n)): Data, m examples with n features
      y (ndarray (m,)) : target values
      w (ndarray (n,)) : model parameters  
      b (scalar)       : model parameter
      
    Returns:
      cost (scalar): cost
    """
    m = X.shape[0]
    cost = 0.0
    for i in range(m):                                
        f_wb_i = np.dot(X[i], w) + b           #(n,)(n,) = 标量 (见 np.dot)
        cost = cost + (f_wb_i - y[i])**2       #标量
    cost = cost / (2 * m)                      #标量   
    return cost

3.3 多元线性回归的梯度下降

多变量的梯度下降:

                                            w_j = w_j - \alpha \frac{\partial J(\mathbf{w}, b)}{\partial w_j} \quad \text{for } j = 0, \ldots, n-1

                                               b = b - \alpha \frac{\partial J(\mathbf{w}, b)}{\partial b}  

其中,n是特征的数量      

 \frac{\partial J(\mathbf{w}, b)}{\partial w_j} = \frac{1}{m} \sum_{i=0}^{m-1} (f_{\mathbf{w}, b}(\mathbf{x}^{(i)}) - y^{(i)}) x_j^{(i)}

\frac{\partial J(\mathbf{w}, b)}{\partial b} = \frac{1}{m} \sum_{i=0}^{m-1} (f_{\mathbf{w}, b}(\mathbf{x}^{(i)}) - y^{(i)})

def compute_gradient(X, y, w, b): 
    """
    Computes the gradient for linear regression 
    Args:
      X (ndarray (m,n)): Data, m examples with n features
      y (ndarray (m,)) : target values
      w (ndarray (n,)) : model parameters  
      b (scalar)       : model parameter
      
    Returns:
      dj_dw (ndarray (n,)): The gradient of the cost w.r.t. the parameters w. 
      dj_db (scalar):       The gradient of the cost w.r.t. the parameter b. 
    """
    m,n = X.shape           #(例子的数量,特征的数量)
    dj_dw = np.zeros((n,))  #初始化 dj_dw 为一个长度为 n 的零向量,用于存储关于 w 的梯度
    dj_db = 0.              #初始化 dj_db 为 0.(浮点数),用于存储关于 b 的梯度

    for i in range(m):                             
        err = (np.dot(X[i], w) + b) - y[i]   
        for j in range(n):                         
            dj_dw[j] = dj_dw[j] + err * X[i, j]    
        dj_db = dj_db + err                        
    dj_dw = dj_dw / m                                
    dj_db = dj_db / m                                
        
    return dj_db, dj_dw

 梯度下降的一种替代方法——正规方程(Normal Equation)

  • 用途

    • 只适用于线性回归。

    • 直接求解参数 w 和 b,无需迭代。

  • 缺点

    • 不适用于其他学习算法。

    • 当特征数量较大(超过10,000)时,计算速度较慢。

3.4 特征缩放

特征缩放,基本上是将每个特征除以一个用户选择的值,以导致-1和1之间的范围。

通过将特征缩放到同一尺度,可以显著提高梯度下降的收敛速度和稳定性,从而提高模型训练的效率和效果。

3.4.1 除以最大值

3.4.2 均值归一化(Mean normalization)

3.4.3 Z-分数归一化(Z - score normalization)

3.5 检查梯度下降是否收敛

3.5.1 观察学习曲线

绘制每次迭代后的损失函数值,观察曲线的变化趋势:

  • 如果曲线持续下降且最终趋于平缓,则说明梯度下降正在收敛。
  • 如果曲线在某一点之后不再显著下降,则说明可能已经收敛。

3.5.2 使用自动收敛测试

  • 设定一个阈值 ϵ(epsilon,例如10^{-3})。
  • 计算连续两次迭代之间的损失函数值差。
  • 如果这个差值小于或等于 ϵ,则认为梯度下降已经收敛。

 3.6 学习率的选择

一个正确实现梯度下降的调试技巧,以足够小的学习速度,成本函数应该在每一次迭代中降低。

如果梯度下降不起作用,通常将学习率设置为非常小,看看这是否会导致每次迭代的成本降低,如果J不会在每次迭代中减小,大概率就是代码出现了问题。

 从小的值每次乘以三倍逐渐增加,找到最大合理值或比最大合理值略小的值。

3.7 特征工程

特征工程是利用直觉,通过对原始特征进行转换或组合来设计新特征的过程。

在该例子中,就是基于房屋面积的计算逻辑,将临街宽度和深度这两个原始特征组合成新的面积特征,以期望模型能够更好地捕捉数据中的信息,提升模型的性能。

3.8 多项式回归

多项式回归是一种用于描述和分析数据之间非线性关系的回归分析方法。它通过增加独立变量的幂次项,将原本可能不符合线性模型的数据拟合成一个多项式函数的形式。

特征缩放变得更加重要,需要将特征转换为可比的值的范围 

4 逻辑回归 (logistic regression)

4.1 分类——逻辑回归

4.1.1 二元分类问题

逻辑回归是机器学习中经典的分类算法,尽管名称中有“回归”二字,但它广泛用于二分类任务,这类问题的输出结果只有两个类别。像判断一封邮件是否为垃圾邮件、一笔交易是否欺诈、肿瘤是良性还是恶性等。在数学表示上,通常用 0 和 1 来代表这两个类别 ,不过要注意,这里的 0 和 1 不代表数值大小,只是类别标识。

4.1.2 线性回归对于分类问题的局限性

线性回归输出范围不受限(可能超出[0,1]),无法直接表示概率。

当新增极端数据点时,线性回归的阈值分类效果变差。

4.1.3 Sigmoid 函数

为了让模型输出符合分类需求,逻辑回归引入了逻辑函数,也就是 sigmoid 函数

g(z) = \frac{1}{1 + e^{-z}}

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

 4.1.4 决策边界

逻辑回归通过决策边界将特征空间划分为不同类别区域。

 

4.2 逻辑回归的代价函数

将线性回归的损失函数用到逻辑回归中得到的是非凸函数,成本函数会有很多个局部最小值点,不利于模型训练。

单个训练例子中的损失loss:L(f_{\overrightarrow{w}, b}(\overrightarrow{x}^{(i)}), y^{(i)})

f总是在0到1之间,因为逻辑回归的输出总是在0到1之间,当f的预测值越接近y的真实标签时,损失函数最低,当f的预测值越远离y的真实标签时,损失函数越高。

损失函数的第一部分,如上图,真实标签为1,如果算法预测的概率接近1,则损失很小,接近于0;如果算法预测的概率接近0,则损失很大,接近于无穷,所以当预测值接近1时,损失是最低的。

损失函数的第二部分,如上图,真实标签为0,如果算法预测的概率接近0,则损失很小,接近于0;如果算法预测的概率接近1,则损失很大,接近于无穷,所以当预测值接近0时,损失是最低的。 

简化版代价函数

 maximum likelihood  最大似然估计

def compute_cost_logistic(X, y, w, b):
    """
    Computes cost

    Args:
      X (ndarray (m,n)): Data, m examples with n features
      y (ndarray (m,)) : target values
      w (ndarray (n,)) : model parameters  
      b (scalar)       : model parameter
      
    Returns:
      cost (scalar): cost
    """

    m = X.shape[0]
    cost = 0.0
    for i in range(m):
        z_i = np.dot(X[i],w) + b
        f_wb_i = sigmoid(z_i)
        cost +=  -y[i]*np.log(f_wb_i) - (1-y[i])*np.log(1-f_wb_i)
             
    cost = cost / m
    return cost

4.3 逻辑回归的梯度下降

梯度下降算法,和线性回归一样:

                                            w_j = w_j - \alpha \frac{\partial J(\mathbf{w}, b)}{\partial w_j} \quad \text{for } j = 0, \ldots, n-1

                                               b = b - \alpha \frac{\partial J(\mathbf{w}, b)}{\partial b}  

其中:

\frac{\partial J(\mathbf{w}, b)}{\partial w_j} = \frac{1}{m} \sum_{i=0}^{m-1} \left( f_{\mathbf{w}, b}(\mathbf{x}^{(i)}) - y^{(i)} \right) x_j^{(i)}

\frac{\partial J(\mathbf{w}, b)}{\partial b} = \frac{1}{m} \sum_{i=0}^{m-1} \left( f_{\mathbf{w}, b}(\mathbf{x}^{(i)}) - y^{(i)} \right)

def compute_gradient_logistic(X, y, w, b): 
    """
    Computes the gradient for linear regression 
 
    Args:
      X (ndarray (m,n): Data, m examples with n features
      y (ndarray (m,)): target values
      w (ndarray (n,)): model parameters  
      b (scalar)      : model parameter
    Returns
      dj_dw (ndarray (n,)): The gradient of the cost w.r.t. the parameters w. 
      dj_db (scalar)      : The gradient of the cost w.r.t. the parameter b. 
    """
    m,n = X.shape
    dj_dw = np.zeros((n,))                           #(n,)
    dj_db = 0.

    for i in range(m):
        f_wb_i = sigmoid(np.dot(X[i],w) + b)          #(n,)(n,)=scalar
        err_i  = f_wb_i  - y[i]                       #scalar
        for j in range(n):
            dj_dw[j] = dj_dw[j] + err_i * X[i,j]      #scalar
        dj_db = dj_db + err_i
    dj_dw = dj_dw/m                                   #(n,)
    dj_db = dj_db/m                                   #scalar
        
    return dj_db, dj_dw  

4.4 过拟合问题

高偏差(High Bias)——欠拟合

高偏差指模型过于简单,无法捕捉数据中的基本规律,导致在训练集和测试集上表现均较差。

高方差(High Variance)——过拟合

高方差指模型过于复杂,过度拟合训练数据中的噪声和细节,导致在测试集上泛化能力差。

 4.5 解决过拟合

4.5.1 收集更多的训练数据 

4.5.2 减少特征,进行“特征选择” 

 4.5.3 正则化(Regularization)

正则化代价函数

\(\frac{1}{2m}\sum_{i = 1}^{m}(f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)})^2\) 是均方误差项,用于衡量模型预测值 \(f_{\vec{w},b}(\vec{x}^{(i)})\) 与真实值 \(y^{(i)}\) 之间的误差,目的是让模型拟合数据(fit data);\(\frac{\lambda}{2m}\sum_{j = 1}^{n}w_j^2\) 是正则化项,\(\lambda\) 是正则化参数,\(n\) 是特征数量,该项的作用是使权重 \(w_j\) 保持较小(Keep \(w_j\) small)。

正则化参数的作用 

\(\lambda = 0\)起到平衡上述两个目标的作用。如果\(\lambda = 0\),则正则化项不起作用,模型可能会出现过拟合,如图中左侧蓝色曲线所示,过于拟合训练数据中的噪声和细节。如果选择\(\lambda = 10^{10}\) ,即\(\lambda\)非常大,那么正则化项的惩罚力度很强,会使得权重\(w_1\)、\(w_2\)、\(w_3\)、\(w_4\)等都趋近于 0(\(\approx 0\)),此时模型就近似为\(f(x)=b\) ,过于简单,可能导致欠拟合。

正则化线性回归

代价函数
def compute_cost_logistic_reg(X, y, w, b, lambda_ = 1):
    """
    Computes the cost over all examples
    Args:
    Args:
      X (ndarray (m,n): Data, m examples with n features
      y (ndarray (m,)): target values
      w (ndarray (n,)): model parameters  
      b (scalar)      : model parameter
      lambda_ (scalar): Controls amount of regularization
    Returns:
      total_cost (scalar):  cost 
    """

    m,n  = X.shape
    cost = 0.
    for i in range(m):
        z_i = np.dot(X[i], w) + b                                      #(n,)(n,)=scalar, see np.dot
        f_wb_i = sigmoid(z_i)                                          #scalar
        cost +=  -y[i]*np.log(f_wb_i) - (1-y[i])*np.log(1-f_wb_i)      #scalar
             
    cost = cost/m                                                      #scalar

    reg_cost = 0
    for j in range(n):
        reg_cost += (w[j]**2)                                          #scalar
    reg_cost = (lambda_/(2*m)) * reg_cost                              #scalar
    
    total_cost = cost + reg_cost                                       #scalar
    return total_cost             
梯度函数 
def compute_gradient_linear_reg(X, y, w, b, lambda_): 
    """
    Computes the gradient for linear regression 
    Args:
      X (ndarray (m,n): Data, m examples with n features
      y (ndarray (m,)): target values
      w (ndarray (n,)): model parameters  
      b (scalar)      : model parameter
      lambda_ (scalar): Controls amount of regularization
      
    Returns:
      dj_dw (ndarray (n,)): The gradient of the cost w.r.t. the parameters w. 
      dj_db (scalar):       The gradient of the cost w.r.t. the parameter b. 
    """
    m,n = X.shape           #(number of examples, number of features)
    dj_dw = np.zeros((n,))
    dj_db = 0.

    for i in range(m):                             
        err = (np.dot(X[i], w) + b) - y[i]                 
        for j in range(n):                         
            dj_dw[j] = dj_dw[j] + err * X[i, j]               
        dj_db = dj_db + err                        
    dj_dw = dj_dw / m                                
    dj_db = dj_db / m   
    
    for j in range(n):
        dj_dw[j] = dj_dw[j] + (lambda_/m) * w[j]

    return dj_db, dj_dw
正则化逻辑回归

 代价函数
def compute_cost_logistic_reg(X, y, w, b, lambda_ = 1):
    """
    Computes the cost over all examples
    Args:
    Args:
      X (ndarray (m,n): Data, m examples with n features
      y (ndarray (m,)): target values
      w (ndarray (n,)): model parameters  
      b (scalar)      : model parameter
      lambda_ (scalar): Controls amount of regularization
    Returns:
      total_cost (scalar):  cost 
    """

    m,n  = X.shape
    cost = 0.
    for i in range(m):
        z_i = np.dot(X[i], w) + b                                      #(n,)(n,)=scalar, see np.dot
        f_wb_i = sigmoid(z_i)                                          #scalar
        cost +=  -y[i]*np.log(f_wb_i) - (1-y[i])*np.log(1-f_wb_i)      #scalar
             
    cost = cost/m                                                      #scalar

    reg_cost = 0
    for j in range(n):
        reg_cost += (w[j]**2)                                          #scalar
    reg_cost = (lambda_/(2*m)) * reg_cost                              #scalar
    
    total_cost = cost + reg_cost                                       #scalar
    return total_cost      
 梯度函数 
def compute_gradient_logistic_reg(X, y, w, b, lambda_): 
    """
    Computes the gradient for linear regression 
 
    Args:
      X (ndarray (m,n): Data, m examples with n features
      y (ndarray (m,)): target values
      w (ndarray (n,)): model parameters  
      b (scalar)      : model parameter
      lambda_ (scalar): Controls amount of regularization
    Returns
      dj_dw (ndarray Shape (n,)): The gradient of the cost w.r.t. the parameters w. 
      dj_db (scalar)            : The gradient of the cost w.r.t. the parameter b. 
    """
    m,n = X.shape
    dj_dw = np.zeros((n,))                            #(n,)
    dj_db = 0.0                                       #scalar

    for i in range(m):
        f_wb_i = sigmoid(np.dot(X[i],w) + b)          #(n,)(n,)=scalar
        err_i  = f_wb_i  - y[i]                       #scalar
        for j in range(n):
            dj_dw[j] = dj_dw[j] + err_i * X[i,j]      #scalar
        dj_db = dj_db + err_i
    dj_dw = dj_dw/m                                   #(n,)
    dj_db = dj_db/m                                   #scalar

    for j in range(n):
        dj_dw[j] = dj_dw[j] + (lambda_/m) * w[j]

    return dj_db, dj_dw  
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐