当前位置:   article > 正文

机器学习——logistic回归原理及简单实现_描述logistic回归模型的原理,并写出更新权重的算法。

描述logistic回归模型的原理,并写出更新权重的算法。

一,基本原理

逻辑回归(Logistic Regression)是一种广泛应用于分类问题的统计方法,特别是在二分类问题中。逻辑回归虽然名字中带有“回归”二字,但实际上是解决分类问题的一个线性模型。比如某用户购买某商品的可能性,某病人患有某种疾病的可能性,以及某广告被用户点击的可能性等。 注意,这里用的是“可能性”,而非数学上的“概率”,logisitc回归的结果并非数学定义中的概率值,不可以直接当做概率值来用。该结果往往用于和其他特征值加权求和,而非直接相乘。

1.1线性模型与回归

线性模型一般形式:  f ( x )= w1x1+w2x2+...+wdxd + b,其中x=(x1, x2, ..., xd)是由d维属性描述的样本,其中 xi 是 x 在第 i 个属性上的取值。 向量形式可记为:            f ( x )= wT x + b 其中w=(w1, w2, ..., wd)为待求解系数。如下图所示

1.2最小二乘与参数求解

1.2.1一维数据

Logistic 回归主要用于分类问题,我们以二分类为例,对于所给数据集假设存在这样的一条直线可以将数据完成线性可分。

1.2.2多维数据

多维数据也是按照以上的步骤。

1.3对数线性回归

线性回归模型: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回归:分类问题 

二,基于最优化方法的最佳回归系数确定

1、梯度下降法

梯度的方向,表示图形增长最快的方向。正如上图所示,每一点的切线方向,就是函数值变化最快的方向。

2、Sigmoid函数

为什么要使用Sigmoid函数,而不是直接判定模型值是否大于零?

方便计算损失值,衡量模型精准度。在进行分类任务中,数据集的标签是以0、1这样的数字来表示所属的分类(这里以二分类作为例子),如果我们不使用Sigmoid函数,模型输出值就会超过0-1之间范围。

3、代价函数

在线性回归中,我们使用差平方和作为代价函数,公式为:
在这里插入图片描述
,有的没有前面的1/2n,也没关系,这对于我们的结果没有什么影响,只是为了后面公式推导更加方便一些。分类如下所示

以上详见参考自Logistic 回归分类算法原理分析和实战-CSDN博客

4.极大似然估计 Recap

具体详见参数估计(二).最大似然估计 - 知乎 (zhihu.com)

三,示例

3.1具体代码实现

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from sklearn.datasets import load_iris
  4. # 加载数据集
  5. iris = load_iris()
  6. # Sigmoid函数
  7. def sigmoid(z):
  8. return 1 / (1 + np.exp(-z))
  9. # 损失函数(对数似然函数)
  10. def compute_loss(X, y, weights):
  11. z = np.dot(X, weights)
  12. predict_1 = y * np.log(sigmoid(z))
  13. predict_0 = (1 - y) * np.log(1 - sigmoid(z))
  14. return -sum(predict_1 + predict_0) / len(X)
  15. # 梯度上升算法
  16. def gradient_ascent(X, y, learning_rate, iterations):
  17. X = np.insert(X, 0, 1, axis=1) # 插入偏置项
  18. weights = np.zeros(X.shape[1])
  19. for _ in range(iterations):
  20. z = np.dot(X, weights)
  21. gradient = np.dot(X.T, y - sigmoid(z))
  22. weights += learning_rate * gradient / len(y)
  23. if _ % 1000 == 0: # 每1000次迭代输出一次损失值
  24. loss = compute_loss(X, y, weights)
  25. print(f'Loss: {loss}')
  26. return weights
  27. # 决策边界绘制
  28. def plot_decision_boundary(X, y, weights):
  29. x1_min, x1_max = X[:, 0].min()-1, X[:, 0].max()+1
  30. x2_min, x2_max = X[:, 1].min()-1, X[:, 1].max()+1
  31. xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))
  32. grid = np.c_[xx1.ravel(), xx2.ravel()]
  33. probs = sigmoid(np.dot(np.insert(grid, 0, 1, axis=1), weights)).reshape(xx1.shape)
  34. plt.contour(xx1, xx2, probs, [0.5], linewidths=1, colors='blue')
  35. plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral)
  36. plt.show()
  37. # 假设我们只使用前两个特征
  38. X = iris.data[:, :2]
  39. y = (iris.target != 0) * 1 # 二分类问题,将类别转换为0和1
  40. # 训练模型
  41. learning_rate = 0.1
  42. iterations = 10000 # 迭代次数
  43. weights = gradient_ascent(X, y, learning_rate, iterations)
  44. # 绘制决策边界
  45. plot_decision_boundary(X, y, weights)

