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

【深度学习-Day 10】机器学习基石:从零入门线性回归与逻辑回归

Langchain系列文章目录

01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!
07-【深度解析】从GPT-1到GPT-4:ChatGPT背后的核心原理全揭秘
08-【万字长文】MCP深度解析:打通AI与世界的“USB-C”,模型上下文协议原理、实践与未来

Python系列文章目录

PyTorch系列文章目录

机器学习系列文章目录

深度学习系列文章目录

Java系列文章目录

JavaScript系列文章目录

深度学习系列文章目录

01-【深度学习-Day 1】为什么深度学习是未来?一探究竟AI、ML、DL关系与应用
02-【深度学习-Day 2】图解线性代数:从标量到张量,理解深度学习的数据表示与运算
03-【深度学习-Day 3】搞懂微积分关键:导数、偏导数、链式法则与梯度详解
04-【深度学习-Day 4】掌握深度学习的“概率”视角:基础概念与应用解析
05-【深度学习-Day 5】Python 快速入门:深度学习的“瑞士军刀”实战指南
06-【深度学习-Day 6】掌握 NumPy:ndarray 创建、索引、运算与性能优化指南
07-【深度学习-Day 7】精通Pandas:从Series、DataFrame入门到数据清洗实战
08-【深度学习-Day 8】让数据说话:Python 可视化双雄 Matplotlib 与 Seaborn 教程
09-【深度学习-Day 9】机器学习核心概念入门:监督、无监督与强化学习全解析
10-【深度学习-Day 10】机器学习基石:从零入门线性回归与逻辑回归


文章目录

  • Langchain系列文章目录
  • Python系列文章目录
  • PyTorch系列文章目录
  • 机器学习系列文章目录
  • 深度学习系列文章目录
  • Java系列文章目录
  • JavaScript系列文章目录
  • 深度学习系列文章目录
  • 前言
  • 一、线性回归 (Linear Regression)
    • 1.1 什么是线性回归?
      • 1.1.1 概念解析
      • 1.1.2 适用场景
    • 1.2 线性回归模型
      • 1.2.1 数学表达式
    • 1.3 损失函数:均方误差 (Loss Function: Mean Squared Error - MSE)
      • 1.3.1 为什么需要损失函数?
      • 1.3.2 MSE 的定义与公式
      • 1.3.3 MSE 的意义
    • 1.4 实践:简单线性回归示例 (Python & Scikit-learn)
      • 1.4.1 数据准备
      • 1.4.2 使用 Scikit-learn 实现
      • 1.4.3 结果解读与可视化
  • 二、逻辑回归 (Logistic Regression)
    • 2.1 什么是逻辑回归?
      • 2.1.1 概念解析
      • 2.1.2 适用场景
    • 2.2 Sigmoid 函数
      • 2.2.1 为什么需要 Sigmoid 函数?
      • 2.2.2 Sigmoid 函数的定义与图像
      • 2.2.3 Sigmoid 函数的特性
    • 2.3 逻辑回归模型
      • 2.3.1 数学表达式
      • 2.3.2 决策边界 (Decision Boundary)
    • 2.4 损失函数:交叉熵 (Cross-Entropy)
      • 2.4.1 为什么不用 MSE?
      • 2.4.2 交叉熵的定义与公式
      • 2.4.3 交叉熵的意义
    • 2.5 实践:简单逻辑回归示例 (Python & Scikit-learn)
      • 2.5.1 数据准备
      • 2.5.2 使用 Scikit-learn 实现
      • 2.5.3 结果解读与可视化
  • 三、模型训练的基本流程 (概念引入)
    • 3.1 概览
    • 3.2 前向传播 (Forward Propagation)
      • 3.2.1 概念
      • 3.2.2 示例
    • 3.3 计算损失 (Calculate Loss)
      • 3.3.1 概念
      • 3.3.2 重要性
    • 3.4 反向传播 (Backward Propagation - 概念引入)
      • 3.4.1 概念引入
      • 3.4.2 梯度的角色
    • 3.5 参数更新 (Parameter Update - 概念引入)
      • 3.5.1 概念引入
      • 3.5.2 学习率的重要性
  • 四、目标:为理解神经网络打下基础
    • 4.1 线性回归/逻辑回归与神经网络的联系
      • 4.1.1 单个神经元
      • 4.1.2 构建模块
    • 4.2 为什么这些基础很重要?
      • 4.2.1 理解核心机制
      • 4.2.2 解决实际问题
  • 五、总结


前言

在上一篇【深度学习-Day 9】机器学习基础(一) - 核心概念中,我们初步踏入了机器学习的大门,了解了其基本定义、分类以及像特征、标签、数据集划分等核心术语。今天,我们将继续深入,学习两种基础且非常重要的机器学习模型:线性回归 (Linear Regression)逻辑回归 (Logistic Regression)。理解它们不仅能帮助我们解决实际问题,更是我们后续理解复杂神经网络如何“学习”的关键一步。本文将带你详细解析这两种模型的概念、核心原理、损失函数,并通过Scikit-learn进行实战演练,最后为你揭示模型训练的基本流程。

一、线性回归 (Linear Regression)

线性回归可以说是机器学习中最简单、最直观的模型之一。它的目标是找到一个线性关系,用以描述输入特征和一个连续的输出变量之间的关系。

1.1 什么是线性回归?

1.1.1 概念解析

线性回归假设输入特征 x x x 和输出 y y y 之间存在线性关系。也就是说,我们可以用一条直线(在二维空间中)或一个平面(在三维空间中)或一个超平面(更高维度)来拟合数据。简单来说,就是试图找到一条“最佳拟合直线”,使得这条直线尽可能地贴近所有数据点。

