【机器学习chp6】对数几率回归

news2024/11/22 16:46:43

推荐文章1,其中解释了负log似然损失等价于交叉熵损失。

【王木头·从感知机到神经网络】-CSDN博客

推荐文章2,其中有牛顿法的介绍

【王木头·梯度下降法优化】随机梯度下降、牛顿法、动量法、Nesterov、AdaGrad、RMSprop、Adam-CSDN博客

推荐文章3,其中通过实例介绍了各种二分类模型的评价指标

【机器学习】二分类模型评估方法大全-CSDN博客

前言

本文遗留问题:

(1)案例分析未完成。

(2)分类模型评价指标实验需回顾。

目录

前言

一、对数几率回归模型

1、分类任务

(1)分类任务概述

(2)两类分类任务

2、对数几率回归模型

(1)Sigmoid 函数

(2)对数几率回归模型

二、对数几率回归的损失函数

1、0/1损失

2、交叉熵损失

3、对数几率回归模型的目标函数

(1)对数几率回归模型的目标函数

(2)对数几率回归中正则化的必要性

三、对数几率回归的优化求解

1、梯度下降求解

(1)目标函数形式

(2)损失函数梯度

(3)Hessian矩阵正定——逻辑回归极小值是最小值

2、牛顿法求解

3、拟牛顿法介绍

4、Logistic回归的牛顿求解:IRLS

四、多类分类任务的对数几率回归

1、1vs.其他

2、多项分布直接实现多分类任务

3、损失函数

五、分类任务中的样本不均衡问题

1、概述

2、从数据角度解决

(1)随机上/下采样

(2)下采样与集成学习

(3)上采样与样本合成

3、从算法层面解决

(1)代价敏感学习

(2)Scikit-Learn中的不均衡样本分类处理

六、分类模型的评价指标

七、对数几率回归案例分析

八、⭐⭐全文总结⭐⭐


一、对数几率回归模型

1、分类任务

(1)分类任务概述

监督学习的定义:

        给定训练数据集 D = \{(x_i, y_i)\}_{i=1}^N,其中 x_i​ 是输入特征, y_i​ 是输出或响应。

分类任务:

        当 y_i \in \{1, 2, \ldots, C\} 时,监督学习任务称为分类任务。目标是学习从输入 x到输出 y的映射 f

测试阶段:

        利用学习到的映射 f(x) 对新的数据 x 进行预测 \hat{y} 。

分类任务的重点是构建一个模型 f(x) 来捕捉输入 x 与输出 y 的关系,并在测试数据上进行预测。

(2)两类分类任务

两类分类的输出y_i \in \{0, 1\}

伯努利分布:两类分类任务的概率分布可以用伯努利分布描述: p(y; \mu) = \mu^y (1 - \mu)^{1-y} 其中,\mu 表示事件 y=1 的概率。

对于输入 x,输出 y 的条件分布用 \mu(x) 描述:

                                        ​​​​​​​        ​​​​​​​        y | x \sim \text{Bernoulli}(\mu(x))

此处 \mu(x) 表示在输入 x的情况下,y=1 的概率。

2、对数几率回归模型

(1)Sigmoid 函数

定义: \sigma(z) = \frac{1}{1 + e^{-z}}

导数: \frac{d \sigma(z)}{dz} = \sigma(z) (1 - \sigma(z))

Sigmoid 函数的特性在于其值域在 (0, 1),适合作为概率值。

(2)对数几率回归模型

概率密度函数p(y|x; \mu) = \mu(x)^y (1 - \mu(x))^{1-y}

线性模型:假设 \mu(x) 的形式为: \mu(x) = w^T x 但由于 \mu(x) 是概率值,需在区间 [0, 1] 内,因此将其通过 sigmoid 函数约束: \mu(x) = \sigma(w^T x) 其中 sigmoid 函数为: \sigma(z) = \frac{1}{1 + e^{-z}}

对数几率回归使用 sigmoid 函数将线性模型的输出变换为概率。

