【模式识别与机器学习(5)】主要算法与技术(中篇:概率统计与回归方法)之逻辑回归(Logistic Regression)

文章目录

一、考试范围知识框架

  • 逻辑函数与sigmoid函数
  • 逻辑回归模型
  • 梯度下降法及其改进
  • 逻辑回归与线性回归的关系

二、正文内容

1. 逻辑函数与sigmoid函数

关键词:逻辑函数、sigmoid函数、非线性转换、概率输出

为什么需要逻辑回归?

问题:线性回归预测的是连续值(如房价、温度),但分类问题需要预测离散的类别(如"是/否"、"猫/狗")。

直接使用线性回归的问题:线性回归的输出可以是任意实数(如 -100 或 1000),但概率必须在 [0, 1] 之间,类别标签是离散的(0 或 1)。

解决方案:使用**逻辑函数(sigmoid函数)**将线性回归的输出映射到 [0, 1] 区间,表示概率。

Sigmoid函数

逻辑函数(sigmoid函数) 的数学表达式:

σ ( x ) = e x e x + 1 = 1 1 + e − x \sigma(x) = \frac{e^x}{e^x + 1} = \frac{1}{1 + e^{-x}} σ(x)=ex+1ex=1+e−x1

函数特点 :输入可以是任意实数( − ∞ -\infty −∞ 到 + ∞ +\infty +∞);输出在 [0, 1] 之间(正好是概率的范围);S形曲线,平滑过渡;当 x = 0 x = 0 x=0 时, σ ( 0 ) = 0.5 \sigma(0) = 0.5 σ(0)=0.5;当 x → + ∞ x \to +\infty x→+∞ 时, σ ( x ) → 1 \sigma(x) \to 1 σ(x)→1;当 x → − ∞ x \to -\infty x→−∞ 时, σ ( x ) → 0 \sigma(x) \to 0 σ(x)→0。

图像特点 :中间部分( x x x 接近0)变化较快;两端部分( x x x 很大或很小)变化缓慢,接近饱和。

逻辑回归模型

逻辑回归将线性回归的输出通过sigmoid函数转换为概率:

p ( y = 1 ∣ x ) = σ ( θ T x ) = 1 1 + e − θ T x p(y=1|x) = \sigma(\theta^T x) = \frac{1}{1 + e^{-\theta^T x}} p(y=1∣x)=σ(θTx)=1+e−θTx1

p ( y = 0 ∣ x ) = 1 − p ( y = 1 ∣ x ) = 1 1 + e θ T x p(y=0|x) = 1 - p(y=1|x) = \frac{1}{1 + e^{\theta^T x}} p(y=0∣x)=1−p(y=1∣x)=1+eθTx1

其中: θ T x \theta^T x θTx 是线性组合(就像线性回归), σ ( θ T x ) \sigma(\theta^T x) σ(θTx) 将线性组合映射到 [0, 1] 区间。

例子:垃圾邮件分类

假设我们根据邮件的特征(如包含"免费"、"中奖"等关键词)判断是否为垃圾邮件:

  • 特征: x = [ 1 , x 1 , x 2 ] x = [1, x_1, x_2] x=[1,x1,x2]( x 1 x_1 x1 = "免费"出现次数, x 2 x_2 x2 = "中奖"出现次数)
  • 参数: θ = [ θ 0 , θ 1 , θ 2 ] \theta = [\theta_0, \theta_1, \theta_2] θ=[θ0,θ1,θ2]
  • 线性组合: θ T x = θ 0 + θ 1 x 1 + θ 2 x 2 \theta^T x = \theta_0 + \theta_1 x_1 + \theta_2 x_2 θTx=θ0+θ1x1+θ2x2
  • 概率: p ( 垃圾邮件 ∣ x ) = σ ( θ T x ) p(\text{垃圾邮件}|x) = \sigma(\theta^T x) p(垃圾邮件∣x)=σ(θTx)

如果 θ T x = 2 \theta^T x = 2 θTx=2,则 p ( 垃圾邮件 ∣ x ) = σ ( 2 ) ≈ 0.88 p(\text{垃圾邮件}|x) = \sigma(2) \approx 0.88 p(垃圾邮件∣x)=σ(2)≈0.88(88%的概率是垃圾邮件)

优化目标

