当前位置: 首页 > article >正文

机器学习:逻辑回归

逻辑回归通常用于解决分类问题。

“分类”是应用逻辑回归的目的和结果,但中间过程依旧是“回归”。通过逻辑回归模型得到连续值,加上一个“阈值”,就成了分类。

逻辑回归算法的拟合函数,叫做Sigmond函数(即形似S的函数。对率函数是Sigmoid的重要代表函数):
y = 1 1 + e − z y = \frac {1} {1 + e^{-z}} y=1+ez1
多元线性回归方程的一般形式如下:
y = β 0 + β 1 x 1 + . . . + β p x p y = \beta_{0} + \beta_{1}x_1 + ... + \beta_{p}x_p y=β0+β1x1+...+βpxp
其矩阵形式为:
Y ⃗ = X ⃗ β ⃗ \vec{Y} = \vec{X} \vec{\beta} Y =X β
其中:
Y ⃗ = [ y 1 y 2 . . . y n ] , X ⃗ = [ 1 x 11 . . . x 1 p . . . 1 x n 1 . . . x n p ] , β ⃗ = [ β 0 β 1 . . . β p ] \vec{Y} = \begin{bmatrix} y_1 \\ y_2 \\ ... \\ y_n \end{bmatrix}, \vec{X} = \begin{bmatrix} 1 x_{11} ... x_{1p} \\ ... \\ 1 x_{n1} ... x_{np} \end{bmatrix}, \vec{\beta} = \begin{bmatrix} \beta_0 \\ \beta_1 \\ ... \\ \beta_p \end{bmatrix} Y = y1y2...yn ,X = 1x11...x1p...1xn1...xnp ,β = β0β1...βp
使用Sigmoid函数,将 x x x值转换为一个接近0或1的 y y y值:
y = 1 1 + e − ( w T x + b ) y = \frac {1} {1 + e^{-(w^Tx + b)}} y=1+e(wTx+b)1
可以转为:
l n y 1 − y = w T x + b ln \frac {y} {1 - y} = w^Tx + b ln1yy=wTx+b
其中, y 1 − y \frac y {1 - y} 1yy是“几率”,反应了 x x x作为正例的相对可能性。

若将 y y y视为类后验概率估计 p ( y = 1 ∣ x ) p(y = 1 | x) p(y=1∣x),则为:
l n p ( y = 1 ∣ x ) p ( y = 0 ∣ x ) = w T x + b ln \frac {p(y = 1 | x)} {p(y = 0 | x)} = w^Tx + b lnp(y=0∣x)p(y=1∣x)=wTx+b

p ( y = 1 ∣ x ) + p ( y = 0 ∣ x ) = 1 p(y = 1 | x) + p(y = 0 | x) = 1 p(y=1∣x)+p(y=0∣x)=1

所以可以得到:
p ( y = 1 ∣ x ) = e w T x + b 1 + e w T x + b p(y = 1| x) = \frac {e^{w^Tx + b}} {1 + e^{w^Tx + b}} p(y=1∣x)=1+ewTx+bewTx+b

p ( y = 0 ∣ x ) = 1 1 + e w T x + b p(y = 0 | x) = \frac {1} {1 + e^{w^Tx + b}} p(y=0∣x)=1+ewTx+b1

因此可以采用“最大似然法”求解 w ⃗ \vec{w} w b b b

似然性(Likelihood) 是一个事件实际已经发生,反推在什么参数条件下,这个事件发生的概率最大。

采用“对数似然”:
L ( w , b ) = ∑ i = 1 m l n p ( y i ∣ x i ; w , b ) L(w,b) = \sum^{m}_{i=1}lnp(y_i|x_i;w,b) L(w,b)=i=1mlnp(yixi;w,b)

采用梯度下降进行求解。

原理:通过计算损失函数关于模型参数的梯度,然后沿着梯度的反方向(即最陡峭的下降方向)更新参数。这样,每次迭代都会使损失函数值减小(至少在局部上是这样的),从而逐渐接近损失函数的最小值。

步骤:

Step 1) 初始化参数:选择一个初始的模型参数向量。

Step 2) 计算损失函数对参数的梯度,表示损失函数在当前参数值处的变化率。

Step 3) 沿着梯度的反方向,以一定的学习率更新参数的值,使得损失函数逐渐减小。

Step 4) 重复步骤2和步骤3,直到满足终止条件。

代码实现