对数几率:
定义一个事件的几率(odds)为该事件发生的概率与不发生的概率的比值:
        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​         \frac{p(y = 1|x)}{p(y = 0|x)} = \frac{\sigma(w^T x)}{1 - \sigma(w^T x)} = \frac{\frac{1}{1 + e^{-w^T x}}}{1 - \frac{1}{1 + e^{-w^T x}}} = e^{w^T x}
    ​​​​​​​        ​​​​​​​        

两边同取log运算,得到对数几率:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​       \ln \frac{p(y = 1|x)}{p(y = 0|x)} = \ln \left(e^{w^T x}\right) = w^T x

决策边界:

分类规则:根据后验概率的大小进行分类: p(y=1|x) > p(y=0|x) \implies w^T x > 0 \implies y=1 决策边界是 w^T x = 0,此时 y=1y=0 的概率相等。

二、对数几率回归的损失函数

1、0/1损失

若预测值 \hat{y} 等于真实值 y,损失为 0;否则为 1:

缺点:0/1 损失函数不连续,导致优化计算困难。

替代:通常选用凸损失函数(如交叉熵损失),它连续且易于优化,且与 0/1 损失结果一致。

2、交叉熵损失

交叉熵损失描述了两个分布之间的差异,用于分类任务中概率分布的对比。

在对数几率回归模型中:

        ​​​​​​​        ​​​​​​​        ​​​​​​​         L(\mu(x), y) = -y \ln(\mu(x)) - (1 - y) \ln(1 - \mu(x))

其中:

  • \mu(x) = \sigma(w^\top x),表示预测为正类的概率;
  • \sigma(z) = \frac{1}{1 + e^{-z}} 是 Sigmoid 函数。

交叉熵损失等价于负log似然损失,详细的分析在推荐文章1。

3、对数几率回归模型的目标函数

(1)对数几率回归模型的目标函数

对数几率回归的目标函数包含两部分:

  • 损失项:交叉熵损失,用于衡量预测值与真实值之间的差异;
  • 正则化项:用于避免模型过拟合,限制权重大小。

数学表达式:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        J(w; \lambda) = \sum_{i=1}^{N} L(y_i, \mu(x_i; w)) + \lambda R(w)

其中:

  • \lambda 是正则化强度的超参数;
  • R(w) 是正则化项,可以选择:
    • L1 正则:R(w) = |w|_1
    • L2 正则:R(w) = |w|_2^2
    • 或两者的组合。

(2)对数几率回归中正则化的必要性

        从贝叶斯角度来看,正则化的引入是为了在参数估计过程中加入先验信息,以便对模型的复杂性进行约束,防止过拟合。在没有正则化的情况下,实际上就是在没有任何先验假设的情况下进行最大似然估计 (MLE),即直接根据数据推断参数。

        当你使用对数几率回归(logistic regression)并且没有引入正则化时,模型的训练目标仅仅是最大化似然函数。这个过程中,尤其在训练数据完全可分的情况下,最大化似然函数会导致权重参数无限增大,因为这样的增大能够让模型的决策边界完美地将正负样本分开,从而使得训练误差趋近于零。

        贝叶斯视角下来看,这意味着我们没有任何先验信息来约束参数的大小,导致在没有任何限制的情况下,模型会过度拟合数据,参数趋向无穷大。具体来说,在数据完全可分时,似然函数趋向无穷大,因为随着参数增大,模型能够越来越准确地分类每一个样本,但这种无穷大的可能性缺乏对参数的合理限制。