类比: 就像我们想预测房屋的价格(连续输出 y y y,可能会考虑房屋的面积(输入特征 x x x。线性回归会尝试找到一个公式,比如: 价格 = 某个系数 × 面积 + 一个常数 \text{价格} = \text{某个系数} \times \text{面积} + \text{一个常数} 价格=某个系数×面积+一个常数,来描述这种关系。

1.1.2 适用场景

线性回归主要用于预测连续值输出的问题,例如:

  • 房价预测:根据房屋面积、卧室数量、地理位置等预测房价。
  • 销售额预测:根据广告投入、市场活动等预测产品销售额。
  • 股票价格预测:根据历史股价、公司业绩等预测未来股价(虽然实际中股票预测非常复杂,线性模型是基础尝试)。
  • 温度预测:根据海拔、季节等预测气温。

1.2 线性回归模型

1.2.1 数学表达式

对于一个拥有 n n n 个特征的数据点,线性回归模型的数学表达式可以写为:
y ^ = w 1 x 1 + w 2 x 2 + ⋯ + w n x n + b \hat{y} = w_1x_1 + w_2x_2 + \dots + w_nx_n + b y^=w1x1+w2x2++wnxn+b
其中:

  • y ^ \hat{y} y^ (读作 “y-hat”) 是模型的预测值。
  • x 1 , x 2 , … , x n x_1, x_2, \dots, x_n x1,x2,,xn 是输入特征。
  • w 1 , w 2 , … , w n w_1, w_2, \dots, w_n w1,w2,,wn 是模型的权重 (weights),表示每个特征对预测结果的贡献程度。
  • b b b偏置项 (bias),可以理解为当所有输入特征都为0时,模型的基线预测值。

如果使用向量表示,可以简化为:
y ^ = W T X + b \hat{y} = W^T X + b y^=WTX+b
其中 W = [ w 1 , w 2 , … , w n ] T W = [w_1, w_2, \dots, w_n]^T W=[w1,w2,,wn]T 是权重向量, X = [ x 1 , x 2 , … , x n ] T X = [x_1, x_2, \dots, x_n]^T X=[x1,x2,,xn]T 是特征向量。

为了入门,我们先看最简单的一元线性回归,它只有一个输入特征 x x x
y ^ = w x + b \hat{y} = wx + b y^=wx+b
这里的 w w w 就是直线的斜率, b b b 就是截距。

1.3 损失函数:均方误差 (Loss Function: Mean Squared Error - MSE)

1.3.1 为什么需要损失函数?

模型 ( y ^ = w x + b ) (\hat{y} = wx + b) (y^=wx+b) 中的 w w w b b b 是未知的,我们需要一种方法来衡量模型预测的好坏,并指导我们如何调整 w w w b b b 来使模型更好。损失函数(Loss Function)就是用来量化模型预测值 y ^ \hat{y} y^ 与真实值 y y y 之间差异的。我们的目标是找到一组参数 w w w b b b,使得损失函数的值最小。

1.3.2 MSE 的定义与公式

对于线性回归,最常用的损失函数是均方误差 (Mean Squared Error, MSE)。它计算的是所有样本的预测误差的平方的平均值。
假设我们有 N N N 个训练样本,对于第 i i i 个样本 ( x ( i ) , y ( i ) ) (x^{(i)}, y^{(i)}) (x(i),y(i))

  • 真实值为 y ( i ) y^{(i)} y(i)
  • 模型预测值为 y ^ ( i ) = w x ( i ) + b \hat{y}^{(i)} = wx^{(i)} + b y^(i)=wx(i)+b

则 MSE 的计算公式为:
M S E = J ( w , b ) = 1 N ∑ i = 1 N ( y ( i ) − y ^ ( i ) ) 2 MSE = J(w,b) = \frac{1}{N} \sum_{i=1}^{N} (y^{(i)} - \hat{y}^{(i)})^2 MSE=J(w,b)=N1i=1N(y(i)y^(i))2
或者写成:
M S E = J ( w , b ) = 1 N ∑ i = 1 N ( y ( i ) − ( w x ( i ) + b ) ) 2 MSE = J(w,b) = \frac{1}{N} \sum_{i=1}^{N} (y^{(i)} - (wx^{(i)} + b))^2 MSE=J(w,b)=N1i=1N(y(i)(wx(i)+b))2
公式解读:

  • ( y ( i ) − y ^ ( i ) ) (y^{(i)} - \hat{y}^{(i)}) (y(i)y^(i)):计算每个样本的预测值与真实值之间的差(误差)。
  • ( y ( i ) − y ^ ( i ) ) 2 (y^{(i)} - \hat{y}^{(i)})^2 (y(i)y^(i))2:对误差进行平方。这样做有两个好处:
    1. 避免正负误差相互抵消。
    2. 对较大的误差给予更大的惩罚。
  • ∑ i = 1 N … \sum_{i=1}^{N} \dots i=1N:将所有样本的平方误差加起来。
  • 1 N … \frac{1}{N} \dots N1:取平均值,使得损失函数的值与样本数量无关。

1.3.3 MSE 的意义

MSE 的值越小,说明模型的预测值与真实值的整体差异越小,模型的拟合效果就越好。我们的训练目标就是找到使 MSE 最小的 w w w b b b

1.4 实践:简单线性回归示例 (Python & Scikit-learn)

下面我们用 Python 和强大的机器学习库 Scikit-learn 来实现一个简单的线性回归。

1.4.1 数据准备

我们先手动创建一组简单的数据。假设我们有一些数据点,代表学习小时数和对应的考试分数。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error# 示例数据: (学习小时数, 考试分数)
X_train = np.array([1, 2, 3, 4, 5, 6, 7, 8]).reshape(-1, 1) # 输入特征,需要是二维数组
y_train = np.array([50, 55, 65, 70, 72, 80, 85, 90])         # 对应的输出(标签)print("输入特征 X_train (学习小时数):\n", X_train)
print("输出标签 y_train (考试分数):\n", y_train)

1.4.2 使用 Scikit-learn 实现

Scikit-learn 使得实现线性回归非常简单。

# 1. 创建线性回归模型实例
model = LinearRegression()# 2. 训练模型 (拟合数据)
#    模型会尝试找到最佳的 w 和 b 来最小化 MSE
model.fit(X_train, y_train)# 3. 查看模型参数
w = model.coef_[0]  # 权重 w (斜率)
b = model.intercept_ # 偏置 b (截距)
print(f"\n学习到的模型参数:")
print(f"权重 (w): {w:.2f}")
print(f"偏置 (b): {b:.2f}")# 4. 进行预测
#    假设我们想预测学习 5.5 小时的分数
X_new = np.array([[5.5]]) # 注意输入也需要是二维数组
y_pred_new = model.predict(X_new)
print(f"\n学习 5.5 小时,预测分数: {y_pred_new[0]:.2f}")# 对训练数据进行预测,用于计算MSE和可视化
y_pred_train = model.predict(X_train)# 5. 评估模型 (计算MSE)
mse = mean_squared_error(y_train, y_pred_train)
print(f"在训练集上的均方误差 (MSE): {mse:.2f}")

1.4.3 结果解读与可视化

# 可视化结果
plt.figure(figsize=(8, 6))
plt.scatter(X_train, y_train, color='blue', label='实际数据点') # 原始数据点
plt.plot(X_train, y_pred_train, color='red', linewidth=2, label='线性回归拟合线') # 拟合的直线
plt.scatter(X_new, y_pred_new, color='green', s=100, label='新数据点预测', marker='*') # 预测的新点
plt.xlabel("学习小时数")
plt.ylabel("考试分数")
plt.title("简单线性回归示例")
plt.legend()
plt.grid(True)
plt.show()print(f"\n从图上可以看出,模型拟合出了一条直线 y = {w:.2f}x + {b:.2f} 来描述学习小时数和考试分数的关系。")

这段代码会输出学习到的权重 w w w 和偏置 b b b,以及对新数据点的预测值和在训练集上的MSE。可视化图会清晰地展示原始数据点和模型拟合出的直线。

二、逻辑回归 (Logistic Regression)

虽然名字里有“回归”,但逻辑回归实际上是一种非常流行的分类算法。它用于预测一个离散的类别标签,例如判断一封邮件是否为垃圾邮件(是/否),或者一个肿瘤是良性还是恶性。

2.1 什么是逻辑回归?

2.1.1 概念解析

逻辑回归通过一个特殊的函数(Sigmoid 函数)将线性回归的输出结果映射到 ( 0 , 1 ) (0, 1) (0,1) 的区间内,这个值可以被解释为属于某个类别的概率。然后,通过设定一个阈值(例如0.5),将概率转化为类别预测。

类比: 假设我们想预测一个学生是否能通过考试(类别:通过/不通过),我们可以根据学生的学习时间(输入特征)。逻辑回归会输出一个概率值,比如学习5小时通过考试的概率是0.7。如果我们将阈值设为0.5,那么因为0.7 > 0.5,模型会预测该学生“通过”考试。

2.1.2 适用场景

逻辑回归主要用于二分类问题,也可以扩展到多分类问题。常见应用有:

  • 垃圾邮件检测:判断邮件是垃圾邮件还是非垃圾邮件。
  • 疾病预测:根据病人的生理指标判断是否患有某种疾病。
  • 用户点击率预测:预测用户是否会点击某个广告。
  • 信用评分:评估个人信用风险,判断是否会违约。

2.2 Sigmoid 函数

2.2.1 为什么需要 Sigmoid 函数?

线性回归的输出 y ^ = W X + b \hat{y} = WX + b y^=WX+b 可以是任意实数,而分类问题需要的是一个概率值,范围在 [ 0 , 1 ] [0, 1] [0,1] 之间。Sigmoid 函数(也称 Logistic 函数)正好能实现这个转换,它可以将任意实数输入“挤压”到 ( 0 , 1 ) (0, 1) (0,1) 区间。

2.2.2 Sigmoid 函数的定义与图像

Sigmoid 函数的数学表达式为:
σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+ez1
其中 z z z 通常是线性组合的结果,即 z = W X + b z = WX + b z=WX+b

图像: Sigmoid 函数的图像呈 “S” 形:

def sigmoid(z):return 1 / (1 + np.exp(-z))z_values = np.linspace(-10, 10, 200)
sigma_values = sigmoid(z_values)plt.figure(figsize=(8, 5))
plt.plot(z_values, sigma_values, label=r'$\sigma(z) = \frac{1}{1 + e^{-z}}$')
plt.title('Sigmoid (Logistic) 函数图像')
plt.xlabel('z')
plt.ylabel(r'$\sigma(z)$')
plt.axhline(0.5, color='red', linestyle='--', label='y = 0.5')
plt.axhline(0, color='gray', linestyle=':')
plt.axhline(1, color='gray', linestyle=':')
plt.yticks([0, 0.5, 1.0])
plt.grid(True)
plt.legend()
plt.show()

图示说明:
从 Sigmoid 函数的图像可以看出:

  • z z z 趋向于 + ∞ +\infty + 时, σ ( z ) \sigma(z) σ(z) 趋向于 1。
  • z z z 趋向于 − ∞ -\infty 时, σ ( z ) \sigma(z) σ(z) 趋向于 0。
  • z = 0 z = 0 z=0 时, σ ( z ) = 0.5 \sigma(z) = 0.5 σ(z)=0.5

2.2.3 Sigmoid 函数的特性

  • 输出范围: ( 0 , 1 ) (0, 1) (0,1),完美契合概率的定义。
  • 单调连续: 易于求导,这在梯度下降等优化算法中非常重要。

2.3 逻辑回归模型

2.3.1 数学表达式

逻辑回归模型首先计算输入特征的线性组合 z = W X + b z = WX + b z=WX+b,然后将结果 z z z 输入到 Sigmoid 函数中,得到预测概率 p ^ \hat{p} p^:
p ^ = σ ( z ) = σ ( W X + b ) = 1 1 + e − ( W X + b ) \hat{p} = \sigma(z) = \sigma(WX + b) = \frac{1}{1 + e^{-(WX + b)}} p^=σ(z)=σ(WX+b)=1+e(WX+b)1
p ^ \hat{p} p^ 表示样本属于正类(通常用标签1表示)的概率。那么,样本属于负类(标签0)的概率就是 1 − p ^ 1 - \hat{p} 1p^

2.3.2 决策边界 (Decision Boundary)

得到概率 p ^ \hat{p} p^ 后,我们需要一个决策规则来将其转换为类别预测。通常,我们会选择一个阈值 (threshold),比如 0.5。

  • 如果 p ^ ≥ 0.5 \hat{p} \ge 0.5 p^0.5,则预测为正类 (1)。
  • 如果 p ^ < 0.5 \hat{p} < 0.5 p^<0.5,则预测为负类 (0)。

p ^ = 0.5 \hat{p} = 0.5 p^=0.5 时, σ ( z ) = 0.5 \sigma(z) = 0.5 σ(z)=0.5,这意味着 z = W X + b = 0 z = WX + b = 0 z=WX+b=0。这个方程 W X + b = 0 WX + b = 0 WX+b=0 就定义了决策边界

  • 对于一元逻辑回归(一个特征 x 1 x_1 x1),决策边界是一个点: w 1 x 1 + b = 0 ⇒ x 1 = − b / w 1 w_1x_1 + b = 0 \Rightarrow x_1 = -b/w_1 w1x1+b=0x1=b/w1
  • 对于二元逻辑回归(两个特征 x 1 , x 2 x_1, x_2 x1,x2),决策边界是一条直线: w 1 x 1 + w 2 x 2 + b = 0 w_1x_1 + w_2x_2 + b = 0 w1x1+w2x2+b=0
  • 对于更高维度,决策边界是一个超平面。

2.4 损失函数:交叉熵 (Cross-Entropy)

2.4.1 为什么不用 MSE?

如果将逻辑回归的 Sigmoid 输出直接用于 MSE 损失函数,即 KaTeX parse error: Expected 'EOF', got '_' at position 35: …sum (\text{true_̲label} - \sigma…,那么这个损失函数相对于参数 W W W b b b 将是一个非凸函数 (non-convex function)。非凸函数有很多局部最小值,使用梯度下降法进行优化时很容易陷入局部最优解,而不是全局最优解。

2.4.2 交叉熵的定义与公式

为了解决这个问题,逻辑回归通常使用对数损失函数 (Log Loss),也称为二元交叉熵损失 (Binary Cross-Entropy Loss)
对于单个样本 ( x , y ) (x, y) (x,y),其中 y y y 是真实标签 (0 或 1), p ^ = σ ( W X + b ) \hat{p} = \sigma(WX+b) p^=σ(WX+b) 是模型预测该样本为正类 (1) 的概率:

  • 如果真实标签 y = 1 y = 1 y=1,我们希望预测概率 p ^ \hat{p} p^ 尽可能接近 1。损失项为 − log ⁡ ( p ^ ) -\log(\hat{p}) log(p^)。当 p ^ → 1 \hat{p} \to 1 p^1 时, − log ⁡ ( p ^ ) → 0 -\log(\hat{p}) \to 0 log(p^)0;当 p ^ → 0 \hat{p} \to 0 p^0 时, − log ⁡ ( p ^ ) → ∞ -\log(\hat{p}) \to \infty log(p^)
  • 如果真实标签 y = 0 y = 0 y=0,我们希望预测概率 p ^ \hat{p} p^ 尽可能接近 0,即 1 − p ^ 1-\hat{p} 1p^ 尽可能接近 1。损失项为 − log ⁡ ( 1 − p ^ ) -\log(1-\hat{p}) log(1p^)。当 p ^ → 0 \hat{p} \to 0 p^0 时 ( 1 − p ^ → 1 1-\hat{p} \to 1 1p^1), − log ⁡ ( 1 − p ^ ) → 0 -\log(1-\hat{p}) \to 0 log(1p^)0;当 p ^ → 1 \hat{p} \to 1 p^1 时 ( 1 − p ^ → 0 1-\hat{p} \to 0 1p^0), − log ⁡ ( 1 − p ^ ) → ∞ -\log(1-\hat{p}) \to \infty log(1p^)

将这两种情况合并,单个样本的交叉熵损失函数可以写为:
Cost ( p ^ , y ) = − [ y log ⁡ ( p ^ ) + ( 1 − y ) log ⁡ ( 1 − p ^ ) ] \text{Cost}(\hat{p}, y) = -[y \log(\hat{p}) + (1-y) \log(1-\hat{p})] Cost(p^,y)=[ylog(p^)+(1y)log(1p^)]
对于 N N N 个训练样本的整个数据集,平均交叉熵损失为:
J ( W , b ) = − 1 N ∑ i = 1 N [ y ( i ) log ⁡ ( p ^ ( i ) ) + ( 1 − y ( i ) ) log ⁡ ( 1 − p ^ ( i ) ) ] J(W,b) = -\frac{1}{N} \sum_{i=1}^{N} [y^{(i)} \log(\hat{p}^{(i)}) + (1-y^{(i)}) \log(1-\hat{p}^{(i)})] J(W,b)=N1i=1N[y(i)log(p^(i))+(1y(i))log(1p^(i))]
其中 p ^ ( i ) = σ ( W X ( i ) + b ) \hat{p}^{(i)} = \sigma(W X^{(i)} + b) p^(i)=σ(WX(i)+b)

2.4.3 交叉熵的意义

交叉熵损失函数是凸函数,这意味着它只有一个全局最小值,使用梯度下降等优化算法可以有效地找到最优参数。它能够很好地惩罚那些“自信的错误预测”(例如,真实标签是1,但模型预测概率接近0)。

2.5 实践:简单逻辑回归示例 (Python & Scikit-learn)

下面我们用 Python 和 Scikit-learn 来实现一个简单的二分类逻辑回归。

2.5.1 数据准备

我们使用 Scikit-learn 内置的 make_classification 函数生成一个简单的二分类数据集。

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report# 生成一个二分类数据集
X, y = make_classification(n_samples=200, n_features=2, n_informative=2, n_redundant=0,n_clusters_per_class=1, flip_y=0.1, random_state=42)# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)print("部分训练数据特征 X_train (前5个):\n", X_train[:5])
print("部分训练数据标签 y_train (前5个):\n", y_train[:5])

2.5.2 使用 Scikit-learn 实现

# 1. 创建逻辑回归模型实例
#    solver='liblinear' 适用于小型数据集,且是默认求解器之一
#    random_state 用于结果可复现
log_reg_model = LogisticRegression(solver='liblinear', random_state=42)# 2. 训练模型
log_reg_model.fit(X_train, y_train)# 3. 查看模型参数 (可选)
#    对于多特征,系数会多一些
print(f"\n学习到的模型系数 (W): {log_reg_model.coef_}")
print(f"学习到的模型截距 (b): {log_reg_model.intercept_}")# 4. 在测试集上进行预测
y_pred_test = log_reg_model.predict(X_test)
y_pred_proba_test = log_reg_model.predict_proba(X_test) # 获取预测概率print(f"\n部分测试集预测标签 (前5个): {y_pred_test[:5]}")
print(f"部分测试集预测概率 (前5个, [P(class 0), P(class 1)]):\n {y_pred_proba_test[:5]}")

2.5.3 结果解读与可视化

# 5. 评估模型
accuracy = accuracy_score(y_test, y_pred_test)
conf_matrix = confusion_matrix(y_test, y_pred_test)
class_report = classification_report(y_test, y_pred_test)print(f"\n模型在测试集上的准确率 (Accuracy): {accuracy:.4f}")
print(f"\n混淆矩阵 (Confusion Matrix):\n{conf_matrix}")
print(f"\n分类报告 (Classification Report):\n{class_report}")# 可视化决策边界 (仅适用于2个特征的情况)
plt.figure(figsize=(10, 6))# 绘制数据点
plt.scatter(X_test[y_test == 0][:, 0], X_test[y_test == 0][:, 1], color='blue', marker='o', label='类别 0 (实际)')
plt.scatter(X_test[y_test == 1][:, 0], X_test[y_test == 1][:, 1], color='red', marker='x', label='类别 1 (实际)')# 绘制决策边界
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()# 创建网格来评估模型
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 100),np.linspace(ylim[0], ylim[1], 100))
Z = log_reg_model.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1]
Z = Z.reshape(xx.shape)# 绘制等高线图(决策边界是P=0.5的地方)
plt.contourf(xx, yy, Z, levels=[0, 0.5, 1], alpha=0.3, colors=['blue', 'red']) # 填充区域
plt.contour(xx, yy, Z, levels=[0.5], colors='green', linewidths=2) # 决策边界线plt.title('逻辑回归决策边界示例 (测试集)')
plt.xlabel('特征 1')
plt.ylabel('特征 2')
plt.legend(loc='best')
plt.grid(True)
plt.show()

