Logistic回归在实践中应用广泛,特别适用于大规模数据集和高维特征空间,因为它计算简单且具有较好的解释性

介绍

Logistic回归是一种广泛应用于机器学习和统计学领域的分类算法。它特别适用于处理大规模数据集和高维特征空间。Logistic回归的主要优点是计算简单、具有较好的解释性,并且可以处理二分类和多分类问题。在本文中,我们将详细介绍Logistic回归的算法原理、公式推导、计算步骤和Python代码示例。

算法原理

Logistic回归是一种基于回归分析的统计分类模型。它是通过在线性回归模型的基础上引入逻辑函数(或称为sigmoid函数)来进行分类。逻辑函数的输出范围是[0, 1],可以将线性回归的输出转换为概率值。对于二分类问题,通常使用逻辑函数的阈值来划分样本的类别。

公式推导

假设我们有一个包含n个样本的数据集,每个样本有m个特征。我们用X表示输入特征矩阵,其中每一行表示一个样本,每一列表示一个特征。我们用y表示目标变量,它是一个n维的列向量,每个元素表示对应样本的类别。

我们假设目标概率是线性的,即:

$$h(x) = \theta_0 + \theta_1x_1 + \theta_2x_2 + … + \theta_mx_m$$

其中,$h(x)$表示样本$x$的预测概率,$(x_1, x_2, …, x_m)$表示输入样本的特征向量,$(\theta_0, \theta_1, …, \theta_m)$表示模型的系数向量。

为了将预测概率转换为类别,我们引入逻辑函数,也称为sigmoid函数:

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

其中,$z$表示输入的线性组合:

$$z = \theta_0 + \theta_1x_1 + \theta_2x_2 + … + \theta_mx_m$$

逻辑函数将$z$映射到[0, 1]的范围内,作为样本属于正类的概率。
为了得到最佳的模型参数,我们使用最大似然估计方法来拟合参数。具体来说,我们希望最大化给定数据集上的似然函数:

$$L(\theta) = \prod_{i=1}^{n} (h(x^{(i)}))^{y^{(i)}} (1 – h(x^{(i)}))^{1 – y^{(i)}}$$

其中,$(x^{(i)}, y^{(i)})$表示第i个样本和对应的类别。

为了简化计算,通常使用对数似然函数:

$$l(\theta) = \sum_{i=1}^{n} y^{(i)}\log(h(x^{(i)})) + (1 – y^{(i)})\log(1 – h(x^{(i)}))$$

我们的目标是最大化对数似然函数$l(\theta)$,可以使用梯度上升算法来寻找最优参数。通过计算对数似然函数的偏导数,我们可以得到梯度上升的更新规则:

$$\theta_j := \theta_j + \alpha \frac{\partial}{\partial \theta_j} l(\theta)$$

其中,$\alpha$是学习率。

计算步骤

根据上述推导,Logistic回归的计算步骤如下:

  1. 初始化模型参数$\theta$为0或随机值。
  2. 计算预测概率$h(x)$,其中$x$为输入样本特征。
  3. 根据$h(x)$计算对数似然函数$l(\theta)$。
  4. 计算对数似然函数的偏导数,得到模型参数的梯度。
  5. 使用梯度上升算法更新模型参数:$\theta_j := \theta_j + \alpha \frac{\partial}{\partial \theta_j} l(\theta)$。
  6. 重复步骤2-5,直到满足收敛条件或达到最大迭代次数。

Python代码示例

下面是一个使用Logistic回归算法来进行二分类的Python代码示例。我们以鸢尾花数据集为例,该数据集包含150个样本和4个特征。

首先,我们需要导入必要的库和数据集:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris

iris = load_iris()
X = iris["data"][:100, :2] # 只选取前100个样本的前两个特征
y = iris["target"][:100]

然后,我们定义一个Logistic回归类,其中包含模型参数的初始化、预测概率计算和梯度上升更新等方法:

class LogisticRegression:
 def __init__(self, learning_rate=0.01, num_iterations=1000):
 self.learning_rate = learning_rate
 self.num_iterations = num_iterations
 self.theta = None

 def initialize_parameters(self, num_features):
 self.theta = np.zeros(num_features + 1)

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

 def predict_probabilities(self, X):
 X = np.insert(X, 0, 1, axis=1)
 z = np.dot(X, self.theta)
 return self.sigmoid(z)

 def compute_gradient(self, X, y):
 m = len(y)
 X = np.insert(X, 0, 1, axis=1)
 h = self.predict_probabilities(X)

 gradient = np.dot(X.T, h - y) / m
 return gradient

 def update_parameters(self, gradient):
 self.theta -= self.learning_rate artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls gradient

 def fit(self, X, y):
 self.initialize_parameters(X.shape[1])

 for i in range(self.num_iterations):
 gradient = self.compute_gradient(X, y)
 self.update_parameters(gradient)

 def predict(self, X, threshold=0.5):
 probabilities = self.predict_probabilities(X)
 return (probabilities >= threshold).astype(int)

最后,我们可以使用Logistic回归类来拟合数据并进行预测:

model = LogisticRegression()
model.fit(X, y)

x1_min, x1_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
x2_min, x2_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max, 100),
 np.linspace(x2_min, x2_max, 100))
X_grid = np.c_[xx1.ravel(), xx2.ravel()]
y_pred = model.predict(X_grid).reshape(xx1.shape)

plt.figure()
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
plt.contourf(xx1, xx2, y_pred, alpha=0.8, cmap=plt.cm.Paired)
plt.xlabel("Sepal Length")
plt.ylabel("Sepal Width")
plt.title("Logistic Regression")
plt.show()

在上述代码中,我们首先绘制了前100个样本的散点图,并使用等高线图表示模型的决策边界。

代码细节解释

在Logistic回归类中,initialize_parameters方法用于初始化模型参数。我们使用np.zeros函数创建一个大小为(num_features + 1)的零向量,其中num_features表示特征的数量。我们之所以需要添加1,是因为我们在计算预测概率时需要添加一个截距项。

sigmoid方法用于计算逻辑函数的输出。我们使用np.exp函数计算指数,然后将其除以1加上指数以得到逻辑函数的输出。

predict_probabilities方法用于计算给定输入特征的预测概率。我们首先在特征矩阵的第一列插入一个全为1的列向量,以便与截距项相乘。然后,我们使用np.dot函数计算线性组合,并将其传递给逻辑函数。

compute_gradient方法用于计算对数似然函数的偏导数。我们首先在特征矩阵的第一列插入一个全为1的列向量,然后计算预测概率。与线性回归不同,我们使用预测概率减去真实标签,而不是直接使用误差。最后,我们使用np.dot函数计算特征矩阵的转置与误差的乘积的平均值。

update_parameters方法用于使用梯度上升算法更新模型参数。我们使用学习率乘以梯度,并将其减去当前参数向量。

fit方法用于拟合模型。我们首先使用initialize_parameters方法初始化模型参数。然后,我们开始迭代,每次迭代计算梯度并更新参数。

predict方法用于预测新样本的类别。我们首先计算预测概率,然后使用给定的阈值将概率转换为类别。

在代码的最后部分,我们定义了一个model对象,并用鸢尾花数据集拟合这个模型。然后,我们创建一些网格点,并使用model.predict方法预测这些网格点的类别。最后,我们将样本和决策边界可视化。

总结:这个代码示例详细介绍了Logistic回归算法的原理、公式推导、计算步骤和Python代码实现。通过使用鸢尾花数据集,我们展示了如何使用Logistic回归来进行二分类,并将结果可视化。

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/824191/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球