问题:为什么参数大可以让能够让模型的决策边界完美地将正负样本分开,从而使得训练误差趋近于零?

        在逻辑回归中,模型试图找到一个最优的决策边界来将正负样本区分开。随着模型参数(\theta) 增大:

  1. 增大参数时,\theta^T x_i 会变得更大或更小:对于正样本(y_i = 1),当参数 \theta 增大时,\theta^T x_i​ 会变得更大,使得 \sigma(\theta^T x_i) 更接近1;对于负样本(y_i = 0),如果参数 \theta 继续增大,\theta^T x_i​ 会变得更小,使得 \sigma(\theta^T x_i) 更接近0。

  2. “完美拟合”:当模型参数足够大时,正样本的预测概率会接近1,负样本的预测概率会接近0。这意味着模型能够完美地分开所有正负样本,产生一个理想的决策边界。

  3. 极端情况下的无穷大:在训练数据完全线性可分的情况下,最大化似然函数会导致参数不断增大,从而使得模型对每个样本的分类概率趋向于极端值(1或0),从而使决策边界完全分开正负样本。

        当训练数据 不完全可分,理论上来说,正则化并不是绝对必要的,但引入正则化依然是一种常见的做法。

        当训练数据 不完全可分,训练数据中正负样本可能重叠,且存在无法通过一个简单的线性决策边界完美分开的情况。这意味着,即使模型参数增大,也无法使得所有样本的预测概率趋近于0或1。在这种情况下,模型会尽量减少训练误差,但它不会过度增大参数来“强行”分开样本,而是会在一个较为合理的范围内收敛,从而实现较好的拟合。

三、对数几率回归的优化求解

        对数几率回归的目标函数通常无法通过解析方式直接求解,因此需要使用数值优化的方法。主要的优化方法有:

梯度下降法

  • 随机梯度下降(SGD):每次使用一个样本点进行梯度更新,收敛速度快,但容易受到噪声干扰。
  • 随机平均梯度(SAG):改进了SGD,通过利用历史梯度信息进行加权平均,减少震荡。
  • SAGA:进一步优化了SAG算法,适用于非凸问题。
  • 坐标轴下降法:逐次优化每个变量。(当使用L1正则时只能用坐标轴下降

牛顿法和拟牛顿法

  • 使用二阶导数(Hessian矩阵)进行优化,收敛速度更快,但计算开销较大。包括BFGS和L-BFGS等方法。

1、梯度下降求解

(1)目标函数形式

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        J(w, \lambda) = C \sum_{i=1}^{N} L(\mu(x_i; w), y_i) + R(w)

  • L(\mu(x_i; w), y_i):交叉熵损失,定义了模型预测值与真实标签的偏离程度。
  • R(w):正则化项,防止模型过拟合。可以是L1正则、L2正则,或二者结合。
  • C:超参数,用于平衡损失函数和正则项。 起到正则作用, C 越大,正则越少。

(2)损失函数梯度

梯度的表达式是:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        g(w) = \nabla_w J_1(w) = X^T (\mu - y)

其中:

  • \mu = \sigma(Xw),表示模型的预测值;
  • y 是真实标签;
  • X^T 为输入数据的转置。

梯度下降法使用梯度信息沿负梯度方向更新权重,更新公式为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        w^{(t+1)} = w^{(t)} - \eta g(w)

其中 \eta 是学习率。

(3)Hessian矩阵正定——逻辑回归极小值是最小值

Hessian矩阵 H(w) 的定义:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​              H(w) = \frac{\partial g(w)}{\partial w^T}

展开梯度的二阶导数:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        H(w) = \frac{\partial \left( \sum_{i=1}^N (\mu(x_i, w) - y_i) x_i \right)}{\partial w^T}

通过链式法则得到:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        H(w) = \sum_{i=1}^N \mu_i (1 - \mu_i) x_i x_i^T

使用矩阵表示:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​          H(w) = X^T S X

其中:

  • \mu_i = \mu(x_i, w) = \sigma(w^T x_i)
  • S = \text{diag}(\mu_i(1 - \mu_i)),为对角矩阵
  • X为输入特征矩阵,x_i​ 表示单个样本的特征向量。
所以Hessian矩阵 为正定矩阵,梯度下降能找到全局最小值。

2、牛顿法求解

推荐文章2中有关于牛顿法的简单介绍

对数几率回归的牛顿法梯度下降的迭代公式为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        w^{(t+1)} = w^{(t)} - H(w)^{-1} g(w)

优点是收敛速度快,缺点是需要计算和存储Hessian矩阵,计算复杂度较高。

3、拟牛顿法介绍

牛顿法比一般的梯度下降法收敛速度快。

但在高维情况下,计算目标函数的二阶偏导数的复杂度高,而且有时候目标函数的海森矩阵无法保持正定,不存在逆矩阵,此时牛顿法将不再能使用。
因此人们提出了 拟牛顿法 :不用二阶偏导数构造出可以近似Hessian矩阵(或Hessian矩阵的逆矩阵)的正定对称矩阵,进而再逐步优化目标函数。

不同的Hessian矩阵构造方法产生了不同的拟牛顿法,BFGS/L-BFGS

推荐阅读:
1. 谈谈常见的迭代优化方法
https://blog.csdn.net/aws3217150/article/details/50548177
2. Mathematical optimization: finding minima of functions
https://www.scipy-lectures.org/advanced/mathematical_optimization/

4、Logistic回归的牛顿求解:IRLS

四、多类分类任务的对数几率回归

1、1vs.其他

对每个类别 c ,训练一个对数几率回归分类器 f^{c}_{w}(x) ,预测 y=c 概率

对新的输入 x ,选择使得 f^{c}_{w}(x) 最大的类别作为预测(最大后验估计, MAP)
                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        
                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​  \hat{y}=\underset{c}{argmax}f^{c}_{w}(x)

2、多项分布直接实现多分类任务

Bernoulli分布用于描述二分类任务,而Multinoulli分布(即多项分布)用于多类分类任务。

Multinoulli分布的参数表示为类别的概率向量 \theta = (\theta_1, \theta_2, ..., \theta_C),其中每个分量表示对应类别的概率,所有分量和为1。

softmax函数及分类

Softmax函数扩展了Sigmoid函数,用于将线性组合的输出转换为类别概率。其公式为:         ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \sigma(z_c) = \frac{e^{z_c}}{\sum_{c'=1}^C e^{z_{c'}}}