这段代码会输出模型在测试集上的准确率、混淆矩阵和分类报告。对于二维特征数据,它还会绘制出数据点以及学习到的决策边界。

三、模型训练的基本流程 (概念引入)

无论是线性回归、逻辑回归,还是未来我们将学习的更复杂的神经网络,它们“学习”或“训练”的过程都遵循一个相似的基本流程。这里我们先从概念上理解这个流程。

3.1 概览

模型训练是一个迭代的过程,目标是找到一组最优的模型参数(比如线性回归中的 w w w b b b),使得损失函数的值最小。

3.2 前向传播 (Forward Propagation)

3.2.1 概念

前向传播是指将输入数据从模型的输入层开始,逐层通过模型(如果有多层的话),直到产生输出(即预测值)的过程。

  • 对于线性回归: 输入 X X X 经过 $ \hat{y} = WX + b $ 得到预测值 y ^ \hat{y} y^
  • 对于逻辑回归: 输入 X X X 经过 $ z = WX + b $,然后 $ \hat{p} = \sigma(z) $ 得到预测概率 p ^ \hat{p} p^

3.2.2 示例

假设有一个样本 ( x 1 , x 2 ) (x_1, x_2) (x1,x2),当前模型参数为 w 1 , w 2 , b w_1, w_2, b w1,w2,b
在线性回归中,前向传播计算 y ^ = w 1 x 1 + w 2 x 2 + b \hat{y} = w_1x_1 + w_2x_2 + b y^=w1x1+w2x2+b
在逻辑回归中,前向传播计算 z = w 1 x 1 + w 2 x 2 + b z = w_1x_1 + w_2x_2 + b z=w1x1+w2x2+b,然后计算 p ^ = 1 1 + e − z \hat{p} = \frac{1}{1+e^{-z}} p^=1+ez1