逻辑回归的优化目标是学习合适的参数 θ \theta θ,使得:当 x x x 属于"1"类(正类)时, p ( y = 1 ∣ x ) p(y=1|x) p(y=1∣x) 较大(接近1);当 x x x 属于"0"类(负类)时, p ( y = 0 ∣ x ) p(y=0|x) p(y=0∣x) 较大(接近1),即 p ( y = 1 ∣ x ) p(y=1|x) p(y=1∣x) 较小(接近0)。

通俗理解:让模型对正样本给出高概率,对负样本给出低概率。

2. 逻辑回归模型

关键词:伯努利分布、最大似然、负对数似然、优化目标

概率模型假设

逻辑回归假设每个样本的类标签 y i y_i yi 都是独立同分布的伯努利变量(Bernoulli distribution)。

伯努利分布:只有两个可能结果的分布(0或1),就像抛硬币。

  • p ( y i = 1 ∣ x i ) = σ ( θ T x i ) p(y_i = 1 | x_i) = \sigma(\theta^T x_i) p(yi=1∣xi)=σ(θTxi):样本 i i i 属于正类的概率
  • p ( y i = 0 ∣ x i ) = 1 − σ ( θ T x i ) p(y_i = 0 | x_i) = 1 - \sigma(\theta^T x_i) p(yi=0∣xi)=1−σ(θTxi):样本 i i i 属于负类的概率
联合似然函数

对于 N N N 个独立样本,联合似然函数为:

p ( y ∣ x , θ ) = ∏ i = 1 N p ( y i ∣ x i , θ ) = ∏ i = 1 N [ p ( y i = 1 ∣ x i ) y i ⋅ ( 1 − p ( y i = 1 ∣ x i ) ) 1 − y i ] p(y|x, \theta) = \prod_{i=1}^{N} p(y_i | x_i, \theta) = \prod_{i=1}^{N} [p(y_i=1|x_i)^{y_i} \cdot (1-p(y_i=1|x_i))^{1-y_i}] p(y∣x,θ)=i=1∏Np(yi∣xi,θ)=i=1∏N[p(yi=1∣xi)yi⋅(1−p(yi=1∣xi))1−yi]

通俗理解 :如果 y i = 1 y_i = 1 yi=1(正类),则使用 p ( y i = 1 ∣ x i ) p(y_i=1|x_i) p(yi=1∣xi);如果 y i = 0 y_i = 0 yi=0(负类),则使用 1 − p ( y i = 1 ∣ x i ) 1-p(y_i=1|x_i) 1−p(yi=1∣xi);所有样本的概率相乘,得到整体数据的似然。

最大似然估计

目标 :找到参数 θ \theta θ,使得观测到的数据出现的概率最大。

等价转换:最大化似然函数等价于最小化负对数似然函数:

max ⁡ p ( y ∣ x , θ ) ⇔ min ⁡ − ln ⁡ p ( y ∣ x , θ ) \max p(y|x, \theta) \Leftrightarrow \min -\ln p(y|x, \theta) maxp(y∣x,θ)⇔min−lnp(y∣x,θ)

**为什么取对数?**乘积变成求和,计算更方便;避免数值下溢(概率相乘可能非常小);对数函数单调递增,最大值位置不变。

负对数似然函数(损失函数)

负对数似然函数(也称为交叉熵损失):

L ( θ ) = − ln ⁡ p ( y ∣ x , θ ) = − ∑ i = 1 N [ y i ln ⁡ p ( y i = 1 ∣ x i ) + ( 1 − y i ) ln ⁡ ( 1 − p ( y i = 1 ∣ x i ) ) ] L(\theta) = -\ln p(y|x, \theta) = -\sum_{i=1}^{N} [y_i \ln p(y_i=1|x_i) + (1-y_i) \ln(1-p(y_i=1|x_i))] L(θ)=−lnp(y∣x,θ)=−i=1∑N[yilnp(yi=1∣xi)+(1−yi)ln(1−p(yi=1∣xi))]

函数特点 :当 y i = 1 y_i = 1 yi=1 且 p ( y i = 1 ∣ x i ) p(y_i=1|x_i) p(yi=1∣xi) 接近1时,损失接近0(预测正确);当 y i = 1 y_i = 1 yi=1 且 p ( y i = 1 ∣ x i ) p(y_i=1|x_i) p(yi=1∣xi) 接近0时,损失很大(预测错误);当 y i = 0 y_i = 0 yi=0 且 p ( y i = 1 ∣ x i ) p(y_i=1|x_i) p(yi=1∣xi) 接近0时,损失接近0(预测正确);当 y i = 0 y_i = 0 yi=0 且 p ( y i = 1 ∣ x i ) p(y_i=1|x_i) p(yi=1∣xi) 接近1时,损失很大(预测错误)。