Softmax分类器适合处理多类分类任务,通过计算每个类别的概率并选择最大概率的类别作为最终输出。

3、损失函数

定义为负对数似然损失(Negative Log-Likelihood Loss)。损失函数形式为:   

      ​​​​​​​        ​​​​​​​        ​​​​​​​      ​​​​​​​             ​​​​​​​        L(\mu, y) = -\sum_{c=1}^C y_c \ln(\mu_c)

等价为交叉熵损失。

最大化似然估计等价于最小化训练集上的损失。

五、分类任务中的样本不均衡问题

1、概述

样本不均衡问题是指在分类任务中,不同类别的样本数量差异很大。例如:

  • 少数类的样本数量远小于多数类。
  • 导致模型在训练时倾向于多数类,从而忽略少数类的特征。

出现场景

  • 搜索引擎:点击预测中,点击的网页占比很小。
  • 电子商务:商品推荐中,被推荐商品被购买的概率低。
  • 信用卡欺诈检测:欺诈样本极少。
  • 网络攻击识别:正常访问请求占绝大多数。
  • 医疗诊断:罕见疾病的病例稀少。

这些场景中,少数类虽然样本少,但通常是更重要的,忽视少数类可能导致模型实用性降低。

解决 样本不均衡问题可从数据角度或算法角度

2、从数据角度解决

通过数据增强或预处理的方式平衡数据分布。

(1)随机上/下采样

随机下采样:

        从多数类中随机选择少量样本,与少数类样本结合构建新的训练集。

        优点:减少多数类样本对模型的偏向。

        缺点:可能丢失信息,导致模型性能下降。

随机上采样:

        随机复制少数类样本来增加样本量
         优点:平衡类别分布,充分利用现有数据。
         缺点:易导致过拟合,模型可能“记住”重复的少数类样本。

