Logistic回归算法是一种用于分类任务的线性模型,它假设不同类别的数据可以用一个或多个线性决策边界来分割

介绍

Logistic回归算法是一种用于分类任务的线性模型,它假设不同类别的数据可以用一个或多个线性决策边界来分割这个问题。Logistic回归算法常用于二分类问题,它将数据输入到一个Sigmoid函数中,将线性模型的输出转换为概率值。根据概率值进行分类判断。

算法原理

Logistic回归通过使用一种称为逻辑函数(Logistic函数)的函数类型来建模二分类问题。逻辑函数是一个S型函数,将输入映射到0到1之间的连续的概率,表示样本属于正类的概率。

对于二分类问题,我们将样本的特征向量表示为x,标签或类别表示为y。Logistic回归模型通过在输入特征上应用线性模型,并将结果通过逻辑函数得到概率值来定义。

Logistic回归模型的输出可以用以下公式表示:
$$
h(x) = \frac{1}{1 + e^{-(\beta_0 + \beta_1 x_1 + … + \beta_n x_n)}}
$$

其中,h(x)表示预测值,β表示模型的权重参数,x表示特征向量。

公式推导

对于Logistic回归,我们希望获得一个条件概率模型:

$$
P(y=1|x; \theta) = h_{\theta}(x) = g(\theta^T x)
$$

其中,h是一个将输入x转换为[0,1]区间内输出的函数,通常使用Sigmoid函数。这里的θ是一个参数向量,它包含了模型的权重。

为了最大化给定训练集下观测的似然,通常使用最大似然估计来估计θ。定义似然函数:

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

我们的目标是最大化似然函数。通常,我们最大化的是似然函数的对数:

$$
l(\theta) = \log(L(\theta)) = \sum_{i=1}^{m} y^{(i)}\log(h_{\theta}(x^{(i)})) + (1 – y^{(i)})\log(1 – h_{\theta}(x^{(i)}))
$$

我们的目标是最大化对数似然函数。为了实现这一点,通常使用梯度上升算法来最大化对数似然函数。

计算步骤

  1. 初始化权重向量θ为零向量,以及学习率α和迭代次数。
  2. 在每次迭代中,计算h(x)和误差项:
  3. 计算预测值h(x):$$ h_{\theta}(x) = \frac{1}{1 + e^{(- \theta^T x)}} $$
  4. 计算误差项:$$ error = h_{\theta}(x) – y $$
  5. 更新权重向量θ:
  6. $$ \theta = \theta – \frac{\alpha}{m} X^T \cdot error $$
  7. 重复第2步和第3步,直到达到设定的迭代次数。

复杂Python代码示例

下面是一个使用Logistic回归算法解决二分类问题的Python代码示例:

import numpy as np
import matplotlib.pyplot as plt

# 生成虚拟数据集
np.random.seed(0)
num_samples = 100

# 类别0的数据
X0 = np.random.multivariate_normal(mean=[2, 2], cov=[[1, 0], [0, 1]], size=num_samples)
y0 = np.zeros(num_samples)

# 类别1的数据
X1 = np.random.multivariate_normal(mean=[-2, -2], cov=[[1, 0], [0, 1]], size=num_samples)
y1 = np.ones(num_samples)

# 合并数据集
X = np.concatenate((X0, X1))
y = np.concatenate((y0, y1))

# 添加偏置项
X = np.hstack((np.ones((X.shape[0], 1)), X))

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

# 初始化权重向量
theta = np.zeros(X.shape[1])

# 设置学习率和迭代次数
learning_rate = 0.1
iterations = 1000

# 使用梯度上升算法更新权重向量
for _ in range(iterations):
 # 计算预测值
 h = sigmoid(np.dot(X, theta))

 # 计算误差项
 error = h - y

 # 更新权重向量
 gradient = np.dot(X.T, error) / X.shape[0]
 theta -= 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

# 计算分类边界线
x_boundary = np.linspace(-6, 6, 100)
y_boundary = -(theta[0] + theta[1] 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 x_boundary) / theta[2]

# 绘制分类边界线和数据点
plt.figure(figsize=(10, 6))
plt.scatter(X0[:, 1], X0[:, 2], c='r', marker='o', label='Class 0')
plt.scatter(X1[:, 1], X1[:, 2], c='b', marker='o', label='Class 1')
plt.plot(x_boundary, y_boundary, 'g-', label='Decision Boundary')
plt.xlabel('x1')
plt.ylabel('x2')
plt.title('Logistic Regression')
plt.legend()
plt.show()

代码细节解释

  1. 首先,我们生成了一个虚拟数据集,其中包括两个类别的数据,每个类别100个样本。
  2. 然后,我们添加了一个偏置项到特征矩阵X中,以便计算中不需要额外的偏置参数。
  3. 接下来,我们定义了一个Sigmoid函数,用于将模型的输出转换为概率值。
  4. 初始化权重向量theta为零向量,设置学习率和迭代次数。
  5. 在每次迭代中,我们计算预测值h(x)和误差项error,然后使用梯度上升算法更新权重向量theta。
  6. 最后,我们计算分类边界线并绘制数据点和分类边界线的图形。

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

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

(0)

大家都在看

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