数据集下载:Iris - UCI Machine Learning Repository

Iris数据集是有三个目标特征,在这里仅用逻辑回归进行二分类处理,因此删除了后面50个其他目标特征的,使这个数据集符合二分类。

数据集处理:处理出 X X X Y Y Y,并将 Y Y Y的目标特征非0/1进行转换,在将 Y Y Y设置为 ( n , 1 ) (n, 1) (n,1)的矩阵形状:

import numpy as np
import pandas as pd

def data_processing():
    data_csv = pd.read_csv('iris.data')
    data_csv = data_csv.dropna()
    # print(data_csv)
    X = data_csv.iloc[:-1, 0:4].values
    # print(X)
    Y = data_csv.iloc[:-1, 4].map({'Iris-setosa': 0, 'Iris-versicolor': 1}).values
    Y = Y.reshape(-1, 1)
    # print(Y.shape)
    return X, Y
data_processing()

逻辑回归模型训练:

import numpy as np
import matplotlib.pyplot as plt

def sigmoid(x: np.array):
    return 1 / (1 + np.exp(-x))


def trains(X: np.array, Y: np.array, theta: np.array, learn_rate: float, epochs: int):
    """
    定义trains函数,用于训练逻辑回归模型
    X: np.array,特征矩阵,形状为(m, n),其中m是样本数量,n是特征数量
    Y: np.array,目标变量,形状为(m, 1),表示每个样本的标签(0或1)
    theta: np.array,模型参数,形状为(n, 1),表示每个特征的权重
    learn_rate: float,学习率,控制参数更新的步长
    epochs: int,迭代次数,表示训练模型的轮数
    """
    m = len(Y)
    
    loss_values = np.zeros((epochs, 1))
    # 进行多次迭代训练
    for epoch in range(epochs):
        z = X @ theta
        # 计算预测值h,通过sigmoid函数将z映射到(0, 1)之间
        h = sigmoid(z)
        # 计算损失loss,即预测值h与实际值Y之间的差异
        loss = h - Y
        # 计算梯度gradient,根据损失和特征矩阵计算参数的梯度
        gradient = X.T @ loss / m
        # 更新参数theta,使用梯度下降法,学习率乘以梯度
        theta -= learn_rate * gradient
        loss_values[epoch] = np.sum(loss ** 2) / (2 * m)
    
    plt.plot(loss_values)
    plt.show()
    # 返回训练后的参数theta
    return theta

import data_processing as dp

X, Y = dp.data_processing()
print(trains(X, Y, np.zeros((X.shape[1], 1)), 0.01, 10000))

在这里插入图片描述

用人话讲明白逻辑回归Logistic regression - 知乎 (zhihu.com)

Python实现逻辑回归(Logistic Regression)_python 逻辑回归-CSDN博客


http://www.kler.cn/a/472812.html

相关文章:

  • IWOA-GRU和GRU时间序列预测(改进的鲸鱼算法优化门控循环单元)
  • 【STM32+QT项目】基于STM32与QT的智慧粮仓环境监测与管理系统设计(完整工程资料源码)
  • 《繁星路》V1.8.3(Build16632266)官方中文学习版
  • Android 来电白名单 只允许联系人呼入电话
  • /src/utils/request.ts:axios 请求封装,适用于需要统一处理请求和响应的场景
  • 将txt转成excel正则化公式的调整
  • sqlzoo答案1-SELECT names
  • 牛客网刷题 ——C语言初阶(6指针)——BC105 矩阵相等判定
  • 解决vmware虚拟机和宿主机之间不能复制粘贴
  • GDPU Android移动应用 重点习题集
  • idea报错Malformed \uxxxx encoding.报错解决
  • 【Python】构建智能语音助手:使用Python实现语音识别与合成的全面指南
  • (自己备份用)一些安装pytorch包的经验
  • 攻防世界 bug
  • SQL Server-Query Store
  • 用Python实现简单的任务自动化
  • Anroid通过WebView打开见面发布App
  • 江科大STM32入门——SPI通信笔记总结
  • Internet协议原理
  • git push -f 指定分支
  • SQL刷题笔记——高级条件语句
  • Java 数据结构之-LinkedHashMap
  • uni app 写的 小游戏,文字拼图?文字拼写?不知道叫啥
  • CANopen转EtherCAT网关连接伺服驱动
  • 探秘5网口IIOT网关
  • Adobe Flash,Flash Player和RTMP之间的关系