支持向量机入门指南:从原理到实践

news2024/12/27 5:58:45

目录

1 支持向量机的基本概念

1.2 数学表达

2 间隔与支持向量

2.1 几何间隔

2.2 支持向量的概念

2.3 规范化超平面

2.4 支持向量的深入分析

2.4.1 支持向量的特征

 2.4.2 支持向量的作用

2.4.3 支持向量的代数表示

2.5 KKT条件

3 最优化问题

3.1 问题的形成

3.2 规范化处理

3.3 拉格朗日对偶性

3.3.1 构建拉格朗日函数

3.3.2 原始问题转化

3.3.3 对偶问题推导

3.4 求解过程

3.5 KKT条件分析

3.5.1 稳定性条件

3.5.2 可行性条件

3.5.3 互补松弛条件

3.6 SMO算法

3.6.1 基本思想

3.6.2 变量选择策略

 4 核函数

4.1 线性不可分问题

4.2 核技巧的基本思想

4.3 核函数的数学原理

4.3.1 特征空间映射

4.4 Mercer条件

4.5 常用核函数详解

4.5.1 线性核

4.5.2 多项式核

 4.5.3 高斯核(RBF核)

4.5.4 Sigmoid核

4.6 核函数的选择

5 软间隔与正则化

5.1 硬间隔的局限性

5.2 引入软间隔的原因

5.3 软间隔的数学描述

5.3.1 松弛变量

5.3.2 优化目标

5.4 正则化与参数C

5.4.1 惩罚参数C的作用

5.4.2 参数选择策略

6 SVM的优缺点


1 支持向量机的基本概念

在介绍支持向量机之前,我们先回顾一下最简单的线性分类器——感知机。感知机寻找一个超平面将两类样本分开,但这个超平面可能有无数个。而支持向量机则更进一步,不仅要将样本分开,还要找到"最优"的分隔超平面。

支持向量机最初是为解决二分类问题而设计的。其核心思想是:在特征空间中寻找一个最优超平面,使得两类样本分别位于超平面的两侧,并且使得两类样本到超平面的距离(称为间隔)尽可能大。

1.2 数学表达

假设我们的分隔超平面方程为:

w^T x + b = 0

 对于线性可分的数据集 {(x₁,y₁), (x₂,y₂), ..., (xₙ,yₙ)},其中 yᵢ ∈ {+1,-1},分类器可以表示为:

f(x) = sign(w^T x + b)

 要使得样本被正确分类,需要满足:

yᵢ(w^T xᵢ + b) > 0

2 间隔与支持向量

2.1 几何间隔

对于一个样本点到超平面的距离(几何间隔)计算公式为:

  • 函数间隔
    • 定义:γ̂ᵢ = yᵢ(w^T xᵢ + b)
    • 特点:依赖于w和b的取值,不是标准化的度量
  • 几何间隔
    • 定义:γᵢ = yᵢ(w^T xᵢ + b)/||w||
    • 特点:与w和b的缩放无关,是标准化的度量
    • 实际应用中更有意义

支持向量机的核心思想是寻找最大间隔分隔超平面。这里的"间隔"指的是什么?

  1. 几何间隔:样本点到分隔超平面的垂直距离
  2. 总体间隔:所有样本点中到超平面最小的距离的两倍

为什么要最大化间隔?

  • 更大的间隔意味着分类器对噪声和新样本有更好的鲁棒性
  • 这种策略可以有效降低过拟合的风险
  • 数学上可以证明,最大间隔分类器是唯一的 

2.2 支持向量的概念

支持向量是训练数据集中距离分隔超平面最近的样本点。它们具有以下特点:

  1. 决定性作用
    • 仅支持向量参与确定最优分隔超平面
    • 其他样本点对模型没有影响
  2. 稀疏性
    • 通常支持向量数量远少于样本总数
    • 这种稀疏性使得SVM在预测时很高效
  3. 鲁棒性
    • 模型只依赖于支持向量
    • 非支持向量的扰动不影响模型