(2)下采样与集成学习

EasyEnsemble算法:

  • 将多数类样本通过有放回抽样生成多个子集。
  • 每个子集与少数类样本组合形成一个训练数据集,分别训练多个模型。
  • 最终预测结果为这些模型输出的平均值。
  • 这种方法通过集成学习增强了模型对少数类的分类能力。

BalanceCascade(级联)算法:

  • 根据已有模型的预测准确性,从多数类样本中有效地选择与少数类样本结合生成新的数据集。
  • 对每轮训练中未正确分类的样本,作为下一轮训练的重要部分,直到满足某种停止条件。
  • 最终模型由这些迭代模型的组合形成。

优点:

  • 针对少数类的特征进行多样化训练,能够增强模型的泛化能力。
  • 适合处理多数类数据量较大的场景。

缺点:

  • 多次采样和模型训练可能会增加计算复杂度。

(3)上采样与样本合成

SMOTE算法(Synthetic Minority Over-sampling Technique合成少数过采样技术):

  • 通过插值法生成新的少数类样本。
  • 步骤:
    1. 对于少数类样本 x_i​,找到其 K个最近邻样本。
    2. 随机选择一个最近邻样本 x_{near}​。
    3. x_i​ 和 x_{near}​ 之间生成一个新的样本: x_{new} = (1-\xi)x_i + \xi x_{near}, \xi \in [0, 1]
  • 新样本是通过少数类样本之间的插值生成,旨在增加少数类样本的分布密度。

优点:

  • 避免了随机上采样可能导致的过拟合问题。
  • 实践证明可以提高分类器性能。

不足:

  • 高维数据表现不佳:高维空间中样本邻域稀疏,插值的有效性下降。
  • 引入噪音:可能将多数类的邻近样本误认为少数类,从而生成噪音样本。
  • 类别重叠风险:边界区域可能引入错误的类别标签。

改进

  • Borderline-SMOTE等算法:
    • 更关注少数类边界的样本,通过更精细的策略生成样本以减少错误噪音。

3、从算法层面解决

通过优化算法适应不平衡数据。

(1)代价敏感学习

核心思想:不同类别的分类错误代价不同,通过调整损失函数中的代价矩阵,赋予少数类更大的权重。

代价矩阵形式:                                 代价矩阵= \begin{bmatrix} L_{00} & L_{01} \\ L_{10} & L_{11} \end{bmatrix}

  • L_{01}​:将 0 分类为 1 的代价。
  • L_{10}​:将 1 分类为 0 的代价。

(2)Scikit-Learn中的不均衡样本分类处理

类权重(class_weight)

  • 功能:在训练模型时为每个类别分配权重,增加少数类的重要性。某类别的样本量越多,其权重越低;样本量越少,则权重越高

        设置方式

  • balanced:自动计算权重,公式为: 

        ​​​​​​​        ​​​​​​​        

  • 自定义权重:手动设置每个类别的权重,如 {0: 0.9, 1: 1.1}

样本权重(sample_weight)

  • 功能:为每个样本设置权重,在模型训练时区分样本的重要性。
  • 特点:可以结合类权重使用,最终权重为二者的乘积。样本的真正权重是:class_weight*sample_weight

六、分类模型的评价指标

推荐文章3。

两分类的评价指标在推荐文章3中已有分析,从两分类到多分类的情况:

七、对数几率回归案例分析

Otto商品分类

八、⭐⭐全文总结⭐⭐

        对数几率回归虽然名字是回归,但它不是回归算法,而是分类算法。本文首先介绍了对数几率回归模型。采用sigmoid激活函数使得不同类别的概率和归一化。对其进行处理,如寻找损失函数和目标函数时对其取对数。

        损失函数为交叉熵损失(或者说负log似然损失)。

        目标函数为损失函数和加上正则项,对数几率回归一定要加正则项,因为如果样本数据可分,要让损失函数最小,即log似然最大,该过程中会使得参数w趋于无穷大。因为无穷大时 训练误差趋近于零。实现完美可分。
        对目标函数的优化采样的方法是梯度下降法,改进方法为牛顿法,拟牛顿法。但如果正则化采用L1正则,不能使用梯度下降,只能用坐标轴下降。
        在第四部分介绍了多分类的情况,激活函数采用sigmoid的扩展softmax。损失函数仍然为交叉熵损失(负log似然损失)。
        第五部分介绍了分类任务中样本不均衡问题,可以从数据角度解决,