3.3 计算损失 (Calculate Loss)

3.3.1 概念

在前向传播得到预测值后,我们会使用预先定义的损失函数来比较预测值和真实标签之间的差异。这个差异就是“损失”或“误差”。

3.3.2 重要性

损失值的大小直接反映了当前模型参数的好坏。损失越大,说明模型预测越不准确。我们的目标是调整参数,使得这个损失值尽可能小。

3.4 反向传播 (Backward Propagation - 概念引入)

3.4.1 概念引入

反向传播是模型学习的核心机制之一。简单来说,它是将前向传播计算出的损失(误差)从输出层反向传播回模型的每一层(或每个参数),以计算出每个参数对总损失的“贡献程度”或者说“责任”。这个“贡献程度”是通过计算损失函数关于每个参数的梯度 (gradient) 来量化的。

梯度本质上是导数或偏导数,它指明了如果参数发生微小变动,损失函数会如何变化。

3.4.2 梯度的角色

梯度告诉我们参数应该往哪个方向调整才能使损失减小得最快。如果某个参数的梯度为正,说明增加该参数会使损失增加,因此我们应该减小该参数;反之亦然。

(注意:反向传播的详细数学推导,尤其是链式法则的应用,我们将在后续介绍神经网络时深入讲解。)

3.5 参数更新 (Parameter Update - 概念引入)

