一、逻辑回归概述

        逻辑回归虽然名称中有"回归"二字,但实际上是一种广泛使用的分类算法,特别适合处理二分类问题。它的核心思想是通过线性回归的组合加上Sigmoid函数,将输出映射到(0,1)区间,表示属于某一类的概率。

为什么需要逻辑回归

        线性回归虽然可以预测连续值,但在处理分类问题时存在明显不足:

输出范围不受限制,可能超出[0,1]区间

对异常值敏感

无法直接给出概率解释

逻辑回归通过引入Sigmoid函数,完美解决了这些问题,成为分类任务的基础算法。

二、核心数学原理

1. Sigmoid函数

逻辑回归的核心是Sigmoid函数,数学表达式为:

这个函数将任何实数映射到(0,1)区间,完美地表示了概率的概念。

2. 决策边界

当Sigmoid函数的输出大于等于0.5时,我们预测为正类;小于0.5时预测为负类。对应的决策边界是:

3 函数特性分析

  1. 值域:输出范围在(0,1)之间,可以解释为概率

  2. 单调性:严格单调递增函数

  3. 导数特性:σ′(z)=σ(z)(1−σ(z))

  4. 对称性:1−σ(z)=σ(−z)

三、模型参数估计

3.1 极大似然估计

逻辑回归通常采用极大似然估计法来求解参数。对于二分类问题,似然函数可以表示为:

为方便计算,我们通常取对数得到对数似然函数:

3.2 损失函数

将最大化对数似然转化为最小化问题,得到交叉熵损失函数:

这就是我们在代码中实现的成本函数。

3.3 梯度下降算法

为了最小化损失函数,我们使用梯度下降法。损失函数对参数θj​的偏导数为:

因此,参数更新规则为:

其中α是学习率,这就是代码中梯度下降的实现基础。

四、算法优缺点分析

4.1 优点

  1. 实现简单,计算效率高

  2. 输出具有概率意义

  3. 可以方便地使用L1/L2正则化

  4. 对线性决策边界效果很好

4.2 缺点

  1. 难以捕捉非线性关系(可以通过特征工程解决)

  2. 对多重共线性敏感

  3. 当特征空间很大时,性能可能会下降

五、Python实现详解

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import os

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

def 加载数据(文件路径):
    """从指定路径加载数据"""
    if not os.path.exists(文件路径):
        raise FileNotFoundError(f"文件未找到: {文件路径}")
    数据 = np.loadtxt(文件路径)
    X = 数据[:, :2]  # 前两列是特征
    y = 数据[:, 2]   # 最后一列是标签
    return X, y

def sigmoid函数(z):
    """Sigmoid函数"""
    return 1 / (1 + np.exp(-z))

def 绘制sigmoid曲线():
    """绘制Sigmoid函数图像"""
    plt.figure(figsize=(10, 6))
    x = np.linspace(-10, 10, 500)
    y = sigmoid函数(x)
    
    plt.plot(x, y, label='Sigmoid函数', color='blue', linewidth=2)
    plt.axhline(0.5, color='red', linestyle='--', label='决策阈值(0.5)')
    plt.axvline(0, color='green', linestyle=':', label='零值线')
    
    plt.title('Sigmoid函数曲线', fontsize=16)
    plt.xlabel('输入值 (z)', fontsize=12)
    plt.ylabel('输出值 σ(z)', fontsize=12)
    plt.legend()
    plt.grid(True, alpha=0.3)
    plt.show()