分为上采样(样本少的类采用差值扩充)和下采样(样本多的类抽取少量,多次建模,取平均模型);从算法角度主要是给类别赋不同的权重,让样本少的类别权重大一点。
        第六部分介绍分类任务的评价指标。
        第七部分对一个案例进行分析,对本节知识实现了应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2245433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图像处理实验报告

实验一 图像处理的MATLAB基础 实验目的:熟悉数字图象处理的基本软件工具和操作 实验内容:Matlab应用复习,矩阵产生、操作;矩阵运算以及字符运算。 1.利用增量产生向量[0,2,4,6,8,10]。 2.利用magic(n)函数产生7维魔鬼矩阵A&am…

离散数学---概率, 期望

本文根据 MIT 计算机科学离散数学课程整理(Lecture 22 ~ Lecture 24)。 1 非负整数期望性质 用 N 表示非负整数集合,R 是 N 上的随机变量,则 R 的期望可以表示成: 证明: 换一个形式,把每一列…

GPU服务器厂家:科研服务器领域机遇与博弈,AMD 新UDNA 架构

科研服务器作为推动科学研究进步的核心基础设施,其性能与架构的创新对于整个科研生态有着极为关键的影响。AMD 全新推出的 UDNA 架构,引发了广泛的关注与讨论。 AMD UDNA 架构于科研服务器的产品数据与市场格局 AMD 在计算机硬件领域的影响力持续攀升&a…

STM32H7开发笔记(2)——H7外设之多路定时器中断

STM32H7开发笔记(2)——H7外设之多路定时器中断 文章目录 STM32H7开发笔记(2)——H7外设之多路定时器中断0.引言1.CubeMX配置2.软件编写 0.引言 本文PC端采用Win11STM32CubeMX4.1.0.0Keil5.24.2的配置,硬件使用STM32H…

【Linux】Linux入门实操——定时任务调度

一、crond调度 1. 概述 任务调度: 是指系统在某个时间执行的特定的命令或程序。任务调度分类 1. 系统工作 : 有些重要的工作必须周而复始地执行。如病毒扫描等 2. 用户工作 :用户可能希望执行某些程序,比如对mysql数据库的备份。 2. 基本语法 cron…

找到字符串中所有字母异位词(java)

题目描述: 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词 示例 1: 输入: s "cbaebabacd", p "abc&…

Leetcode226. 翻转二叉树(HOT100)+Leetcode221. 最大正方形(HOT100)

