# ML-Andrew NG 学习笔记(3) Classification & Logistic Regression

By [jasonyang](https://paragraph.com/@jasonyang) · 2023-06-26

---

如前文提到的例子，对肿瘤大小进行分类，以此来预测是良性或是恶性，当数据比较集中时，使用线性回归也许会奏效，但当出现某些数据时，表现会变得很不好。

![当引入最右侧方框内的数据点后，拟合的直线及阈值受到的影响，误差都变得非常大](https://storage.googleapis.com/papyrus_images/6962cdeeb8189b4ea5b68639bd1c02bdd6e6e6b3f650668c0bcb17bded5a71bc.png)

当引入最右侧方框内的数据点后，拟合的直线及阈值受到的影响，误差都变得非常大

对于这种分类，不需求预测出本身大小的问题（如期望输出0或1这样的值），考虑采用**逻辑回归**（**Logistic Regression**）

![现在很好地拟合了数据集](https://storage.googleapis.com/papyrus_images/c1131693c6d93dc4b407e52818881e6900d1e2c6c80232c19b9242f2f8c34660.png)

现在很好地拟合了数据集

在逻辑回归中，有如下几种常用的处理方法：

*   **Sigmoid Function**：将实数映射到区间 (0,1) 上。在逻辑回归中，我们通常使用 Sigmoid 函数作为激活函数，将线性回归的结果转换为一个概率值，从而进行分类。
    
*   **Softmax Functon**: 将多个线性输出映射为一个概率分布。在多分类问题中，Softmax函数通常被用来将线性输出转化为概率分布，可以对每个类别进行概率预测。
    
*   **ReLU Function** (Rectified Linear Unit):在神经网络中广泛应用。ReLU函数在输入大于0时输出输入值本身，否则输出0。这种激活函数的好处是计算速度快且具有稀疏性，因此可以有效地减少过拟合现象。
    

Sigmoid Function：
-----------------

### a.定义

![和前文的曲线很像，但是sigmoid function是一种数学函数，而逻辑回归是一种算法](https://storage.googleapis.com/papyrus_images/89983faafb4346c265dd3358fc408335a67a2d56096903778272f32e2cbdb191.png)

和前文的曲线很像，但是sigmoid function是一种数学函数，而逻辑回归是一种算法

\*\*     表达式\*\*：

![](https://storage.googleapis.com/papyrus_images/850c9d468dbdf3be49f553e16aa3dc9268f3825eaffc1ddca99729afa5df6edb.png)

如何构建逻辑回归模型？ 这里拿线性回归的式子举例

![g(x)是指sigmoid function](https://storage.googleapis.com/papyrus_images/bad20c8c85d273d0f72f7b544e52980e2c1db292ba1e5c819beaa7bf42702baf.png)

g(x)是指sigmoid function

> 由于e作为底数，且其指数带有负号，同时整体处于分母，输入的z值处理后加上1，很容易使\*f(x)\*的值趋近于0或者1；又因为始终处于0~1之间，可以将其理解为**输出类为1的概率**
> 
> z=wx+b只是便于说明建立的一个函数，w和b参数不断进行调整，使得能更好预测

![一个推导：假如取0.5为阈值，最终可以得到 利用 w·x+b 是否大于0来判断输出为0或1](https://storage.googleapis.com/papyrus_images/d953aa844354fe6c26749f6f82bed64a704b49384ffa47a4cfd89c97350ebfbd.png)

一个推导：假如取0.5为阈值，最终可以得到 利用 w·x+b 是否大于0来判断输出为0或1

### b.决策边界（Decision boundary）

继续拿线性的 _z=w·x+b_ 举例，其对应的决策边界是当z=0的直线，即 w·x+b=0

> 不过线性并不存在决策边界，不过决策边界本身可以分线性与非线性

**举例1（线性）**：

![有着两个特征w_1, w_2](https://storage.googleapis.com/papyrus_images/c1ef879d780aded98b38ab38022cfefe907e7e6fa8fd6b38def4b373363c2263.png)

有着两个特征w\_1, w\_2

> 假设w\_1, w\_2, b分别为1，1，-3，则其对应的决策边界为 z=x\_1+x\_2-3=0,
> 
> 即x\_1 + x\_2 = 3

![例子1](https://storage.googleapis.com/papyrus_images/814e1732c21c4c9c29d1b02182dc88fd5c9e1491ec39d845f5e3662f1c8cfab3.png)

例子1

**举例2（非线性）：**

![当变量w_1和w_2并不呈现简单的线性关系时，可能如这个例子这样，需要用到多项式](https://storage.googleapis.com/papyrus_images/13c1963ea95b9dff4e2b22d51c05918e8617cc846527890651379181273a9733.png)

当变量w\_1和w\_2并不呈现简单的线性关系时，可能如这个例子这样，需要用到多项式

> 假设w\_1, w\_2, b分别为1，1，-1，则其对应的决策边界为 z=x\_1^2+x\_2^2-1=0,
> 
> 即x\_1^2+x\_2^2=1

![例子2](https://storage.googleapis.com/papyrus_images/4602a8ba11533ad351eeee11890f0e389846758a5c4974cdc9f193c38dd96c32.png)

例子2

### **c.逻辑回归的成本函数**

线性回归时的成本函数是这样的：

![1/2在外面](https://storage.googleapis.com/papyrus_images/1ea4d5375f2dd7da19a9b95a2d0c94e4fa6bc72bc68126cf3534cfd0c8606687.png)

1/2在外面

而对于逻辑回归

![1/2在里面](https://storage.googleapis.com/papyrus_images/bb540cc12e350c10b4b4534e287310e0aec33e294083f8633574d3ae1468393d.png)

1/2在里面

> 如果仍然使用1/2在外面的成本函数，梯度下降呈现的图像将会是：

![不好找到全局最优点](https://storage.googleapis.com/papyrus_images/1abc9915f065632566fa1cc74605a356046639cf3c7b6a1aa08c219d16ca5f72.png)

不好找到全局最优点

![线性回归时会生成标准的碗状，而逻辑回归不会](https://storage.googleapis.com/papyrus_images/9909cac662c194746034ea36b9762cf7d7daf0432325d24c0a48291246ae50e5.png)

线性回归时会生成标准的碗状，而逻辑回归不会

现在将求和符号内的部分称作 **单个训练样本的成本，用_L_表示**

![交叉熵或对数损失（the cross entropy or the log loss）](https://storage.googleapis.com/papyrus_images/fb45425aaae8c85cc592e57646cc8f4277b5551a8d9ea9cbb66b04710f7c5da5.png)

交叉熵或对数损失（the cross entropy or the log loss）

以上两种情况对应的图像如下，但我们输入的值始终位于0-1，因此只需考虑图像0-1之间的部分

![拆开看便是下图](https://storage.googleapis.com/papyrus_images/d340338b5bbe3ce88cff7b0ed3016e990ba2d3751179eca489eae0ab2a8fec78.png)

拆开看便是下图

![x轴是sigmoid的输出，非常严格地只能存在0或1](https://storage.googleapis.com/papyrus_images/ee9569fe03e0165d491465ee0c3ad58f8f07aa5f78aeb5c721a540771822ae11.png)

x轴是sigmoid的输出，非常严格地只能存在0或1

> 如果y = 1，真实标签的确为1。如果标签的预测值也为1，则成本= 0。但是当hθ(x)偏离1并接近0时，成本函数呈指数增长并趋于无穷大
> 
> 如果y = 0，则真实标签为0。如果标签的预测值也为0，则Cost = 0。但是当hθ(x)偏离0并接近1时，成本函数呈指数增长并趋于无穷大
> 
> 通过这样的处理，当预测正确时，成本为0；而预测错误，惩罚极大，这使得模型不断向最佳处逼近，因此总体的将会呈现凸函数的图像

有了这样的处理，loss function可以这样改写：

![y取值为0或1等号右边均只会存在一项，是前文L的整合](https://storage.googleapis.com/papyrus_images/9311af3c15ddace7d408d632a0246a60fbbc6f8ba4e4c0acd0d777aa565fbf55.png)

y取值为0或1等号右边均只会存在一项，是前文L的整合

现在我们就可以得到逻辑回归的成本函数了：

![](https://storage.googleapis.com/papyrus_images/bb553bda6c2f8e72a7a3a2a662eb7a01d1bf2c817cbffef65222bc1949157590.png)

代码实现：

    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
    

参考来源：

[https://www.geeksforgeeks.org/ml-cost-function-in-logistic-regression/](https://www.geeksforgeeks.org/ml-cost-function-in-logistic-regression/)

---

*Originally published on [jasonyang](https://paragraph.com/@jasonyang/ml-andrew-ng-3-classification-logistic-regression)*