例子

假设有3个样本:

  • 样本1: y 1 = 1 y_1 = 1 y1=1, p ( y 1 = 1 ∣ x 1 ) = 0.9 p(y_1=1|x_1) = 0.9 p(y1=1∣x1)=0.9 → 损失 = − ln ⁡ ( 0.9 ) ≈ 0.11 -\ln(0.9) \approx 0.11 −ln(0.9)≈0.11(小)
  • 样本2: y 2 = 0 y_2 = 0 y2=0, p ( y 2 = 1 ∣ x 2 ) = 0.2 p(y_2=1|x_2) = 0.2 p(y2=1∣x2)=0.2 → 损失 = − ln ⁡ ( 0.8 ) ≈ 0.22 -\ln(0.8) \approx 0.22 −ln(0.8)≈0.22(小)
  • 样本3: y 3 = 1 y_3 = 1 y3=1, p ( y 3 = 1 ∣ x 3 ) = 0.1 p(y_3=1|x_3) = 0.1 p(y3=1∣x3)=0.1 → 损失 = − ln ⁡ ( 0.1 ) ≈ 2.3 -\ln(0.1) \approx 2.3 −ln(0.1)≈2.3(大,预测错误)

总损失 = 0.11 + 0.22 + 2.3 = 2.63 0.11 + 0.22 + 2.3 = 2.63 0.11+0.22+2.3=2.63

优化目标 :通过调整参数 θ \theta θ,使得总损失最小。

3. 梯度下降法

关键词:梯度下降、学习率、批量梯度下降、随机梯度下降、小批量梯度下降

如何优化损失函数?

逻辑回归的损失函数 L ( θ ) L(\theta) L(θ) 是一个复杂的函数,没有像线性回归那样的解析解。我们需要用迭代优化的方法来找到最小值。**梯度下降法(Gradient Descent)**是最常用的优化方法。

什么是梯度?

对于多元函数 y = f ( x 1 , x 2 , . . . , x n ) y = f(x_1, x_2, ..., x_n) y=f(x1,x2,...,xn),梯度是一个向量:

∇ f = ( ∂ y ∂ x 1 , ∂ y ∂ x 2 , . . . , ∂ y ∂ x n ) \nabla f = \left(\frac{\partial y}{\partial x_1}, \frac{\partial y}{\partial x_2}, ..., \frac{\partial y}{\partial x_n}\right) ∇f=(∂x1∂y,∂x2∂y,...,∂xn∂y)

梯度的含义 :梯度指向函数增长最快 的方向;负梯度指向函数减小最快的方向;就像在山坡上,梯度指向最陡的上坡方向。

形象比喻:就像盲人下山,用脚感受坡度,沿着最陡的方向走。

梯度下降算法

核心思想:沿着负梯度方向(函数减小最快的方向)更新参数,逐步接近最小值。

更新规则

θ ( k + 1 ) = θ ( k ) − η ⋅ ∇ L ( θ ( k ) ) \theta^{(k+1)} = \theta^{(k)} - \eta \cdot \nabla L(\theta^{(k)}) θ(k+1)=θ(k)−η⋅∇L(θ(k))

其中: θ ( k ) \theta^{(k)} θ(k) 是第 k k k 次迭代的参数值, η \eta η 是学习率(步长),控制每次更新的幅度, ∇ L ( θ ( k ) ) \nabla L(\theta^{(k)}) ∇L(θ(k)) 是损失函数在当前参数处的梯度。

算法流程

  1. 初始化参数 θ ( 0 ) \theta^{(0)} θ(0)(随机初始化)
  2. 计算梯度 ∇ L ( θ ( k ) ) \nabla L(\theta^{(k)}) ∇L(θ(k))
  3. 更新参数: θ ( k + 1 ) = θ ( k ) − η ⋅ ∇ L ( θ ( k ) ) \theta^{(k+1)} = \theta^{(k)} - \eta \cdot \nabla L(\theta^{(k)}) θ(k+1)=θ(k)−η⋅∇L(θ(k))
  4. 重复步骤2-3,直到收敛(梯度接近0或损失不再减小)
