微信登录

逻辑回归 - 算法实现 - 逻辑回归的代码实现

逻辑回归 - 算法实现 - 逻辑回归的代码实现

一、引言

逻辑回归是一种广泛应用于分类问题的统计学习方法,尽管名字中带有“回归”,但它主要用于解决二分类问题,当然也可以扩展到多分类问题。在实际应用中,逻辑回归因其简单高效、易于解释等优点,被广泛应用于信用评估、疾病诊断、市场营销等众多领域。本文将详细介绍逻辑回归的原理,并给出其代码实现。

二、逻辑回归原理简述

2.1 线性回归与逻辑回归的联系

线性回归的模型可以表示为 $z = \theta_0 + \theta_1x_1 + \theta_2x_2 + \cdots + \theta_nx_n$,其中 $\theta$ 是模型的参数,$x$ 是输入特征。线性回归的输出是连续值,而逻辑回归要解决的是分类问题,需要将线性回归的输出映射到一个概率值(0 到 1 之间)。

2.2 sigmoid 函数

逻辑回归引入了 sigmoid 函数,其表达式为:$\sigma(z)=\frac{1}{1 + e^{-z}}$。sigmoid 函数的图像是一个 S 形曲线,它可以将任意实数输入映射到 (0, 1) 区间。当 $z$ 趋近于正无穷时,$\sigma(z)$ 趋近于 1;当 $z$ 趋近于负无穷时,$\sigma(z)$ 趋近于 0。逻辑回归模型可以表示为:$h_{\theta}(x)=\sigma(\theta^Tx)=\frac{1}{1 + e^{-\theta^Tx}}$,其中 $\theta^Tx$ 就是线性回归的输出。

2.3 损失函数

逻辑回归使用对数损失函数(也称为交叉熵损失函数),对于单个样本 $(x^{(i)}, y^{(i)})$,其损失函数为:

  • 当 $y^{(i)} = 1$ 时,$L(h{\theta}(x^{(i)}), y^{(i)}) = -\log(h{\theta}(x^{(i)}))$
  • 当 $y^{(i)} = 0$ 时,$L(h{\theta}(x^{(i)}), y^{(i)}) = -\log(1 - h{\theta}(x^{(i)}))$

综合起来,对于 $m$ 个样本的数据集,损失函数为:$J(\theta)=-\frac{1}{m}\sum{i = 1}^{m}[y^{(i)}\log(h{\theta}(x^{(i)}))+(1 - y^{(i)})\log(1 - h_{\theta}(x^{(i)}))]$

2.4 优化算法

为了找到使损失函数 $J(\theta)$ 最小的参数 $\theta$,常用的优化算法是梯度下降法。梯度下降法的更新公式为:$\theta_j:=\theta_j-\alpha\frac{\partial J(\theta)}{\partial \theta_j}$,其中 $\alpha$ 是学习率。

三、代码实现

3.1 Python 实现逻辑回归

  1. import numpy as np
  2. class LogisticRegression:
  3. def __init__(self, learning_rate=0.01, num_iterations=1000):
  4. self.learning_rate = learning_rate
  5. self.num_iterations = num_iterations
  6. self.weights = None
  7. self.bias = None
  8. def sigmoid(self, z):
  9. return 1 / (1 + np.exp(-z))
  10. def fit(self, X, y):
  11. num_samples, num_features = X.shape
  12. self.weights = np.zeros(num_features)
  13. self.bias = 0
  14. for _ in range(self.num_iterations):
  15. linear_model = np.dot(X, self.weights) + self.bias
  16. y_pred = self.sigmoid(linear_model)
  17. dw = (1 / num_samples) * np.dot(X.T, (y_pred - y))
  18. db = (1 / num_samples) * np.sum(y_pred - y)
  19. self.weights -= self.learning_rate * dw
  20. self.bias -= self.learning_rate * db
  21. def predict(self, X):
  22. linear_model = np.dot(X, self.weights) + self.bias
  23. y_pred = self.sigmoid(linear_model)
  24. y_pred_cls = [1 if i > 0.5 else 0 for i in y_pred]
  25. return np.array(y_pred_cls)

3.2 使用示例

  1. # 生成一些示例数据
  2. from sklearn.datasets import make_classification
  3. from sklearn.model_selection import train_test_split
  4. from sklearn.metrics import accuracy_score
  5. X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=0, random_state=42)
  6. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  7. # 创建逻辑回归模型实例
  8. model = LogisticRegression(learning_rate=0.01, num_iterations=1000)
  9. # 训练模型
  10. model.fit(X_train, y_train)
  11. # 进行预测
  12. y_pred = model.predict(X_test)
  13. # 计算准确率
  14. accuracy = accuracy_score(y_test, y_pred)
  15. print(f"Accuracy: {accuracy}")

四、代码解释

4.1 类的初始化

__init__ 方法中,我们初始化了学习率 learning_rate 和迭代次数 num_iterations,并将权重 weights 和偏置 bias 初始化为 None

4.2 sigmoid 函数

sigmoid 方法实现了 sigmoid 函数,用于将线性回归的输出映射到概率值。

4.3 训练过程

fit 方法实现了模型的训练过程。首先,我们初始化权重和偏置。然后,在指定的迭代次数内,计算线性模型的输出,通过 sigmoid 函数得到预测概率,计算损失函数的梯度,并更新权重和偏置。

4.4 预测过程

predict 方法实现了模型的预测过程。根据训练得到的权重和偏置,计算线性模型的输出,通过 sigmoid 函数得到预测概率,将概率大于 0.5 的样本预测为 1,否则预测为 0。

五、总结

要点 详情
原理 逻辑回归通过 sigmoid 函数将线性回归的输出映射到概率值,使用对数损失函数和梯度下降法进行优化。
代码实现 使用 Python 实现了一个简单的逻辑回归类,包括初始化、sigmoid 函数、训练和预测方法。
优点 简单高效、易于解释,适用于二分类问题。
局限性 对于复杂的非线性问题,逻辑回归的表现可能不佳。

逻辑回归是一种基础且实用的分类算法,通过本文的介绍和代码实现,你可以更好地理解逻辑回归的原理,并在实际问题中应用它。在实际应用中,还可以使用更高级的优化算法和正则化方法来提高模型的性能。

逻辑回归 - 算法实现 - 逻辑回归的代码实现