2.3 规范化超平面

为了使问题便于求解,我们通常对分隔超平面进行规范化:

将约束条件统一为:

yᵢ(w^T xᵢ + b) ≥ 1

 此时,支持向量满足:

yᵢ(w^T xᵢ + b) = 1

间隔大小为:

margin = 2/||w||

这种规范化使得最大化间隔的问题转化为最小化 ||w|| 的问题,这是一个凸二次规划问题,可以使用成熟的优化方法求解。

2.4 支持向量的深入分析

2.4.1 支持向量的特征

  1. 位置特征
    • 落在间隔边界上
    • 满足条件 yᵢ(w^T xᵢ + b) = 1
  2. 数学特征
    • 对应的拉格朗日乘子 αᵢ > 0
    • 是最优化问题的活动约束
  3. 影响特征
    • 决定超平面位置和方向
    • 移除非支持向量不影响模型

 2.4.2 支持向量的作用

2.4.3 支持向量的代数表示

对于任意支持向量 (xs,ys),有:

w = ∑αᵢyᵢxᵢ

其中 αᵢ 是拉格朗日乘子,只有支持向量对应的 αᵢ 不为零。

2.5 KKT条件

最优解必须满足KKT条件:

互补松弛条件

αᵢ(yᵢ(w^T xᵢ + b) - 1) = 0

 约束条件

yᵢ(w^T xᵢ + b) - 1 ≥ 0
αᵢ ≥ 0

3 最优化问题

3.1 问题的形成

从几何角度看,我们要找到间隔最大的分离超平面。这可以分两步理解:

  • 分类要求:所有样本被正确分类
yᵢ(w^T xᵢ + b) > 0, i=1,2,...,n
  • 间隔最大化:最大化所有样本到超平面的最小距离
max min(yᵢ(w^T xᵢ + b)/||w||), i=1,2,...,n

3.2 规范化处理

为了简化计算,我们对超平面进行规范化:

  • 将约束条件缩放为 yᵢ(w^T xᵢ + b) ≥ 1
  • 此时间隔等于 2/||w||

因此,最优化问题可以写成:

min 1/2 ||w||²
s.t. yᵢ(w^T xᵢ + b) ≥ 1, i=1,2,...,n

3.3 拉格朗日对偶性

3.3.1 构建拉格朗日函数

引入拉格朗日乘子 αᵢ ≥ 0,构建拉格朗日函数:

L(w,b,α) = 1/2 ||w||² - ∑αᵢ[yᵢ(w^T xᵢ + b) - 1]

3.3.2 原始问题转化

原始问题等价于:

min max L(w,b,α)
w,b  α≥0

3.3.3 对偶问题推导

  1. 对w和b求偏导并令其为0:
∂L/∂w = w - ∑αᵢyᵢxᵢ = 0
∂L/∂b = -∑αᵢyᵢ = 0

 得到:

w = ∑αᵢyᵢxᵢ
∑αᵢyᵢ = 0

将这些结果代回拉格朗日函数,得到对偶问题:

max -1/2 ∑∑αᵢαⱼyᵢyⱼ(xᵢ^T xⱼ) + ∑αᵢ
s.t. ∑αᵢyᵢ = 0
    αᵢ ≥ 0, i=1,2,...,n

3.4 求解过程

import numpy as np
from scipy.optimize import minimize

