在Logistic回归中,sigmoid函数被用来将线性模型的输出转换为一个概率值,使其落在0到1的范围内

问题背景

在机器学习中,Logistic回归是一种常用的分类算法。它通过将线性模型的输出转换为一个概率值,从而将数据分为不同的类别。在Logistic回归中,sigmoid函数被用来实现这种转换,使得模型的输出概率落在0到1的范围内。

详细介绍

Logistic回归是一种监督学习算法,适用于二分类问题。它的基本原理是通过拟合一个线性模型,将输入特征与输出类别之间的关系建模。然后通过sigmoid函数将线性模型的输出转换为一个概率值。

算法原理

Logistic回归模型的输出可以表示为:

$$z = w_0 + w_1x_1 + w_2x_2 + … + w_nx_n$$

其中,$z$表示线性模型的输出,$w_0, w_1, …, w_n$是模型的参数,$x_1, x_2, …, x_n$是输入的特征。

为了将线性模型的输出转换为一个概率值,Logistic回归使用了sigmoid函数,其公式为:

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

sigmoid函数将任意实数映射到0到1的区间,具有以下特点:
– 当$z$接近正无穷大时,$h(z)$趋近于1
– 当$z$接近负无穷大时,$h(z)$趋近于0
– 当$z$等于0时,$h(z)$等于0.5

根据sigmoid函数的特点,我们可以将Logistic回归的输出解释为条件概率。例如,对于二分类问题,$h(z)$表示预测为正类的概率。

公式推导

为了推导Logistic回归的参数估计方法,我们使用极大似然估计。假设训练集包含$m$个样本,每个样本的特征表示为$x^{(i)}$,对应的类别表示为$y^{(i)}$,其中$i=1,2,…,m$。我们的目标是找到最优的参数$w$,使得模型的预测结果与实际类别尽可能接近。

为了实现这个目标,我们首先需要定义似然函数。假设样本的类别是独立同分布的,并且服从伯努利分布,我们可以定义似然函数为:

$$L(w) = \prod_{i=1}^m (h(w^Tx^{(i)}))^{y^{(i)}} (1-h(w^Tx^{(i)}))^{1-y^{(i)}}$$

我们的目标是最大化似然函数,等价于最小化对数似然函数:

$$l(w) = \sum_{i=1}^m y^{(i)} log(h(w^Tx^{(i)})) + (1-y^{(i)})log(1-h(w^Tx^{(i)}))$$

为了寻找最优参数,我们需要求解对数似然函数的最优化问题。常用的方法是梯度下降法。梯度下降法通过迭代更新参数,使得每次迭代的损失函数逐渐减小。

计算步骤

  1. 初始化参数$w$为0或随机值
  2. 按照以下步骤迭代更新参数:
  3. 计算预测结果:$h(x) = \frac{1}{1 + e^{-w^Tx}}$
  4. 计算梯度:$grad = \frac{1}{m} X^T(h(x)-y)$
  5. 更新参数:$w = w – \alpha \cdot grad$($\alpha$为学习率)
  6. 重复步骤2,直到达到停止条件(例如达到最大迭代次数或损失函数收敛)

复杂Python代码示例

下面是一个使用Python实现Logistic回归算法的示例代码,使用了sklearn库提供的鸢尾花数据集进行训练和预测。

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

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

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

 def fit(self, X, y):
 # 数据预处理
 scaler = StandardScaler()
 X = scaler.fit_transform(X)
 X = np.hstack((np.ones((X.shape[0], 1)), X)) # 添加偏置项
 self.theta = np.zeros(X.shape[1])

 for _ in range(self.num_iterations):
 z = np.dot(X, self.theta)
 h = self.sigmoid(z)
 gradient = np.dot(X.T, (h - y)) / y.size
 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 predict_proba(self, X):
 X = (X - self.scaler.mean_) / self.scaler.scale_ # 数据预处理
 X = np.hstack((np.ones((X.shape[0], 1)), X)) # 添加偏置项
 return self.sigmoid(np.dot(X, self.theta))

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

# 载入数据集
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)

# 训练模型
model = LogisticRegression()
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)
y_pred_proba = model.predict_proba(X_test)

# 输出预测结果
print("预测类别:", y_pred)
print("预测概率:", y_pred_proba)

代码细节解释

  • LogisticRegression类是一个自定义的Logistic回归模型。
  • fit函数中,我们首先对特征进行标准化处理,然后为特征矩阵添加了一列全为1的列向量,用于表示偏置项的影响。
  • sigmoid函数用于将线性模型的输出转换为概率值。
  • 在训练过程中,我们使用梯度下降法更新参数。梯度的计算使用了矩阵乘法和矩阵转置。
  • predict_proba函数用于预测样本属于正类的概率。
  • predict函数用于预测样本的类别,通过设置阈值来进行二分类。
  • 使用sklearn库提供的鸢尾花数据集进行训练和预测。

通过运行这段代码,我们可以得到Logistic回归模型的预测结果,并输出预测类别和概率。

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

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

(0)

大家都在看

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