可选实验:逻辑回归
在这个不评分的实验中,你会
- 探索sigmoid函数(也称为logistic函数)
- 探索逻辑回归;哪个用到了s型函数
import numpy as np
%matplotlib widget
import matplotlib.pyplot as plt
from plt_one_addpt_onclick import plt_one_addpt_onclick
from lab_utils_common import draw_vthresh
plt.style.use('./deeplearning.mplstyle')
Sigmoid或Logistic函数
正如讲座视频中所讨论的,对于分类任务,我们可以从使用线性回归模型 
     
      
       
        
        
          f 
         
         
         
           w 
          
         
           , 
          
         
           b 
          
         
        
       
         ( 
        
        
        
          x 
         
         
         
           ( 
          
         
           i 
          
         
           ) 
          
         
        
       
         ) 
        
       
         = 
        
       
         w 
        
       
         ⋅ 
        
        
        
          x 
         
         
         
           ( 
          
         
           i 
          
         
           ) 
          
         
        
       
         + 
        
       
         b 
        
       
      
        f_{\mathbf{w},b}(\mathbf{x}^{(i)}) = \mathbf{w} \cdot \mathbf{x}^{(i)} + b 
       
      
    fw,b(x(i))=w⋅x(i)+b开始,来预测给定 
     
      
       
       
         x 
        
       
      
        x 
       
      
    x的 
     
      
       
       
         y 
        
       
      
        y 
       
      
    y。
 -然而,我们希望我们的分类模型的预测在0和1之间,因为我们的输出变量 
     
      
       
       
         y 
        
       
      
        y 
       
      
    y是0或1。
 -这可以通过使用“sigmoid函数”来完成,该函数将所有输入值映射到0到1之间的值。
 我们来实现s型函数,自己看看。
 
Sigmoid函数的公式
s型函数的公式如下
  
     
      
       
       
         g 
        
       
         ( 
        
       
         z 
        
       
         ) 
        
       
         = 
        
        
        
          1 
         
         
         
           1 
          
         
           + 
          
          
          
            e 
           
           
           
             − 
            
           
             z 
            
           
          
         
        
       
      
        g(z) = \frac{1}{1+e^{-z}} 
       
      
    g(z)=1+e−z1
 在逻辑回归的情况下,z (sigmoid函数的输入)是线性回归模型的输出。
- 单个示例时,“ z z z”为标量。
- 在多个示例的情况下, z z z可能是由 m m m值组成的向量,每个示例一个。
- sigmoid函数的实现应该涵盖这两种可能的输入格式。让我们在Python中实现它。
NumPy有一个名为exp()的函数,它提供了一种方便的方法来计算输入数组 z 中所有元素的指数( 
     
      
       
        
        
          e 
         
        
          z 
         
        
       
      
        e^{z} 
       
      
    ez)。
 它还可以使用单个数字作为输入,如下所示。
# Input is an array. 
input_array = np.array([1,2,3])
exp_array = np.exp(input_array)
print("Input to exp:", input_array)
print("Output of exp:", exp_array)
# Input is a single number
input_val = 1  
exp_val = np.exp(input_val)
print("Input to exp:", input_val)
print("Output of exp:", exp_val)
sigmoid函数是用python实现的,如下面的单元格所示。
def sigmoid(z):
    """
    Compute the sigmoid of z
    Args:
        z (ndarray): A scalar, numpy array of any size.
    Returns:
        g (ndarray): sigmoid(z), with the same shape as z
         
    """
    g = 1/(1+np.exp(-z))
   
    return g
让我们看看对于不同的z值这个函数的输出是什么
# Generate an array of evenly spaced values between -10 and 10
z_tmp = np.arange(-10,11)
# Use the function implemented above to get the sigmoid values
y = sigmoid(z_tmp)
# Code for pretty printing the two arrays next to each other
np.set_printoptions(precision=3) 
print("Input (z), Output (sigmoid(z))")
print(np.c_[z_tmp, y])
左列的值为z,右列的值为s型(z)。如您所见,sigmoid的输入值范围从-10到10,输出值范围从0到1。
 现在,让我们尝试使用matplotlib库绘制这个函数。
# Plot z vs sigmoid(z)
fig,ax = plt.subplots(1,1,figsize=(5,3))
ax.plot(z_tmp, y, c="b")
ax.set_title("Sigmoid function")
ax.set_ylabel('sigmoid(z)')
ax.set_xlabel('z')
draw_vthresh(ax,0)
如你所见,当z趋于负值时,s型函数趋于0,当z趋于正值时,s型函数趋于1。
逻辑回归
逻辑回归模型将s型曲线应用于我们熟悉的线性回归模型,如下图所示:
  
      
       
        
         
          
          
           
            
            
              f 
             
             
             
               w 
              
             
               , 
              
             
               b 
              
             
            
           
             ( 
            
            
            
              x 
             
             
             
               ( 
              
             
               i 
              
             
               ) 
              
             
            
           
             ) 
            
           
             = 
            
           
             g 
            
           
             ( 
            
           
             w 
            
           
             ⋅ 
            
            
            
              x 
             
             
             
               ( 
              
             
               i 
              
             
               ) 
              
             
            
           
             + 
            
           
             b 
            
           
             ) 
            
           
          
          
          
          
            (2) 
           
          
         
        
       
         f_{\mathbf{w},b}(\mathbf{x}^{(i)}) = g(\mathbf{w} \cdot \mathbf{x}^{(i)} + b ) \tag{2} 
        
       
     fw,b(x(i))=g(w⋅x(i)+b)(2)
  
     
      
       
       
         g 
        
       
         ( 
        
       
         z 
        
       
         ) 
        
       
         = 
        
        
        
          1 
         
         
         
           1 
          
         
           + 
          
          
          
            e 
           
           
           
             − 
            
           
             z 
            
           
          
         
        
       
      
        g(z) = \frac{1}{1+e^{-z}} 
       
      
    g(z)=1+e−z1

 让我们将逻辑回归应用到肿瘤分类的分类数据示例中。
 首先,加载示例和参数的初始值。
x_train = np.array([0., 1, 2, 3, 4, 5])
y_train = np.array([0,  0, 0, 1, 1, 1])
w_in = np.zeros((1))
b_in = 0
尝试以下步骤:
- 点击“运行逻辑回归”以找到给定训练数据的最佳逻辑回归模型 
  - 注意所得模型与数据拟合得很好。
- 注意,橙色线是’ 
        
         
          
          
            z 
           
          
         
           z 
          
         
       z’或 
        
         
          
          
            w 
           
          
            ⋅ 
           
           
           
             x 
            
            
            
              ( 
             
            
              i 
             
            
              ) 
             
            
           
          
            + 
           
          
            b 
           
          
         
           \mathbf{w} \cdot \mathbf{x}^{(i)} + b 
          
         
       w⋅x(i)+b。它与线性回归模型中的直线不匹配。
 通过应用“阈值”进一步改进这些结果。
 
- 勾选“切换0.5阈值”上的框,以显示如果应用阈值的预测。 
  - 这些预测看起来不错。预测与数据相符
- 现在,在大肿瘤大小范围内(接近10)添加进一步的数据点,并重新运行线性回归。
- 与线性回归模型不同,该模型持续做出正确的预测
 
plt.close('all') 
addpt = plt_one_addpt_onclick( x_train,y_train, w_in, b_in, logistic=True)
恭喜
你已经探索了s型函数在逻辑回归中的应用。



