3.5.1 概念引入

得到每个参数的梯度后,我们就可以根据梯度来更新参数了。最常见的参数更新规则是梯度下降法 (Gradient Descent) 的变种。其基本思想是:参数沿着梯度的反方向进行调整,因为梯度的反方向是损失函数下降最快的方向。

更新公式可以简化为:
新参数 = 旧参数 − 学习率 × 梯度 \text{新参数} = \text{旧参数} - \text{学习率} \times \text{梯度} 新参数=旧参数学习率×梯度
例如,对于权重 w w w
w new = w old − α ∂ J ∂ w w_{\text{new}} = w_{\text{old}} - \alpha \frac{\partial J}{\partial w} wnew=woldαwJ
其中:

  • α \alpha α (alpha) 是学习率 (learning rate),它是一个超参数,控制每次参数更新的步长。
  • ∂ J ∂ w \frac{\partial J}{\partial w} wJ 是损失函数 J J J 关于参数 w w w 的梯度。

3.5.2 学习率的重要性

学习率的选择非常关键:

  • 学习率太小: 模型收敛速度会很慢,需要很多次迭代才能达到最优。
  • 学习率太大: 参数更新的步子迈得太大,可能会在最优解附近震荡甚至发散,导致无法收敛。

选择合适的学习率是训练模型中的一个重要技巧,我们会在后续的优化算法章节详细讨论。

整个训练流程就是不断重复“前向传播 -> 计算损失 -> 反向传播计算梯度 -> 更新参数”这个循环,直到模型的性能达到满意的水平或者满足其他停止条件。

四、目标:为理解神经网络打下基础

学习线性回归和逻辑回归不仅仅是为了掌握这两个模型本身,更重要的是它们为我们理解更复杂的深度学习模型(尤其是神经网络)奠定了坚实的基础。

4.1 线性回归/逻辑回归与神经网络的联系

4.1.1 单个神经元

实际上,神经网络中的一个神经元 (neuron) 的基本计算过程与逻辑回归(或者说线性变换后接一个激活函数)非常相似。
一个神经元接收多个输入,对这些输入进行加权求和(就像 W X + b WX+b WX+b),然后将结果通过一个激活函数 (activation function)(Sigmoid 就是一种激活函数)得到输出。

单个神经元 (类似逻辑回归单元)
W1
W2
1
z = WX+b
输出
Σ
输入1
输入2
偏置b
激活函数 σ
预测概率/值

所以,你可以把逻辑回归看作是一个非常简单的、只有一个神经元的神经网络。

4.1.2 构建模块

线性回归和逻辑回归中涉及的核心概念,如:

  • 参数(权重和偏置)
  • 前向传播
  • 损失函数
  • 梯度
  • 参数更新(梯度下降)
    这些都是构建和训练任何神经网络都不可或缺的组件。理解了这些简单模型是如何工作的,就能更容易地理解多层神经网络是如何堆叠这些基本单元并进行学习的。

4.2 为什么这些基础很重要?

4.2.1 理解核心机制

掌握线性回归和逻辑回归的原理,能帮助我们从根本上理解机器学习模型是如何从数据中“学习”模式的。这种理解对于后续调试更复杂的模型、选择合适的模型架构以及解释模型行为都至关重要。

4.2.2 解决实际问题

尽管简单,线性回归和逻辑回归在工业界仍然被广泛应用于许多场景,特别是当数据特征与输出之间的关系相对简单,或者对模型可解释性要求较高时。它们是快速搭建基线模型、验证想法的有力工具。

五、总结

在本篇文章中,我们深入探讨了两种基础的机器学习模型:

  1. 线性回归 (Linear Regression):

    • 目标: 预测连续值输出。
    • 模型: y ^ = W X + b \hat{y} = WX + b y^=WX+b
    • 损失函数: 均方误差 (MSE), J = 1 N ∑ ( y − y ^ ) 2 J = \frac{1}{N} \sum (y - \hat{y})^2 J=N1(yy^)2
    • 核心思想: 找到最佳拟合直线/平面来描述特征与输出间的线性关系。
  2. 逻辑回归 (Logistic Regression):

    • 目标: 进行二分类(或多分类)预测。
    • 模型: p ^ = σ ( W X + b ) = 1 1 + e − ( W X + b ) \hat{p} = \sigma(WX + b) = \frac{1}{1 + e^{-(WX+b)}} p^=σ(WX+b)=1+e(WX+b)1,使用 Sigmoid 函数将输出映射到 ( 0 , 1 ) (0,1) (0,1) 作为概率。
    • 损失函数: 二元交叉熵 (Binary Cross-Entropy), J = − 1 N ∑ [ y log ⁡ ( p ^ ) + ( 1 − y ) log ⁡ ( 1 − p ^ ) ] J = -\frac{1}{N} \sum [y \log(\hat{p}) + (1-y) \log(1-\hat{p})] J=N1[ylog(p^)+(1y)log(1p^)]
    • 核心思想: 找到一个决策边界来区分不同的类别。
  3. 模型训练的基本流程:

    • 初始化参数。
    • 前向传播: 根据当前参数计算预测值。
    • 计算损失: 使用损失函数评估预测的好坏。
    • 反向传播: 计算损失函数关于模型参数的梯度。
    • 参数更新: 根据梯度和学习率调整参数(如梯度下降法)。
    • 迭代: 重复以上步骤直至模型收敛或达到停止条件。