3.2代码说明

下面是代码分析和结果说明:

  1. 导入库:

    • numpy 用于数值计算。
    • matplotlib.pyplot 用于绘图。
    • sklearn.datasets 中的 load_iris 用于加载鸢尾花数据集。
  2. 加载数据集:

    • 使用 load_iris() 函数加载鸢尾花数据集,该数据集包含150个样本,每个样本有4个特征。
  3. 定义Sigmoid函数:

    • sigmoid(z) 是逻辑回归中使用的激活函数,将任意实数映射到(0,1)区间,用于表示概率。
  4. 定义损失函数:

    • compute_loss(X, y, weights) 计算当前权重下的对数似然损失。
  5. 实现梯度上升算法:

    • gradient_ascent(X, y, learning_rate, iterations) 使用梯度上升更新权重。这里的目标是最大化对数似然函数,与梯度下降(最小化损失函数)相反。
  6. 训练模型:

    • 使用前两个特征(为了能在二维平面上绘制决策边界),并将目标变量转换为二分类问题。
    • 设置学习率为0.1,迭代次数为10000次。
    • 调用 gradient_ascent 函数来训练模型。
  7. 绘制决策边界:

    • plot_decision_boundary(X, y, weights) 函数创建一个网格来覆盖所有的数据点,并使用训练好的权重来计算网格上每个点的预测概率。
    • 使用 plt.contour 绘制决策边界,即概率为0.5的等高线。
    • 使用 plt.scatter 绘制数据点,颜色表示类别。

3.3结果展示

结果:

结果说明:

  • 这段代码训练了一个逻辑回归模型来区分鸢尾花数据集中的两类花(由于我们将目标变量转换为二分类问题)。
  • 通过梯度上升,模型的权重被优化以最大化训练数据的对数似然。
  • 绘制的决策边界显示了模型如何在二维空间中分割不同的类别。理想情况下,这条线应该清晰地分隔开两种颜色的点,表示模型良好地学习了如何区分两个类别。

四,总结:

本次实验基本实现了Logistic回归的基本步骤,实现了以下的进程去划分,在二维空间中清晰地展示了模型如何区分不同的类别。

  1. Sigmoid函数:这是逻辑回归中的核心部分,它将线性函数的输出转换为概率。

  2. 损失函数:定义了模型预测与真实值之间的差距,我们的目标是通过优化算法最小化(在这个例子中是最大化对数似然)损失函数。

  3. 梯度上升算法:这是一种优化算法,用于更新模型的权重以最大化损失函数。

  4. 决策边界:在二维空间中清晰地展示了模型如何区分不同的类别。

这是本次实验所学习得到的收获。但是我本次实际使用时可能需要对模型进行交叉验证和超参数调优(比如学习率和迭代次数)以获得更好的性能。此外,由于我们只使用了两个特征,模型的性能可能不如使用所有四个特征的完整逻辑回归模型也可以使用交叉验证来评估模型的性能,并通过调整学习率、迭代次数等超参数来优化模型。这些都是可以改进优化的地方。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/541126
推荐阅读
相关标签
  

闽ICP备14008679号