赞
踩
逻辑回归(Logistic Regression)是一种广泛应用于分类问题的统计方法,特别是在二分类问题中。逻辑回归虽然名字中带有“回归”二字,但实际上是解决分类问题的一个线性模型。比如某用户购买某商品的可能性,某病人患有某种疾病的可能性,以及某广告被用户点击的可能性等。 注意,这里用的是“可能性”,而非数学上的“概率”,logisitc回归的结果并非数学定义中的概率值,不可以直接当做概率值来用。该结果往往用于和其他特征值加权求和,而非直接相乘。
线性模型一般形式: f ( x )= w1x1+w2x2+...+wdxd + b,其中x=(x1, x2, ..., xd)是由d维属性描述的样本,其中 xi 是 x 在第 i 个属性上的取值。 向量形式可记为: f ( x )= wT x + b 其中w=(w1, w2, ..., wd)为待求解系数。如下图所示
Logistic 回归主要用于分类问题,我们以二分类为例,对于所给数据集假设存在这样的一条直线可以将数据完成线性可分。
多维数据也是按照以上的步骤。
线性回归模型:f(x)=wx+b,取合适的w,b值,使得预测值逼近真实标记 y。
线性回归模型: y=f(x)=wx+b 可推广至: y=g(f(x))=g(wx+b) 其中g为单调可微函数。
例如设g(x)=ex,取y的对数,即lny,就可以得到对数线性回归模型,如下:
Logistic回归:分类问题
梯度的方向,表示图形增长最快的方向。正如上图所示,每一点的切线方向,就是函数值变化最快的方向。
为什么要使用Sigmoid函数,而不是直接判定模型值是否大于零?
方便计算损失值,衡量模型精准度。在进行分类任务中,数据集的标签是以0、1这样的数字来表示所属的分类(这里以二分类作为例子),如果我们不使用Sigmoid函数,模型输出值就会超过0-1之间范围。
在线性回归中,我们使用差平方和作为代价函数,公式为:
,有的没有前面的1/2n,也没关系,这对于我们的结果没有什么影响,只是为了后面公式推导更加方便一些。分类如下所示
以上详见参考自Logistic 回归分类算法原理分析和实战-CSDN博客
具体详见参数估计(二).最大似然估计 - 知乎 (zhihu.com)
- import numpy as np
- import matplotlib.pyplot as plt
- from sklearn.datasets import load_iris
-
- # 加载数据集
- iris = load_iris()
-
- # Sigmoid函数
- def sigmoid(z):
- return 1 / (1 + np.exp(-z))
-
- # 损失函数(对数似然函数)
- def compute_loss(X, y, weights):
- z = np.dot(X, weights)
- predict_1 = y * np.log(sigmoid(z))
- predict_0 = (1 - y) * np.log(1 - sigmoid(z))
- return -sum(predict_1 + predict_0) / len(X)
-
- # 梯度上升算法
- def gradient_ascent(X, y, learning_rate, iterations):
- X = np.insert(X, 0, 1, axis=1) # 插入偏置项
- weights = np.zeros(X.shape[1])
-
- for _ in range(iterations):
- z = np.dot(X, weights)
- gradient = np.dot(X.T, y - sigmoid(z))
- weights += learning_rate * gradient / len(y)
-
- if _ % 1000 == 0: # 每1000次迭代输出一次损失值
- loss = compute_loss(X, y, weights)
- print(f'Loss: {loss}')
-
- return weights
-
- # 决策边界绘制
- def plot_decision_boundary(X, y, weights):
- x1_min, x1_max = X[:, 0].min()-1, X[:, 0].max()+1
- x2_min, x2_max = X[:, 1].min()-1, X[:, 1].max()+1
- xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))
- grid = np.c_[xx1.ravel(), xx2.ravel()]
- probs = sigmoid(np.dot(np.insert(grid, 0, 1, axis=1), weights)).reshape(xx1.shape)
- plt.contour(xx1, xx2, probs, [0.5], linewidths=1, colors='blue')
- plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral)
- plt.show()
-
- # 假设我们只使用前两个特征
- X = iris.data[:, :2]
- y = (iris.target != 0) * 1 # 二分类问题,将类别转换为0和1
-
- # 训练模型
- learning_rate = 0.1
- iterations = 10000 # 迭代次数
- weights = gradient_ascent(X, y, learning_rate, iterations)
-
- # 绘制决策边界
- plot_decision_boundary(X, y, weights)
下面是代码分析和结果说明:
导入库:
numpy
用于数值计算。matplotlib.pyplot
用于绘图。sklearn.datasets
中的 load_iris
用于加载鸢尾花数据集。加载数据集:
load_iris()
函数加载鸢尾花数据集,该数据集包含150个样本,每个样本有4个特征。定义Sigmoid函数:
sigmoid(z)
是逻辑回归中使用的激活函数,将任意实数映射到(0,1)区间,用于表示概率。定义损失函数:
compute_loss(X, y, weights)
计算当前权重下的对数似然损失。实现梯度上升算法:
gradient_ascent(X, y, learning_rate, iterations)
使用梯度上升更新权重。这里的目标是最大化对数似然函数,与梯度下降(最小化损失函数)相反。训练模型:
gradient_ascent
函数来训练模型。绘制决策边界:
plot_decision_boundary(X, y, weights)
函数创建一个网格来覆盖所有的数据点,并使用训练好的权重来计算网格上每个点的预测概率。plt.contour
绘制决策边界,即概率为0.5的等高线。plt.scatter
绘制数据点,颜色表示类别。结果:
结果说明:
本次实验基本实现了Logistic回归的基本步骤,实现了以下的进程去划分,在二维空间中清晰地展示了模型如何区分不同的类别。
Sigmoid函数:这是逻辑回归中的核心部分,它将线性函数的输出转换为概率。
损失函数:定义了模型预测与真实值之间的差距,我们的目标是通过优化算法最小化(在这个例子中是最大化对数似然)损失函数。
梯度上升算法:这是一种优化算法,用于更新模型的权重以最大化损失函数。
决策边界:在二维空间中清晰地展示了模型如何区分不同的类别。
这是本次实验所学习得到的收获。但是我本次实际使用时可能需要对模型进行交叉验证和超参数调优(比如学习率和迭代次数)以获得更好的性能。此外,由于我们只使用了两个特征,模型的性能可能不如使用所有四个特征的完整逻辑回归模型。也可以使用交叉验证来评估模型的性能,并通过调整学习率、迭代次数等超参数来优化模型。这些都是可以改进优化的地方。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。