理解这些基础模型和训练流程,为我们后续学习神经网络(可以看作是这些简单模型的复杂堆叠和扩展)打下了坚实的基础。在下一篇文章中,我们可能会进行一个更完整的机器学习项目实战,或者开始初步探索神经网络的奥秘,敬请期待!


相关文章:

【深度学习-Day 10】机器学习基石:从零入门线性回归与逻辑回归

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

芯片:金线的作用

一、金线的核心作用&#xff1a;互联芯片与外部封装 金线&#xff08;Gold Wire&#xff09;在芯片制造中主要用于引线键合&#xff08;Wire Bonding&#xff09;&#xff0c;这是将芯片&#xff08;Die&#xff09;与外部封装引脚&#xff08;Lead Frame或Substrate&#xff…...

Vue3+uniapp 封装axios

1.第一步在项目根目录新建utils文件夹&#xff0c;里边新建两个文件request.js和uni-api-promisify.js 2.request.js 代码 要安装axios import axios from axios import { showToast } from /utils/uni-api-promisify// 创建axios实例 const service axios.create({baseURL:…...

Nacos源码—9.Nacos升级gRPC分析七

大纲 10.gRPC客户端初始化分析 11.gRPC客户端的心跳机制(健康检查) 12.gRPC服务端如何处理客户端的建立连接请求 13.gRPC服务端如何映射各种请求与对应的Handler处理类 14.gRPC简单介绍 10.gRPC客户端初始化分析 (1)gRPC客户端代理初始化的源码 (2)gRPC客户端启动的源码…...

与智能体高效协作:Kimi交互逻辑探索与提示词设计实践【附kimi提示词合集下载】

引言&#xff1a;智能时代的人机协作新范式 在持续使用多款AI助手完成技术文档分析、数据分析等任务后&#xff0c;我逐渐意识到工具效能的核心不仅在于技术参数&#xff0c;更在于使用者对交互逻辑的理解深度。本文将基于实际项目经验&#xff0c;探讨智能体交互的本质规律&a…...

Web 架构之负载均衡会话保持

文章目录 一、引言二、思维导图三、负载均衡会话保持的概念3.1 定义3.2 作用 四、负载均衡会话保持的实现方式4.1 基于 IP 地址原理代码示例&#xff08;以 Nginx 为例&#xff09;注释 4.2 基于 Cookie原理代码示例&#xff08;以 HAProxy 为例&#xff09;注释 4.3 基于 SSL …...

遨游卫星电话与普通手机有什么区别?

在数字化浪潮席卷全球的今天&#xff0c;通信设备的角色早已超越传统语音工具&#xff0c;成为连接物理世界与数字世界的核心枢纽。然而&#xff0c;当普通手机在都市丛林中游刃有余时&#xff0c;面对偏远地区、危险作业场景的应急通信需求&#xff0c;其局限性便显露无遗。遨…...

【Redis】谈谈Redis的设计

Redis&#xff08;Remote Dictionary Service&#xff09;是一个高性能的内存键值数据库&#xff0c;其设计核心是速度、简单性和灵活性。以下从架构、数据结构、持久化、网络模型等方面解析 Redis 的设计实现原理&#xff1a; 1. 核心设计思想 内存优先&#xff1a;数据主要存…...

聊天项目总结

目前项目 完成了个人信息修改&#xff0c;添加好友&#xff0c;创建群聊&#xff0c;添加群聊&#xff0c;在线状态&#xff0c;删除好友&#xff0c;退出群&#xff0c;解散群&#xff0c;好友申请&#xff0c;群资料修改&#xff0c;群管理&#xff0c;群主转让&#xff0c;…...

智能手表整机装配作业指导书(SOP)

&#x1f4c4; 智能手表整机装配作业指导书&#xff08;SOP&#xff09; 产品名称&#xff1a;Aurora Watch S1 产品型号&#xff1a;AWS1-BG22 版本号&#xff1a;SOP-AWS1-V1.0 编制日期&#xff1a;2025年5月6日 编制单位&#xff1a;制造工程部&#xff08;ME&#xff09;…...

c语言第一个小游戏:贪吃蛇小游戏05

贪吃蛇脱缰自动向右走&#xff1a;脱缰的野蛇 #include <curses.h> #include <stdlib.h> struct snake{ int hang; int lie; struct snake *next; }; struct snake *head; struct snake *tail; void initNcurse() { initscr(); keypad(stdscr,1); } int …...

ES6中的解构

在 JavaScript&#xff08;包括 TypeScript&#xff09;中&#xff0c;数组解构和对象解构是 ES6 引入的两个非常实用的语法特性&#xff0c;它们可以帮助我们更方便地从数组或对象中提取数据。 一、数组解构&#xff08;Array Destructuring&#xff09; &#x1f4cc; 基本用…...

Pycharm的终端执行allure命令出现command not found

Pycharm的接口自动化项目用的是venv虚拟环境&#xff0c;已下载和配置好Allure路径&#xff0c;查看Allure版本正常。 问题&#xff1a;在重新打开Pycham的项目时&#xff0c;在Pycharm终端中执行allure相关命令就会报错zsh: allure: command not found 原因&#xff1a;在PyC…...

[ctfshow web入门] web72

信息收集 下载index.php并查看&#xff0c;和上题差不多 error_reporting(0); ini_set(display_errors, 0); // 你们在炫技吗&#xff1f; if(isset($_POST[c])){$c $_POST[c];eval($c);$s ob_get_contents();ob_end_clean();echo preg_replace("/[0-9]|[a-z]/i",…...

【Folium】使用离线地图

文章目录 相关文献离线地图下载Folium 使用离线地图 相关文献 Folium — Folium 0.19.5 documentationOffline Map Maker 离线地图下载 我们使用 Offline Map Maker 进行地图下载。 特别注意&#xff1a;Folium 默认支持 WGS84 坐标系&#xff0c;建议下载 WGS84 坐标系的地…...

嵌入式自学第二十天(5.13)