链接 题解: 本题是要镜像反转二叉树,相当于从中间一分,然后把左子树和右子树对调,但又不是简单的对调,还要继续反转子树的子树,所以要用递归。 我们特判root是否为空(否则出现nullptr->nul…

ISUP协议视频平台EasyCVR私有化视频平台新能源汽车充电停车管理方案的创新与实践

在环保意识提升和能源转型的大背景下,新能源汽车作为低碳出行的选择,正在全球迅速推广。但这种快速增长也引发了充电基础设施短缺和停车秩序混乱等挑战,特别是在城市中心和人口密集的居住区,这些问题更加明显。因此,开…

国际知名摄影测量与遥感专家、瑞士苏黎世联邦理工学院终身教授Armin Gruen莅临大势智慧参观交流

11月18日,瑞士苏黎世联邦理工学院终身教授、国际摄影测量与遥感学会荣誉会员、武汉大学测绘遥感信息工程国家重点实验室客座教授Armin Gruen莅临武汉大势智慧科技有限公司(以下简称“大势智慧”)参观交流。大势智慧董事长黄先锋亲自接待了Arm…

RTSP播放器EasyPlayer.js播放器分辨率高的视频在设置container的宽高较小时,会出现锯齿状的画面效果

流媒体播放器的核心技术及发展趋势展现了其在未来数字生活中的无限潜力。随着技术的不断进步和市场的持续发展,流媒体播放器将在内容创新、用户体验优化以及跨平台互通等方面取得新的突破。对于从业者而言,把握这些趋势并积极应对挑战将是实现成功的关键…

C# 数据结构之【树】C#树

以二叉树为例进行演示。二叉树每个节点最多有两个子节点。 1. 新建二叉树节点模型 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace DataStructure {class TreeNode{public int Data { get;…

Sqlite: Java使用、sqlite-devel

这里写目录标题 一、简介二、使用1. Java项目中(1)引入驱动(2)工具类(3)调用举例 2. sqlite-devel in linuxsqlite-devel使用 三、更多应用1. 数据类型2. 如何存储日期和时间3. 备份 一、简介 非常轻量级&…

MySQL深入:B+树的演化、索引和索引结构

提示:内容是读《MySQL技术内幕:InnoDB存储引擎》,笔记摘要 文章目录 二叉查找树平衡二叉树(AVL) B树(BTree)B树(BTree)InnoDB B树索引索引结构(InnoDB B树)B树存放的数据量 二叉查找树 在二叉查找树中,左子…

C语言-11-18笔记

1.C语言数据类型 类型存储大小值范围char1 字节-128 到 127 或 0 到 255unsigned char1 字节0 到 255signed char1 字节-128 到 127int2 或 4 字节-32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647unsigned int2 或 4 字节0 到 65,535 或 0 到 4,294,967,295short2 字节…

“乐鑫组件注册表”简介

当启动一个新的开发项目时,开发者们通常会利用库和驱动程序等现有的代码资源。这种做法不仅节省时间,还简化了项目的维护工作。本文将深入探讨乐鑫组件注册表的概念及其核心理念,旨在指导您高效地使用和贡献组件。 概念解析 ESP-IDF 的架构…

【人工智能】PyTorch、TensorFlow 和 Keras 全面解析与对比:深度学习框架的终极指南

文章目录 PyTorch 全面解析2.1 PyTorch 的发展历程2.2 PyTorch 的核心特点2.3 PyTorch 的应用场景 TensorFlow 全面解析3.1 TensorFlow 的发展历程3.2 TensorFlow 的核心特点3.3 TensorFlow 的应用场景 Keras 全面解析4.1 Keras 的发展历程4.2 Keras 的核心特点4.3 Keras 的应用…

Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-差分信号

Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-差分信号 Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-单端信号详细介绍了单端信号如何进行TDR仿真分析,下面介绍如何对差分信号进行TDR分析,还是以下图为例进行分…

Django一分钟:django中收集关联对象关联数据的方法

场景:我有一个模型,被其它多个模型关联,我配置了CASCADE级联删除,我想要告知用户删除该实例之后,哪些关联数据将会被一同删除。 假设我们当前有这样一组模型: class Warehouse(models.Model):""…

Flink学习连载第二篇-使用flink编写WordCount(多种情况演示)

使用Flink编写代码,步骤非常固定,大概分为以下几步,只要牢牢抓住步骤,基本轻松拿下: 1. env-准备环境 2. source-加载数据 3. transformation-数据处理转换 4. sink-数据输出 5. execute-执行 DataStream API开发 //n…

利用开源的低代码表单设计器FcDesigner高效管理和渲染复杂表单结构

FcDesigner 是一个强大的开源低代码表单设计器组件,支持快速拖拽生成表单。提供丰富的自定义及扩展功能,FcDesigner支持多语言环境,并允许开发者进行二次开发。通过将表单设计输出为JSON格式,再通过渲染器进行加载,实现…