class SimpleSVM:
    def __init__(self, C=1.0):
        self.C = C
        self.w = None
        self.b = None
        self.alpha = None
        self.support_vectors = None
        self.support_vector_labels = None
        
    def _kernel(self, x1, x2):
        return np.dot(x1, x2)  # 线性核
        
    def _objective(self, alpha, X, y):
        # 目标函数
        n_samples = len(y)
        kernel_matrix = np.zeros((n_samples, n_samples))
        for i in range(n_samples):
            for j in range(n_samples):
                kernel_matrix[i,j] = self._kernel(X[i], X[j])
                
        objective = 0.5 * np.sum(np.outer(alpha * y, alpha * y) * kernel_matrix) - np.sum(alpha)
        return objective
        
    def _constraints(self, n_samples):
        # 约束条件
        constraints = [
            {'type': 'eq', 'fun': lambda alpha, y: np.dot(alpha, y), 'args': (self.y,)},
            {'type': 'ineq', 'fun': lambda alpha: alpha},
            {'type': 'ineq', 'fun': lambda alpha: self.C - alpha}
        ]
        return constraints
        
    def fit(self, X, y):
        n_samples = len(y)
        self.X = X
        self.y = y
        
        # 初始化alpha
        alpha0 = np.zeros(n_samples)
        
        # 定义约束
        constraints = self._constraints(n_samples)
        
        # 求解优化问题
        solution = minimize(
            fun=self._objective,
            x0=alpha0,
            args=(X, y),
            method='SLSQP',
            constraints=constraints
        )
        
        self.alpha = solution.x
        
        # 找出支持向量
        sv_threshold = 1e-5
        sv_idx = np.where(self.alpha > sv_threshold)[0]
        self.support_vectors = X[sv_idx]
        self.support_vector_labels = y[sv_idx]
        self.alpha = self.alpha[sv_idx]
        
        # 计算w和b
        self.w = np.sum(self.alpha.reshape(-1,1) * self.support_vector_labels.reshape(-1,1) * 
                       self.support_vectors, axis=0)
        
        # 计算b
        margin_vectors = self.support_vectors[0]
        self.b = self.support_vector_labels[0] - np.dot(self.w, margin_vectors)
        
    def predict(self, X):
        return np.sign(np.dot(X, self.w) + self.b)

3.5 KKT条件分析

KKT条件是最优解的必要条件

3.5.1 稳定性条件

∂L/∂w = w - ∑αᵢyᵢxᵢ = 0
∂L/∂b = -∑αᵢyᵢ = 0

3.5.2 可行性条件

yᵢ(w^T xᵢ + b) - 1 ≥ 0
αᵢ ≥ 0

3.5.3 互补松弛条件

αᵢ(yᵢ(w^T xᵢ + b) - 1) = 0

3.6 SMO算法

序列最小优化(SMO)算法是解决SVM优化问题的高效算法:

3.6.1 基本思想

  1. 每次选择两个变量进行优化
  2. 固定其他变量
  3. 解析求解这个二次规划问题

3.6.2 变量选择策略

  1. 第一个变量选择
    • 违反KKT条件最严重的点
    • 启发式搜索
  2. 第二个变量选择
    • 使目标函数下降最快的点
    • 通常选择使间隔最大的点

 4 核函数

4.1 线性不可分问题

在实际应用中,很多数据集是线性不可分的。例如以下情况:

4.2 核技巧的基本思想

  1. 映射思想
    • 将数据从原始空间映射到高维特征空间
    • 在高维空间中寻找线性分类面
  2. 计算技巧
    • 避免显式地计算高维特征空间中的内积
    • 直接在原始空间中计算核函数值

4.3 核函数的数学原理

4.3.1 特征空间映射

定义映射 Φ:X → H,将原始空间的数据映射到特征空间:

x → Φ(x)

在特征空间中的内积可表示为:

K(x,z) = <Φ(x),Φ(z)>

4.4 Mercer条件

核函数需满足Mercer条件:

  1. 对称性:K(x,z) = K(z,x)
  2. 半正定性:对任意函数g(x),满足:
∫∫K(x,z)g(x)g(z)dxdz ≥ 0

4.5 常用核函数详解

4.5.1 线性核

最简单的核函数

K(x,z) = x^T z

4.5.2 多项式核

K(x,z) = (γx^T z + r)^d

参数:

  • d:多项式的次数
  • γ:核系数
  • r:常数项

 4.5.3 高斯核(RBF核)