&#xff08;1&#xff09;线性表顺序存储的优缺点&#xff1a; 优点&#xff1a;无需为表中逻辑关系添加额外存储空间&#xff1b; 可以快速随机访问元素&#xff0c;时间复杂度O(1)。 缺点&#xff1a;插入删除需要移动元素O(n&#xff09;&#xff1b; 无法动态存储。 …...

ThingsBoard3.9.1 MQTT Topic(4)

本章中的主题适用于网关设备。 1.网关订阅设备属性的topic&#xff1a;v1/gateway/attributes/response 订阅后接收到的响应格式。 { "id":3, "device":"m1", "values":{ "version":"V1.2"…...

centos中JDK_PATH 如何设置

在 CentOS 7.9 中设置 JDK_PATH&#xff08;即 JAVA_HOME&#xff09;的步骤如下。JAVA_HOME 是一个环境变量&#xff0c;用于指向 Java 开发工具包&#xff08;JDK&#xff09;的安装路径。 1. 查找 JDK 安装路径 首先&#xff0c;你需要找到 JDK 的安装路径。可以通过以下命…...

一次讲清 FP32 / FP16 / BF16 / INT8 / INT4

一次讲清 FP32 / FP16 / BF16 / INT8 / INT4 目标&#xff1a;让你3 分钟读懂格式原理&#xff0c;5 分钟学会选型。 只记一句&#xff1a;“指数定范围&#xff0c;尾数定精度&#xff1b;位宽定显存&#xff0c;硬件定成本”。 1 | 为什么要有这么多格式&#xff1f; …...

PH热榜 | 2025-05-13

1. FirstQuadrant 标语&#xff1a;通过以人为本的人工智能来最大化B2B销售 介绍&#xff1a;销售人工智能&#xff0c;帮助创始人和收益团队提高效率&#xff0c;保持组织有序&#xff0c;并促成更多交易。它通过简化销售幕后工作&#xff0c;确保每个细节都不会遗漏。 产品…...

java基础-泛型

文章目录 目录 文章目录 前言 一、泛型的作用 1.类型安全 2.通用性 这里再举个例子 二、泛型的实现 1.泛型类 2.泛型接口 3.泛型方法 4.T符号的起源&#xff08;额外&#xff09; 三、泛型擦除 四、泛型通配符 1.上界通配符&#xff08; &#xff09; 为什么用于…...

对抗帕金森:在疾病阴影下,如何重掌生活主动权?

帕金森病&#xff0c;一种影响全球超 1000 万人的神经退行性疾病&#xff0c;正无声地改变着患者的生活轨迹。随着大脑中多巴胺分泌减少&#xff0c;患者逐渐出现肢体震颤、肌肉僵硬、步态迟缓等症状&#xff0c;甚至连扣纽扣、端水杯这类日常动作都变得艰难。更棘手的是&#…...

网络协议与系统架构分析实战:工具与方法全解

网络协议与系统架构分析实战&#xff1a;工具与方法全解 在互联网系统的开发、运维与安全分析中&#xff0c;协议解析与抓包分析是不可或缺的核心技能。本文将系统梳理主流协议解析工具、协议自动识别方案&#xff0c;并结合实际抓包案例&#xff0c;讲解如何还原和推测底层系…...

使用PocketFlow构建Web Search Agent

前言 本文介绍的是PocketFlow的cookbook中的pocketflow-agent部分。 回顾一下PocketFlow的核心架构&#xff1a; 每一个节点的架构&#xff1a; 具体介绍可以看上一篇文章&#xff1a; “Pocket Flow&#xff0c;一个仅用 100 行代码实现的 LLM 框架” 实现效果 这个Web S…...

基于STM32、HAL库的TLV320AIC3204IRHBR音频接口芯片驱动程序设计

一、简介: ADAU1701JSTZ-RL 是一款高性能音频编解码器 (Codec),专为便携式和低功耗应用设计。它集成了 ADC、DAC、麦克风前置放大器、耳机放大器和数字信号处理功能,支持 I2S/PCM 音频接口和 I2C 控制接口,非常适合与 STM32 微控制器配合使用。 二、硬件接口: 典型的 ST…...

轻量级高性能推理引擎MNN 学习笔记 02.MNN主要API

1. MNN 主要API 注意&#xff1a;本学习笔记只介绍了我在学习过程中常用的API &#xff0c;更多MNN API 请参考官方文档。 1.1. 推理时操作流程 创建Interpreter &#xff1a; createFromFile()通过Interpreter创建Session &#xff1a;createSession()设置输入数据: getSes…...

STM32 ADC 模数转换器详解:原理、配置与应用

STM32 ADC 模数转换器详解&#xff1a;原理、配置与应用 在嵌入式系统中&#xff0c;模数转换&#xff08;ADC&#xff09;是实现传感器信号采集、信号处理等任务的关键环节。STM32 微控制器作为一款功能强大的 32 位微控制器&#xff0c;其内置的 ADC 模块为开发者提供了高效…...

18.Excel数据透视表:第1部分创建数据透视表

一 什么是数据透视表 通过万花筒可以用不同的方式査看里面画面图像&#xff0c;在excel中可以将数据透视表看作是对准数据的万花筒&#xff0c;用不同角度去观察数据&#xff0c;也可以旋转数据&#xff0c;对数据进行重新排列&#xff0c;对大量的数据可以快速的汇总和建立交叉…...

AI 模型训练轻量化技术在军事领域的实战应用与技术解析

AI 模型训练轻量化技术在军事领域的实战应用与技术解析 一、引言 在人工智能与军事领域深度融合的当下&#xff0c;AI 模型训练轻量化技术正成为破解战场资源限制的关键钥匙。通过模型压缩、量化、剪枝等核心技术&#xff0c;轻量化模型在算力受限、通信不稳定的复杂战场环境中…...

科学养生,开启健康生活

在快节奏的现代生活中&#xff0c;健康养生成为人们关注的焦点。科学合理的养生方式&#xff0c;无需依赖传统医学理论&#xff0c;也能有效提升生活质量&#xff0c;为身体注入活力。​ 均衡饮食是养生的基础。每天应保证摄入足够的蛋白质、碳水化合物和脂肪&#xff0c;同时…...

高效跨平台文件传输与管理的工具

软件介绍 这款名为 Coolmuster Mobile Transfer 的工具是一款多平台支持的文件传输工具&#xff0c;能高效地在不同设备间进行文件传输与管理。 适用场景 它适用于多种场景&#xff0c;无论是个人文件整理、家庭成员间资料共享&#xff0c;还是企业场景下的工作文件处理&…...

如何优化 Linux 服务器的磁盘 I/O 性能

# 优化 Linux 服务器磁盘 I/O 性能的全面指南 ## 1. 识别 I/O 瓶颈 首先确定是否存在 I/O 瓶颈以及瓶颈位置&#xff1a; bash # 使用 iostat 查看磁盘 I/O 统计 iostat -x 1 # 使用 iotop 查看进程级 I/O 使用情况 iotop # 使用 vmstat 查看系统整体 I/O 情况 vmstat 1 …...