学习率的选择

学习率 η \eta η 的选择非常重要:η \eta η 太小 时每次更新幅度小,收敛慢,需要很多次迭代;η \eta η 适中 时收敛速度快,效果好;η \eta η 太大时可能跳过最优解,甚至发散(损失函数值越来越大)。

例子

假设损失函数是一个碗形(凸函数):

  • η = 0.01 \eta = 0.01 η=0.01:小步前进,需要1000步到达底部
  • η = 0.1 \eta = 0.1 η=0.1:大步前进,需要100步到达底部
  • η = 1.0 \eta = 1.0 η=1.0:步长太大,可能跳过底部,在两边来回跳
梯度下降法的问题

1. 训练速度慢

对于大型数据集:每次迭代需要计算所有样本的梯度;需要遍历所有样本,计算量大;当数据量达到百万级时,每次迭代都很慢。

2. 容易陷入局部最优解

梯度下降只能看到"局部"的信息(当前位置的梯度);如果损失函数有多个"坑"(局部最小值),可能陷入较浅的坑;就像盲人下山,可能走到一个小洼地就以为到底了。

形象比喻全局最优 是整个山区的最低点(真正的山底),局部最优是某个小洼地(比周围低,但不是最低的)。

解决方案:使用改进的梯度下降方法(见下一节)。

4. 梯度下降法的改进

关键词:批量梯度下降、随机梯度下降、小批量梯度下降、动量法、自适应学习率

批量梯度下降法(BGD)

标准梯度下降 (也叫批量梯度下降,Batch Gradient Descent,BGD):每次迭代使用所有样本计算梯度,梯度方向准确,但计算量大。

特点:✅ 梯度方向准确(使用全部数据);✅ 收敛稳定;❌ 计算量大,速度慢;❌ 不适合大数据集。

随机梯度下降法(SGD)

核心思想 :每次迭代只使用一个样本计算梯度并更新参数。

更新规则

θ ( k + 1 ) = θ ( k ) − η ⋅ ∇ L i ( θ ( k ) ) \theta^{(k+1)} = \theta^{(k)} - \eta \cdot \nabla L_i(\theta^{(k)}) θ(k+1)=θ(k)−η⋅∇Li(θ(k))

其中 L i L_i Li 是第 i i i 个样本的损失。

特点:✅ 训练速度快(每次只处理一个样本);✅ 可以实时学习(来一个样本更新一次);✅ 可能跳出局部最优(随机性);❌ 梯度方向不准确(只用1个样本);❌ 收敛不稳定(波动大);❌ 容易受噪声或离群点影响。

形象比喻BGD 看完整张地图再决定方向(准确但慢),SGD只看一个路标就决定方向(快但不准确)。

小批量梯度下降法(MBGD)

核心思想 :每次迭代使用一小批样本(mini-batch)计算梯度,是BGD和SGD的折中。

更新规则

θ ( k + 1 ) = θ ( k ) − η ⋅ 1 m ∑ i = 1 m ∇ L i ( θ ( k ) ) \theta^{(k+1)} = \theta^{(k)} - \eta \cdot \frac{1}{m} \sum_{i=1}^{m} \nabla L_i(\theta^{(k)}) θ(k+1)=θ(k)−η⋅m1i=1∑m∇Li(θ(k))

其中 m m m 是批量大小(batch size),通常取32、64、128等。

特点:✅ 训练速度较快(比BGD快);✅ 梯度方向较准确(比SGD准确);✅ 收敛较稳定(比SGD稳定);✅ 可以利用GPU并行计算(批量处理);✅ 实际应用中最常用。

批量大小选择m = 1 m = 1 m=1退化为SGD;** m = N m = N m=N** (全部样本)退化为BGD;** m = 32 − 256 m = 32-256 m=32−256**是常用选择,平衡速度和稳定性。

动量梯度下降法(Momentum)

核心思想 :不仅考虑当前梯度,还考虑历史梯度,就像给球一个惯性。

更新规则

m ( t ) = γ ⋅ m ( t − 1 ) + ( 1 − γ ) ⋅ ∇ L ( θ ( t ) ) m^{(t)} = \gamma \cdot m^{(t-1)} + (1-\gamma) \cdot \nabla L(\theta^{(t)}) m(t)=γ⋅m(t−1)+(1−γ)⋅∇L(θ(t))