K(x,z) = exp(-γ||x-z||²)

特点:

  • 将样本映射到无穷维空间
  • γ控制高斯分布的宽度

4.5.4 Sigmoid核

K(x,z) = tanh(γx^T z + r)

我们看一个实现这些核函数的代码示例:

import numpy as np

class KernelFunctions:
    def linear_kernel(X1, X2):
        """
        线性核函数
        K(x,z) = x^T z
        """
        return np.dot(X1, X2.T)
    
   
    def polynomial_kernel(X1, X2, degree=3, gamma=1, coef0=1):
        """
        多项式核函数
        K(x,z) = (gamma * x^T z + coef0)^degree
        """
        return (gamma * np.dot(X1, X2.T) + coef0) ** degree
    

    def rbf_kernel(X1, X2, gamma=1):
        """
        高斯RBF核函数
        K(x,z) = exp(-gamma ||x-z||^2)
        """
        # 计算欧氏距离的平方
        X1_norm = np.sum(X1**2, axis=1).reshape(-1,1)
        X2_norm = np.sum(X2**2, axis=1).reshape(1,-1)
        distances = X1_norm + X2_norm - 2 * np.dot(X1, X2.T)
        return np.exp(-gamma * distances)
  
    def sigmoid_kernel(X1, X2, gamma=1, coef0=1):
        """
        Sigmoid核函数
        K(x,z) = tanh(gamma * x^T z + coef0)
        """
        return np.tanh(gamma * np.dot(X1, X2.T) + coef0)
    
    def kernel_matrix(self, X1, X2, kernel_type='rbf', **kwargs):
        """
        计算核矩阵
        """
        kernel_functions = {
            'linear': self.linear_kernel,
            'poly': self.polynomial_kernel,
            'rbf': self.rbf_kernel,
            'sigmoid': self.sigmoid_kernel
        }
        
        if kernel_type not in kernel_functions:
            raise ValueError(f"Unknown kernel type: {kernel_type}")
            
        return kernel_functions[kernel_type](X1, X2, **kwargs)

# 使用示例
if __name__ == "__main__":
    # 生成示例数据
    X1 = np.array([[1, 2], [3, 4]])
    X2 = np.array([[5, 6], [7, 8]])
    
    kf = KernelFunctions()
    
    # 计算不同核函数的值
    print("Linear Kernel Matrix:")
    print(kf.kernel_matrix(X1, X2, kernel_type='linear'))
    
    print("\nRBF Kernel Matrix:")
    print(kf.kernel_matrix(X1, X2, kernel_type='rbf', gamma=0.5))

4.6 核函数的选择

  • 先验知识
    • 根据数据特征选择合适的核函数
    • 考虑问题的物理背景
  • 数据特点
    • 样本数量和维度
    • 数据分布特征
  • 经验法则
    • 小样本:线性核
    • 中等样本:RBF核
    • 特征关系复杂:多项式核

5 软间隔与正则化

5.1 硬间隔的局限性

5.2 引入软间隔的原因

  1. 噪声数据
    • 训练数据可能包含错误标记
    • 存在异常点(outliers)
  2. 过拟合问题
    • 严格的硬间隔容易过拟合
    • 降低模型泛化能力
  3. 现实可行性
    • 数据可能本身就不是线性可分的
    • 需要在分类准确性和模型复杂度之间权衡

5.3 软间隔的数学描述

5.3.1 松弛变量

引入松弛变量 ξᵢ ≥ 0,修改约束条件

yᵢ(w^T xᵢ + b) ≥ 1 - ξᵢ

5.3.2 优化目标

新的优化问题变为:

min 1/2 ||w||² + C∑ξᵢ
s.t. yᵢ(w^T xᵢ + b) ≥ 1 - ξᵢ
    ξᵢ ≥ 0, i=1,2,...,n

其中:

  • C > 0 是惩罚参数
  • ∑ξᵢ 表示总的错误程度

我们看一个实现软间隔SVM的代码示例:

import numpy as np
from scipy.optimize import minimize

class SoftMarginSVM:
    def __init__(self, C=1.0, kernel='linear'):
        self.C = C
        self.kernel = kernel
        self.alpha = None
        self.support_vectors = None
        self.support_vector_labels = None
        self.b = None
        
    def _kernel_function(self, x1, x2):
        if self.kernel == 'linear':
            return np.dot(x1, x2)
        elif self.kernel == 'rbf':
            gamma = 1.0
            return np.exp(-gamma * np.sum((x1 - x2) ** 2))
        
    def _compute_kernel_matrix(self, X1, X2):
        n1, n2 = len(X1), len(X2)
        K = np.zeros((n1, n2))
        for i in range(n1):
            for j in range(n2):
                K[i,j] = self._kernel_function(X1[i], X2[j])
        return K
        
    def _objective(self, alpha):
        # 目标函数:最大化对偶问题
        n = len(alpha)
        K = self._compute_kernel_matrix(self.X, self.X)
        
        # 计算目标函数值
        obj = 0.5 * np.sum(np.outer(alpha * self.y, alpha * self.y) * K) - np.sum(alpha)
        return obj
        
    def fit(self, X, y):
        n_samples = len(y)
        self.X = X
        self.y = y
        
        # 构建约束条件
        constraints = [
            {'type': 'eq', 'fun': lambda alpha: np.sum(alpha * y)},  # sum(alpha_i * y_i) = 0
            {'type': 'ineq', 'fun': lambda alpha: alpha},  # alpha_i >= 0
            {'type': 'ineq', 'fun': lambda alpha: self.C - alpha}  # alpha_i <= C
        ]
        
        # 初始化alpha
        alpha0 = np.zeros(n_samples)
        
        # 求解优化问题
        solution = minimize(
            fun=self._objective,
            x0=alpha0,
            constraints=constraints,
            method='SLSQP'
        )
        
        self.alpha = solution.x
        
        # 找出支持向量
        sv_threshold = 1e-5
        sv_idx = np.where((self.alpha > sv_threshold) & (self.alpha < self.C - sv_threshold))[0]
        
        self.support_vectors = X[sv_idx]
        self.support_vector_labels = y[sv_idx]
        self.support_vector_alphas = self.alpha[sv_idx]
        
        # 计算偏置项b
        self.b = 0
        for i in range(len(sv_idx)):
            self.b += self.support_vector_labels[i]
            self.b -= np.sum(self.support_vector_alphas * self.support_vector_labels * 
                           self._compute_kernel_matrix(self.support_vectors, [self.support_vectors[i]]))
        self.b /= len(sv_idx)
        
    def predict(self, X):
        K = self._compute_kernel_matrix(self.support_vectors, X)
        return np.sign(np.sum(self.support_vector_alphas * self.support_vector_labels * K, axis=0) + self.b)

# 使用示例
if __name__ == "__main__":
    # 生成示例数据
    np.random.seed(0)
    X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]]
    y = np.array([-1]*20 + [1]*20)
    
    # 训练模型
    svm = SoftMarginSVM(C=1.0)
    svm.fit(X, y)
    
    # 预测
    y_pred = svm.predict(X)
    accuracy = np.mean(y == y_pred)
    print(f"准确率: {accuracy:.2f}")

5.4 正则化与参数C

5.4.1 惩罚参数C的作用

  1. 平衡作用
    • 控制间隔最大化和误分类最小化之间的平衡
    • C越大,对误分类的惩罚越重
  2. 模型复杂度
    • C越小,模型越简单,泛化能力越强
    • C越大,模型越复杂,更容易过拟合

5.4.2 参数选择策略

  1. 交叉验证
    • 使用网格搜索找最优C值
    • 通常尝试 C ∈ {0.1, 1, 10, 100, ...}
  2. 经验法则
    • 数据噪声大时,选择较小的C
    • 数据质量好时,可以选择较大的C