Python基础学习-Day23

目录 基础概念转换器&#xff08;transformer&#xff09;估计器&#xff08;estimator&#xff09;管道&#xff08;pipeline&#xff09; 实例pipeline 基础概念 pipeline在机器学习领域可以翻译为“管道”&#xff0c;也可以翻译为“流水线”&#xff0c;是机器学习中一个重…...

【Ubuntu】扩充磁盘大小

sudo apt-get install gparted 安装完成后&#xff0c;搜索gparted软件&#xff0c;打开gparted 参考...

数据治理域——日志数据采集设计

摘要 本文主要介绍了Web页面端日志采集的设计。首先阐述了页面浏览日志采集&#xff0c;包括客户端日志采集的实现方式、采集内容及技术亮点。接着介绍了无线客户端端日志采集&#xff0c;包括UserTrack的核心设计、移动端与浏览器端采集差异以及典型应用场景崩溃分析。最后探…...

Dinky 安装部署并配置提交 Flink Yarn 任务

官方文档 https://www.dinky.org.cn/docs/1.1/deploy_guide/normal_deploy 版本 dinky 1.1.0、1.2.3 当前最新发布版本为 1.2.3 &#xff0c;但是官方文档最新稳定版为 1.1 &#xff0c;所以先选择 1.1.0&#xff0c;验证通过后&#xff0c;再尝试 1.2.3 &#xff0c;发现 1…...

杰理-701-手表sdk无法电脑连接经典蓝牙

杰理-701-手表sdk无法电脑连接经典蓝牙 只有手机可以连接经典蓝牙播放音乐&#xff0c;电脑无法连接&#xff0c;需要关闭emitter功能 交流q群&#xff1a;187115320...

Timsort 算法

文章目录 1 基础理解1.1 定义和原理1.2 工作原理 2 算法实现2.1 Python 代码实现2.1.1 代码2.1.2 核心逻辑计算最小运行长度&#xff08;calc_min_run(n)&#xff09;插入排序&#xff08;insertion_sort(arr, left, right)&#xff09; 2.2 Java 代码实现2.3 C 代码实现 3 逻辑…...

Go构建高并发权重抽奖系统:从设计到优化全流程指南

引言&#xff1a;为何需要专业抽奖系统&#xff1f; 在现代互联网应用中&#xff0c;抽奖系统被广泛用于营销活动、用户激励等场景。一个好的抽奖系统需要满足&#xff1a; 公平性&#xff1a;确保概率分布准确高性能&#xff1a;支持高并发抽奖请求安全性&#xff1a;防止作…...

深度学习计算

深度学习的飞速发展离不开强大的计算能力支撑。从张量计算到 GPU 加速&#xff0c;从自动微分到分布式计算&#xff0c;深度学习计算的每一项技术都如同精密仪器中的关键齿轮&#xff0c;推动着模型性能的不断提升。本文深入剖析深度学习计算的核心技术、优化策略以及前沿趋势&…...

【Bluedroid】蓝牙 HID DEVICE 初始化流程源码解析

本文深入剖析Android蓝牙协议栈中HID设备&#xff08;BT-HD&#xff09;服务的初始化与启用流程&#xff0c;从接口初始化、服务掩码管理、服务请求路由到属性回调通知&#xff0c;完整展现蓝牙HID服务激活的技术路径。通过代码逻辑梳理&#xff0c;揭示服务启用的核心机制&…...

Kotlin 中的 Unit 类型的作用以及 Java 中 Void 的区别

在 Kotlin 中&#xff0c;Unit 类型和 Java 中的 void 关键字都用于表示“没有返回值”的函数&#xff0c;但它们在设计理念、类型系统和实际使用中有显著的区别。 1 Kotlin 中的 Unit 类型 表示无返回值&#xff1a; 当函数不返回有意义的值时&#xff0c;Kotlin 使用 Unit …...

Gemini 2.5 推动视频理解进入新时代

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Spark Streaming 内部运行机制详解

核心思想&#xff1a;将实时数据流切割为“微批次”&#xff0c;利用 Spark Core 的批处理能力进行准实时计算。 1. 核心流程拆解 数据接收&#xff08;Input Data Stream&#xff09; 输入源&#xff1a;Kafka、Flume、Socket 等实时数据流。 接收器&#xff08;Receiver&…...

Feign+Resilience4j实现微服务熔断机制:原理与实战

引言&#xff1a;为什么需要熔断器&#xff1f; 在微服务架构中&#xff0c;服务间的依赖调用变得非常普遍。想象一下这样的场景&#xff1a;订单服务依赖支付服务&#xff0c;支付服务又依赖银行网关服务。如果银行网关服务出现故障&#xff0c;故障会向上蔓延&#xff0c;导…...

什么是SparkONYarn模式

1. 什么是 Spark on YARN&#xff1f; Spark on YARN 是 Apache Spark 的一种部署模式&#xff0c;允许 Spark 应用程序在 Hadoop YARN 集群上运行&#xff0c;充分利用 YARN 的资源管理和调度能力。这种模式将 Spark 与 Hadoop 生态深度集成&#xff0c;使企业能够在同一集群…...

鸿蒙北向应用开发: deveco5.0 创建开源鸿蒙项目

本地已经安装deveco5.0 使用5.0创建开源鸿蒙项目 文件->新建->新建项目 直接创建空项目,一路默认 next 直接编译项目 直接连接开源鸿蒙5.0开发板编译会提示 compatibleSdkVersion and releaseType of the app do not match the apiVersion and releaseType on the dev…...

操作系统:内存管理

目录 1、主要目标 2、核心概念和技术 2.1 物理内存与虚拟内存 2.2 内存分页机制 2.3 页面置换算法 3、监控与性能优化 3.1 查看物理内存 3.2 查看虚拟内存 3.3 性能问题 1> 内存不足&#xff08;OOM&#xff09; 2> 内存泄漏 3> 内存碎片 3.4 性能优化策…...

腾讯优化DeepSeek的DeepEP通信框架:开启AI大模型训练新时代

事件背景 在人工智能&#xff08;AI&#xff09;技术迅猛发展的当下&#xff0c;大规模AI模型训练的需求与日俱增。高效的数据通信成为了提升AI模型训练效率的关键环节。混合专家模型&#xff08;MoE&#xff09;作为一种高效的大模型架构&#xff0c;通过动态分配专家网络处理…...

CSP-J普及组第一轮真题单选题专项训练(二)

CSP-J普及组第一轮真题单选题专项训练(二) (共15题,每2分,共30分;每题有且有一个正确选项) 1、一个 32 位整型变量占用()个字节。 A. 32 B. 128 C. 4 D. 8 2、在内存储器中每个存储单元都被赋予一个唯一的序号,称为 A、下标 B、序号 C、地址 D、编号 3、编译器的主要…...