θ ( t + 1 ) = θ ( t ) − η ⋅ m ( t ) \theta^{(t+1)} = \theta^{(t)} - \eta \cdot m^{(t)} θ(t+1)=θ(t)−η⋅m(t)

其中: m ( t ) m^{(t)} m(t) 是动量项(历史梯度的加权平均), γ \gamma γ 是动量系数(通常0.9),控制历史梯度的权重。

优点:✅ 加速收敛(在一致方向上有"惯性");✅ 减少震荡(平滑梯度方向);✅ 可能跳出局部最优(有动量)。

形象比喻标准梯度下降 每步都重新决定方向,动量梯度下降有"惯性",在一致方向上加速。

例子

假设损失函数是一个长而窄的"峡谷":

  • 标准梯度下降:在峡谷两边来回震荡,前进缓慢
  • 动量梯度下降:利用惯性,沿着峡谷底部快速前进
其他改进算法

自适应学习率算法:根据历史梯度自动调整学习率

  1. AdaGrad:对频繁更新的参数使用小学习率,对不频繁更新的参数使用大学习率
  2. RMSProp:改进AdaGrad,使用指数移动平均
  3. Adam:结合动量和自适应学习率,实际应用中最常用

Adam算法特点:✅ 自适应学习率;✅ 结合动量;✅ 收敛快且稳定;✅ 对超参数不敏感;✅ 深度学习中最常用的优化器。

算法对比总结
算法 速度 稳定性 适用场景
BGD 稳定 小数据集
SGD 不稳定 在线学习
MBGD 较快 较稳定 最常用
Momentum 稳定 有"峡谷"的损失函数
Adam 稳定 深度学习首选

实际应用建议

  • 小数据集(<1000样本)→ 使用BGD
  • 大数据集 → 使用MBGD(batch size = 32-256)
  • 深度学习 → 使用Adam优化器
  • 需要快速实验 → 使用SGD

5. 逻辑回归与线性回归的关系

关键词:广义线性模型、对数几率、线性分类器、决策边界

逻辑回归是"线性"的吗?

逻辑回归看起来是非线性的(因为有sigmoid函数),但本质上又是线性的

关键理解:逻辑回归对**对数几率(log-odds)**是线性的。

对数几率

对数几率 = ln ⁡ ( p ( y = 1 ∣ x ) p ( y = 0 ∣ x ) ) = ln ⁡ ( p ( y = 1 ∣ x ) 1 − p ( y = 1 ∣ x ) ) = θ T x \text{对数几率} = \ln\left(\frac{p(y=1|x)}{p(y=0|x)}\right) = \ln\left(\frac{p(y=1|x)}{1-p(y=1|x)}\right) = \theta^T x 对数几率=ln(p(y=0∣x)p(y=1∣x))=ln(1−p(y=1∣x)p(y=1∣x))=θTx

通俗理解 :几率 = p ( y = 1 ∣ x ) p ( y = 0 ∣ x ) \frac{p(y=1|x)}{p(y=0|x)} p(y=0∣x)p(y=1∣x)(正类概率与负类概率的比值),对数几率 = ln ⁡ ( 几率 ) \ln(\text{几率}) ln(几率),逻辑回归假设:对数几率是特征的线性组合

例子

假设 p ( y = 1 ∣ x ) = 0.75 p(y=1|x) = 0.75 p(y=1∣x)=0.75, p ( y = 0 ∣ x ) = 0.25 p(y=0|x) = 0.25 p(y=0∣x)=0.25:

  • 几率 = 0.75 / 0.25 = 3 0.75 / 0.25 = 3 0.75/0.25=3(正类概率是负类的3倍)
  • 对数几率 = ln ⁡ ( 3 ) ≈ 1.1 \ln(3) \approx 1.1 ln(3)≈1.1

逻辑回归假设: ln ⁡ ( 3 ) = θ T x \ln(3) = \theta^T x ln(3)=θTx(线性关系)

决策边界是线性的

决策边界:将不同类别分开的边界。

逻辑回归的决策规则:如果 p ( y = 1 ∣ x ) > 0.5 p(y=1|x) > 0.5 p(y=1∣x)>0.5,预测为正类;如果 p ( y = 1 ∣ x ) < 0.5 p(y=1|x) < 0.5 p(y=1∣x)<0.5,预测为负类;如果 p ( y = 1 ∣ x ) = 0.5 p(y=1|x) = 0.5 p(y=1∣x)=0.5,在决策边界上。