6 SVM的优缺点

优点:

  • 有严格的数学理论支持
  • 解是全局最优而非局部最优
  • 可以处理高维数据
  • 泛化能力强

缺点:

  • 对参数调节较敏感
  • 计算复杂度高
  • 对缺失数据敏感
  • 对样本规模敏感

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

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

相关文章

快速汇总Word表格

示例需求&#xff1a;Word文档中的有多个表格&#xff0c;其中最后一个表格为汇总表格&#xff0c;其他的为数据表格&#xff0c;如下图中左侧所示。 现在需要根据Category1和Category2&#xff0c;在数据表格中查找&#xff0c;如果找到匹配行&#xff0c;那么 为数据表中改…

OSCP课后练习-tcpdump

本篇文章旨在为网络安全渗透测试行业OSCP考证教学。通过阅读本文&#xff0c;读者将能够对tcpdump日志分析关键信息过滤有一定了解 1、下载练习分析文件 wget https://www.offensive-security.com/pwk-online/password_cracking_filtered.pcap2、查看分析文件所有内容 sudo t…

Linux快速入门-Linux的常用命令

Linux的常用命令 1. Linux的终端与工作区1.1 终端概述1.2 切换终端 2. Shell语言解释器2.1 Shell概述 3. 用户登录与身份切换3.1 su 命令3.2 sudo 命令 4. 文件、目录操作命令4.1 pwd 命令4.2 cd 命令4.3 ls 命令4.3.1 ls 指令叠加使用 4.4 mkdir 命令4.5 rmdir 命令4.6 cp 命令…

ASP.NET Web应用程序出现Maximum request length exceeded报错

一、问题描述 在ASP.NET的web应用中&#xff0c;导出数据时出现500 - Internal server error.Maximum request length exceeded。 二、原因分析 这个错误通常出现在Web应用程序中&#xff0c;表示客户端发送的HTTP请求的长度超过了服务器配置的最大请求长度限制。这可能是因为…

【JDBC】使用原生JDBC,数据量很大且内存空间较小的情况下,JavaHeap溢出

文章目录 使用原生JDBC&#xff0c;数据量很大且内存空间较小的情况下&#xff0c;JavaHeap非常容易溢出问题背景java.lang.OutOfMemoryError: Java heap space错误分析解决方案1. **优化数据库查询**2. **调整 JVM 堆内存**3. **批量处理数据**4. **线程池优化** 总结**Result…

uniapp 微信小程序 数据空白展示组件

效果图 html <template><view class"nodata"><view class""><image class"nodataimg":src"$publicfun.locaAndHttp()?localUrl:$publicfun.httpUrlImg(httUrl)"mode"aspectFit"></image>&l…

12.26 学习卷积神经网路(CNN)

完全是基于下面这个博客来进行学习的&#xff0c;感谢&#xff01; ​​【深度学习基础】详解Pytorch搭建CNN卷积神经网络LeNet-5实现手写数字识别_pytorch cnn-CSDN博客 基于深度神经网络DNN实现的手写数字识别&#xff0c;将灰度图像转换后的二维数组展平到一维&#xff0c;…

【团标】《信息工程造价政务信息化项目造价评估方法》(TCQAE11021-2023)-费用标准解读系列33

《信息工程造价政务信息化项目造价评估方法》&#xff08;TCQAE11021-2023&#xff09;是中国电子质量管理协会2023年发布&#xff0c;2023年12月16日开始实施的标准&#xff08;了解更多可直接关注我们咨询&#xff09;。该标准适用于政务信息化项目的造价评估&#xff0c;政务…

mybatisplu设置自动填充

