逻辑回归模型与支持向量机的联系和区别
逻辑回归模型和支持向量机(SVM)是两种常用的监督学习算法,都可以应用于二分类问题。它们有一些相似之处,但在模型原理、算法步骤和性能等方面也存在一些区别。
逻辑回归模型
逻辑回归是一种广义线性模型(GLM),用于建立变量之间的关系和预测一个二分类的概率。在逻辑回归中,我们使用sigmoid函数(或称为逻辑函数)来建立输入特征和输出的关系。
算法原理
逻辑回归模型的目标是通过最大似然估计来优化模型参数。给定一个训练集${(x^{(1)}, y^{(1)}), (x^{(2)}, y^{(2)}), …, (x^{(m)}, y^{(m)})}$,其中$x^{(i)}\in \mathbb{R}^{n}$是输入特征向量,$y^{(i)} \in {0, 1}$是对应的输出标签。对于给定的输入特征$x^{(i)}$,逻辑回归模型预测$y^{(i)}=1$的概率为:
$$
h_{\theta}(x^{(i)}) = \frac{1}{1 + e^{-\theta^{T}x^{(i)}}}
$$
逻辑回归模型的假设函数$H_\theta(X)$是一个以参数$\theta$为权重的线性函数,通过sigmoid函数将结果映射到0和1之间,表示概率值。为了最大化似然函数,我们使得对数似然函数最大化,通过梯度下降算法来更新和优化参数$\theta$。
公式推导
定义预测函数为:
$$
h_{\theta}(x) = g(\theta^{T}x)
$$
其中,$g(z) = \frac{1}{1+e^{-z}}$是sigmoid函数。对于给定的训练集,我们希望最大化似然函数。
似然函数:
$$
L(\theta) = \prod_{i=1}^{m} (h_{\theta}(x^{(i)}))^{y^{(i)}}(1 – h_{\theta}(x^{(i)}))^{1-y^{(i)}}
$$
对数似然函数:
$$
l(\theta) = \sum_{i=1}^{m} [y^{(i)}\log(h_{\theta}(x^{(i)})) + (1-y^{(i)})\log(1 – h_{\theta}(x^{(i)}))]
$$
使用梯度下降算法迭代更新参数$\theta$,使得$l(\theta)$最大化。
计算步骤
- 初始化参数$\theta$。
- 计算预测值$h_{\theta}(x)$。
- 计算损失函数$J(\theta)$,如交叉熵损失函数。
- 使用梯度下降算法更新$\theta$,使得$J(\theta)$最小化。
- 重复步骤2-4,直到收敛或达到最大迭代次数。
Python代码示例
下面以一个虚拟数据集为例,演示逻辑回归模型的实现过程。
import numpy as np
import matplotlib.pyplot as plt
# 构造虚拟数据集
np.random.seed(0)
m = 100
X = np.random.randn(m, 2)
y = np.random.randint(0, 2, size=m)
# 定义逻辑回归模型类
class LogisticRegression:
def __init__(self, n_features):
self.n_features = n_features
self.theta = np.zeros((n_features, 1))
def sigmoid(self, z):
return 1 / (1 + np.exp(-z))
def train(self, X, y, learning_rate=0.01, num_iterations=1000):
m = X.shape[0]
X = np.hstack((np.ones((m, 1)), X))
y = y.reshape((m, 1))
for i in range(num_iterations):
z = np.dot(X, self.theta)
h = self.sigmoid(z)
error = h - y
gradient = np.dot(X.T, error) / m
self.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
def predict(self, X):
m = X.shape[0]
X = np.hstack((np.ones((m, 1)), X))
y_pred = self.sigmoid(np.dot(X, self.theta))
y_pred = (y_pred > 0.5).astype(int)
return y_pred.flatten()
# 创建模型并训练
model = LogisticRegression(n_features=2)
model.train(X, y)
# 预测结果
y_pred = model.predict(X)
# 绘制数据点和决策边界
plt.scatter(X[:, 0], X[:, 1], c=y)
x_boundary = np.linspace(-3, 3, 100)
y_boundary = -(model.theta[0] + model.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) / model.theta[2]
plt.plot(x_boundary, y_boundary, color='red')
plt.xlabel('X1')
plt.ylabel('X2')
plt.title('Logistic Regression')
plt.show()
代码解释:
首先,我们使用numpy
生成一个虚拟数据集X
和y
。然后定义了一个LogisticRegression
类,其中包括sigmoid
函数和train
方法。sigmoid
函数用于计算sigmoid值,train
方法用于训练模型。
在train
方法中,我们首先对数据进行预处理,添加一个全为1的偏置列,然后使用梯度下降算法更新参数$\theta$。具体地,我们计算预测值h
,计算误差error
,然后计算梯度gradient
,并更新参数$\theta$。
最后,我们创建一个LogisticRegression
对象model
,并调用train
方法进行训练。然后,使用predict
方法进行预测,并绘制数据点和决策边界。
支持向量机 (SVM)
支持向量机是一种二分类模型,通过寻找一个最优的超平面对样本进行划分。SVM的目标是找到一个能够最大化边界间隔的超平面。
算法原理
在SVM中,我们试图找到一个超平面,使得样本点到该超平面的距离最大化。这个距离被称为间隔。SVM基于间隔最大化来构建一个决策边界。
SVM模型学习的是一个线性分离器, 即找到一个尽可能将两类样本分开的超平面。如果两类样本不完全线性可分,则可以通过引入松弛变量和软间隔来允许一些样本点处于超平面的错误一侧或在间隔内部。
公式推导
给定一个训练集${(x^{(1)}, y^{(1)}), (x^{(2)}, y^{(2)}), …, (x^{(m)}, y^{(m)})}$,其中$x^{(i)}\in \mathbb{R}^{n}$是输入特征向量,$y^{(i)} \in {-1, 1}$是对应的输出标签。
对于给定的输入特征$x^{(i)}$,我们的目标是找到一个超平面,使得$w^Tx + b =0$。超平面的正负样本之间的函数间隔为:
$$
\hat{y}^{(i)}(w^Tx^{(i)} + b)
$$
其中,$\hat{y}^{(i)}$是真实类别标签。为了进一步得到合适的间隔,我们需要除以$||w||_2$,从而得到几何间隔。
我们的目标是最大化几何间隔,即:
$$
\max \frac{1}{||w||_2} \min_i (\hat{y}^{(i)}(w^Tx^{(i)} + b))
$$
相当于最大化$\frac{1}{2} ||w||_2^2$,并且约束$\hat{y}^{(i)}(w^Tx^{(i)} + b) \geq 1$。
计算步骤
- 初始化参数$w$和$b$。
- 将问题转化为凸二次优化问题,并使用拉格朗日乘子法求解。
- 使用SMO算法或其他优化算法迭代计算最优解。
- 根据最优解求得超平面的法向量$w$和截距$b$。
Python代码示例
下面以一个虚拟数据集为例,演示支持向量机的实现过程。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
# 构造虚拟数据集
np.random.seed(0)
m = 100
X = np.random.randn(m, 2)
y = np.random.randint(0, 2, size=m)
y = np.where(y==0, -1, 1)
# 创建支持向量机对象并训练
model = svm.SVC(kernel='linear')
model.fit(X, y)
# 预测结果
y_pred = model.predict(X)
# 绘制数据点和决策边界
plt.scatter(X[:, 0], X[:, 1], c=y)
w = model.coef_[0]
b = model.intercept_[0]
x_boundary = np.linspace(-3, 3, 100)
y_boundary = -(w[0] 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 + b) / w[1]
plt.plot(x_boundary, y_boundary, color='red')
plt.xlabel('X1')
plt.ylabel('X2')
plt.title('Support Vector Machine')
plt.show()
代码解释:
我们使用numpy
生成一个虚拟数据集X
和y
。然后,我们使用sklearn
库中的svm.SVC
类来创建一个支持向量机对象model
,设置kernel
为linear
(线性核函数)。
接下来,我们调用fit
方法对模型进行训练。然后,使用predict
方法进行预测,并绘制数据点和决策边界。
逻辑回归模型与支持向量机的区别和联系
逻辑回归模型和支持向量机(SVM)都是二分类模型,但在一些方面有所不同。
- 原理:逻辑回归模型基于最大似然估计来建立输入特征和输出标签之间的关系,使用sigmoid函数来模拟概率值。而SVM基于间隔最大化来构建一个决策边界超平面,寻找一个最优的超平面来将样本点分开。
- 概念:逻辑回归模型的输出是一个概率值,表示正例的概率。SVM不直接输出概率,而是根据决策函数的符号进行类别划分。
- 决策边界:逻辑回归模型将数据划分为两个类别的超平面是一个线性边界,而SVM可以使用不同的核函数,可以得到非线性边界。
- 对异常值的敏感性:逻辑回归对异常值敏感,因为它更关注减小损失函数,可能会偏向于较大权重。而SVM对异常值相对较不敏感,因为目标是最大化间隔,只有支持向量(离决策边界最近的样本点)对模型有影响。
综上所述,逻辑回归是一种概率模型,适用于线性可分或线性不可分的数据,计算简单且易于理解。SVM则是一种几何间隔最大化的模型,可用于线性可分和线性不可分的数据,且具有更好的鲁棒性和非线性分类能力。
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/821794/
转载文章受原作者版权保护。转载请注明原作者出处!