由于 p ( y = 1 ∣ x ) = σ ( θ T x ) p(y=1|x) = \sigma(\theta^T x) p(y=1∣x)=σ(θTx),当 p ( y = 1 ∣ x ) = 0.5 p(y=1|x) = 0.5 p(y=1∣x)=0.5 时: σ ( θ T x ) = 0.5 \sigma(\theta^T x) = 0.5 σ(θTx)=0.5, θ T x = 0 \theta^T x = 0 θTx=0(因为 σ ( 0 ) = 0.5 \sigma(0) = 0.5 σ(0)=0.5)。

结论 :决策边界是 θ T x = 0 \theta^T x = 0 θTx=0,这是一个线性边界(超平面)。

例子

假设有两个特征 x 1 x_1 x1 和 x 2 x_2 x2,参数 θ = [ θ 0 , θ 1 , θ 2 ] = [ − 1 , 2 , − 1 ] \theta = [\theta_0, \theta_1, \theta_2] = [-1, 2, -1] θ=[θ0,θ1,θ2]=[−1,2,−1]:

决策边界: − 1 + 2 x 1 − x 2 = 0 -1 + 2x_1 - x_2 = 0 −1+2x1−x2=0,即 x 2 = 2 x 1 − 1 x_2 = 2x_1 - 1 x2=2x1−1

这是一条直线,将特征空间分成两部分。

线性回归 vs 逻辑回归
特性 线性回归 逻辑回归
输出 连续值(任意实数) 概率值([0, 1])
目标 拟合数据的分布 拟合决策边界
函数 线性函数 Sigmoid函数(非线性)
对参数 线性 线性(对对数几率)
决策边界 无(回归问题) 线性边界

相同点 :都使用线性组合 θ T x \theta^T x θTx;都属于广义线性模型(GLM) ;都通过输入值 x x x 结合线性权重 θ \theta θ 来预测输出。

不同点:线性回归直接输出连续值;逻辑回归通过sigmoid函数输出概率,再转换为类别。

逻辑回归的特点

优点

  1. 直接对概率建模:不需要假设数据分布(区别于生成式模型如朴素贝叶斯),避免了分布假设不准确带来的问题。

  2. 输出概率值:不仅给出类别,还给出概率,对需要概率辅助决策的任务很有用(如医疗诊断、风险控制)。

  3. 计算效率高:梯度计算可以并行化,训练和预测速度快。

  4. 可解释性强 :参数 θ \theta θ 有明确的含义(每个特征的影响程度),可以分析哪些特征最重要。

缺点

  1. 特征缺失或特征空间很大时表现不好:需要特征工程,可以使用正则化处理。

  2. 只能处理线性决策边界:对于非线性问题,需要特征变换(如多项式特征)。

  3. 对异常值敏感:可以使用正则化或鲁棒损失函数。

适用场景:二分类问题(可以扩展到多分类);需要概率输出的场景;特征数量适中的问题;需要可解释性的场景。

实际应用:垃圾邮件分类;医疗诊断(疾病预测);金融风控(信用评分);广告点击率预测。

相关推荐
LplLpl116 小时前
AI 算法竞赛通关指南:基于深度学习的图像分类模型优化实战
大数据·人工智能·机器学习
Promise4856 小时前
贝尔曼公式的迭代求解笔记
笔记·算法
python机器学习建模6 小时前
22篇经典金融风控论文复现(2025年11月更新)
人工智能·机器学习·论文·期刊·金融风控
yLDeveloper7 小时前
一只菜鸟学机器学习的日记:入门深度学习计算
机器学习·dive into deep learning
福尔摩斯张7 小时前
Linux进程间通信(IPC)机制深度解析与实践指南
linux·运维·服务器·数据结构·c++·算法
你好~每一天7 小时前
未来3年,最值得拿下的5个AI证书!
数据结构·人工智能·算法·sqlite·hbase·散列表·模拟退火算法
杰克尼7 小时前
3. 分巧克力
java·数据结构·算法
zmzb01038 小时前
C++课后习题训练记录Day39
数据结构·c++·算法
修一呀8 小时前
【企业级对话处理】自动估计说话人数 + 声纹聚类 + ASR 转写(FunASR + ModelScope + ClearVoice)
机器学习·数据挖掘·聚类