/*** mybatisplus的自动化填充*/public class JboltMetaObjectHandler implements MetaObjectHandler {Overridepublic void insertFill(MetaObject metaObject) {LocalDateTime now LocalDateTime.now(ZoneId.of("Asia/Shanghai"));this.strictInsertFill(metaObje…

音视频入门基础:MPEG2-TS专题(23)——通过FFprobe显示TS流每个packet的信息

一、引言 通过FFprobe命令&#xff1a; ffprobe -of json -show_packets XXX.ts 可以显示TS流/TS文件每个packet&#xff08;也称为数据包或多媒体包&#xff09;的信息&#xff1a; 对于TS流&#xff0c;上述的“packet”&#xff08;数据包或多媒体包&#xff09;是指&…

Linux电源管理——CPU Hotplug 流程

目录 一、相关概念 二、基本原理 三、代码分析 1、CPU_ON 2、CPU_OFF References Linux Version&#xff1a;linux-5.4.239 一、相关概念 在单核操作系统中&#xff0c;操作系统只需管理一个CPU&#xff0c;当系统有任务需要执行时&#xff0c;所有的任务会在该CPU的就绪…

探索数据的艺术:R语言与Origin的完美结合

探索数据的艺术&#xff1a;R语言与Origin的完美结合 R语言统计分析与可视化从入门到精通内容简介获取方式 Origin绘图深度解析&#xff1a;科研数据的可视化艺术内容简介获取方式 R语言统计分析与可视化从入门到精通 内容简介 本书循序渐进、深入讲解了R语言数据统计分析与应…

python基础训练之元组的基本操作

主页包含元组基础知识点 【练习要求】 针对于元组的知识点进行常用的创建、定义、查询元素、查看元组长度等操作。效果实现如下 (注&#xff1a;特别要注意一下切片的用法) #创建元组的两种方法 T1 () T2 tuple() #定义一个元组并存储数据张三, 李四, 王五 T3 (张三, 李四…

选煤厂可视化技术助力智能化运营

通过图扑 HT 可视化搭建智慧选煤厂管理平台&#xff0c;优化了选煤生产流程&#xff0c;提高了资源利用率和安全性&#xff0c;助力企业实现智能化运营和可持续发展目标。

C语言基础:指针(数组指针与指针数组)

数组指针与指针数组 数组指针 概念&#xff1a;数组指针是指向数组的指针&#xff0c;本质上还是指针 特点&#xff1a; 先有数组&#xff0c;后有指针 它指向的是一个完整的数组 一维数组指针&#xff1a; 语法&#xff1a; 数据类型 (*指针变量名)[行容量][列容量]; 案…

接口测试Day03-postman断言关联

postman常用断言 注意&#xff1a;不需要手敲&#xff0c;点击自动生成 断言响应状态码 Status code&#xff1a;Code is 200 //断言响应状态码为 200 pm.test("Status code is 200", function () {pm.response.to.have.status(200); });pm: postman的实例 test() …

01- 三自由度串联机械臂位置分析

三自由度串联机械臂如下图所示&#xff08;d180mm&#xff0c;L1100mm&#xff0c;L280mm&#xff09;&#xff0c;利用改进DH法建模&#xff0c;坐标系如下所示&#xff1a; 利用改进DH法建模&#xff0c;该机器人的DH参数表如下所示&#xff1a; 对该机械臂进行位置分析&…

lxml 解析xml\html

from lxml import etree# XML文档示例 xml_doc """ <root><book><title>Python编程指南</title><author>张三</author></book><book><title>Python高级编程</title><author>李四</autho…

用Python写炸金花游戏

文章目录 **代码分解与讲解**1. **扑克牌的生成与洗牌**2. **给玩家发牌**3. **打印玩家的手牌**4. **定义牌的优先级**5. **判断牌型**6. **确定牌型优先级**7. **比较两手牌的大小**8. **计算每个玩家的牌型并找出赢家**9. **打印结果** 完整代码 以下游戏规则&#xff1a; 那…

基于 SpringBoot微信小程序的医院预约挂号系统

摘 要 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;医院预约挂号系统当然不能排除在外。医院预约挂号系统是在实际应用和软件工程的开发原理之上&#xff0c;运用微信开发者、java语言以及…