def 计算成本(X, y, theta):
    """计算逻辑回归的成本函数"""
    m = len(y)
    h = sigmoid函数(X.dot(theta))
    成本 = (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()
    return 成本

def 梯度下降(X, y, theta, 学习率, 迭代次数):
    """执行梯度下降优化theta参数"""
    m = len(y)
    成本历史 = []
    
    for _ in range(迭代次数):
        h = sigmoid函数(X.dot(theta))
        梯度 = X.T.dot(h - y) / m
        theta -= 学习率 * 梯度
        成本 = 计算成本(X, y, theta)
        成本历史.append(成本)
        
    return theta, 成本历史

def 预测(X, theta):
    """使用学习到的参数进行预测"""
    return sigmoid函数(X.dot(theta)) >= 0.5

def 添加截距项(X):
    """给X添加截距项"""
    截距 = np.ones((X.shape[0], 1))
    return np.concatenate((截距, X), axis=1)

def 绘制决策边界(X, y, theta):
    """绘制决策边界"""
    plt.figure(figsize=(10, 6))
    
    # 绘制数据点
    plt.scatter(X[y == 0][:, 1], X[y == 0][:, 2], 
                label='类别0', marker='o', color='blue', alpha=0.7)
    plt.scatter(X[y == 1][:, 1], X[y == 1][:, 2], 
                label='类别1', marker='x', color='red', alpha=0.7)
    
    # 绘制决策边界
    x值 = np.array([np.min(X[:, 1]), np.max(X[:, 1])])
    y值 = -(theta[0] + theta[1] * x值) / theta[2]
    plt.plot(x值, y值, label='决策边界', color='green', linewidth=2, linestyle='--')
    
    plt.xlabel('特征1', fontsize=12)
    plt.ylabel('特征2', fontsize=12)
    plt.title('逻辑回归决策边界', fontsize=16)
    plt.legend(fontsize=10)
    plt.grid(True, alpha=0.3)
    plt.show()

def 绘制成本历史(成本历史):
    """绘制成本函数随迭代次数的变化"""
    plt.figure(figsize=(10, 6))
    plt.plot(成本历史, color='purple', linewidth=2)
    plt.xlabel('迭代次数', fontsize=12)
    plt.ylabel('成本', fontsize=12)
    plt.title('成本函数变化曲线', fontsize=16)
    plt.grid(True, alpha=0.3)
    plt.show()

def 逻辑回归():
    # 指定完整的文件路径
    文件路径 = r"D:\python\aaajqxx\testSeta.txt"
    
    try:
        print("="*50)
        print("逻辑回归算法实现")
        print("="*50)
        
        # 1. 首先绘制Sigmoid函数
        print("\n正在绘制Sigmoid函数曲线...")
        绘制sigmoid曲线()
        
        # 2. 加载数据
        print("\n正在加载数据...")
        X, y = 加载数据(文件路径)
        
        # 3. 添加截距项
        X = 添加截距项(X)
        
        # 4. 初始化参数
        theta = np.zeros(X.shape[1])
        学习率 = 0.01
        迭代次数 = 1000
        
        # 5. 训练模型
        print("正在训练模型...")
        theta, 成本历史 = 梯度下降(X, y, theta, 学习率, 迭代次数)
        
        # 6. 输出结果
        print("\n训练完成!")
        print(f"学习到的参数: {theta}")
        print(f"训练准确率: {np.mean(预测(X, theta) == y) * 100:.2f}%")
        
        # 7. 绘制其他结果
        print("\n正在绘制决策边界...")
        绘制决策边界(X, y, theta)
        
        print("正在绘制成本变化曲线...")
        绘制成本历史(成本历史)
        
    except FileNotFoundError as e:
        print(f"\n错误: {e}")
        print("请检查文件路径是否正确,以及文件是否存在。")
        print(f"当前查找的路径是: {os.path.abspath(文件路径)}")
    except Exception as e:
        print(f"\n发生错误: {str(e)}")

if __name__ == "__main__":
    逻辑回归()

六、运行结果

 

 

七、总结

逻辑回归作为机器学习中最基础的分类算法之一,理解其数学原理和实现细节对学习更复杂的模型至关重要。从数学推导到Python实现,展示了逻辑回归的各个方面:

  1. Sigmoid函数的数学性质及其在分类中的作用

  2. 极大似然估计与交叉熵损失的推导

  3. 梯度下降算法的具体实现

  4. 各种改进和扩展方法

希望这篇详细的原理与实现解析能够帮助读者深入理解逻辑回归算法,并为学习更复杂的机器学习模型打下坚实基础。

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