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

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

目录

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 minimizeclass SimpleSVM:def __init__(self, C=1.0):self.C = Cself.w = Noneself.b = Noneself.alpha = Noneself.support_vectors = Noneself.support_vector_labels = Nonedef _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 objectivedef _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 constraintsdef fit(self, X, y):n_samples = len(y)self.X = Xself.y = y# 初始化alphaalpha0 = 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-5sv_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和bself.w = np.sum(self.alpha.reshape(-1,1) * self.support_vector_labels.reshape(-1,1) * self.support_vectors, axis=0)# 计算bmargin_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 npclass 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) ** degreedef 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 minimizeclass SoftMarginSVM:def __init__(self, C=1.0, kernel='linear'):self.C = Cself.kernel = kernelself.alpha = Noneself.support_vectors = Noneself.support_vector_labels = Noneself.b = Nonedef _kernel_function(self, x1, x2):if self.kernel == 'linear':return np.dot(x1, x2)elif self.kernel == 'rbf':gamma = 1.0return 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 Kdef _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 objdef fit(self, X, y):n_samples = len(y)self.X = Xself.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]# 初始化alphaalpha0 = np.zeros(n_samples)# 求解优化问题solution = minimize(fun=self._objective,x0=alpha0,constraints=constraints,method='SLSQP')self.alpha = solution.x# 找出支持向量sv_threshold = 1e-5sv_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]# 计算偏置项bself.b = 0for 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的优缺点

优点:

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

缺点:

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

相关文章:

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

目录 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 规…...

汽车打气泵方案|智能充气泵工作原理

汽车打气泵方案最开始是机械式的开发&#xff0c;后来慢慢地演变成由一个气缸、压力传感器和ADC芯片以及主控芯片&#xff0c;就能够使得打气筒具备智能充气功能&#xff0c;摇身一变变成汽车打气泵方案。它具备精准压力检测以及过充过放等功能&#xff0c;利用ADC芯片和压力传…...

Jenkins入门使用

Jenkins入门使用 1先安装jdk才能运行jenkins yum install -y java-1.8.0-openjdk.x86_64 2 安装jenkins&#xff0c;运行&#xff0c;进行端口绑定&#xff0c;启动jenkins docker search jenkins docker pull jenkins/jenkins docker run -d -u root -p 8080:8080 -p 50000:50…...

iOS Masonry对包体积的影响

01 Masonry介绍 Masonry是iOS在控件布局中经常使用的一个轻量级框架&#xff0c;Masonry让NSLayoutConstraint使用起来更为简洁。Masonry简化了NSLayoutConstraint的使用方式&#xff0c;让我们可以以链式的方式为我们的控件指定约束。 常用接口声明与实现&#xff1a; 使用方式…...

Hive分区再分桶表

在Hive中&#xff0c;数据通常是根据分区&#xff08;partition&#xff09;来组织的&#xff0c;但是对于大数据集&#xff0c;单层分区可能不够用&#xff0c;因此可以进一步细分为桶&#xff08;bucket&#xff09;。桶可以用于提供额外的并行处理和优化查询性能。在这种情况…...

三大行业案例:AI大模型+Agent实践全景

本文将从AI Agent和大模型的发展背景切入&#xff0c;结合51Talk、哈啰出行以及B站三个各具特色的行业案例&#xff0c;带你一窥事件驱动架构、RAG技术、人机协作流程&#xff0c;以及一整套行之有效的实操方法。具体包含内容有&#xff1a;51Talk如何让智能客服“主动进攻”&a…...

国产低代码框架zdppy开发笔记002 标准的接口响应

前言 通过前面的学习, 我们已经知道了zdppy_api和zdppy_req的基本用法, 接下来我们会在学习中多次用到这两个框架. 我们已经知道了该如何响应一个字符串,但是我们该如何响应json数据呢? 在zdppy_api中,我们定义了一组规范的API响应, 我们慢慢来看看. 规范的响应 首先来看…...

关于Nginx

1.Nginx的配置 proxy_pass http: 当你需要将请求分发到多个后端服务器时&#xff0c;需要实现负载均衡功能&#xff0c;可以使用upstream指令定义一组服务器&#xff0c;并在proxy_pass中引用这个服务组名称。。如果不需要负载均衡&#xff0c;只需要将请求转发到单一的后端…...

数据库实时会话管理,性能问题诊断后的临门一脚

目录 前言 实时会话管理 DBdoctor 实时会话功能 1.实时会话列表 2.结束会话 3.操作历史 4.SQL分析 结语 前言 在之前的文章中我们介绍了DBdoctor性能洞察功能&#xff0c;它能够快速量化数据库连接会话单条SQL的资源消耗&#xff0c;实现性能问题快速根因定位并给出优…...

以EM算法为例介绍坐标上升(Coordinate Ascent)算法:中英双语

中文版 什么是 Coordinate Ascent 算法&#xff1f; Coordinate Ascent&#xff08;坐标上升&#xff09;是一种优化算法&#xff0c;它通过在每次迭代时优化一个变量&#xff08;或一个坐标&#xff09;&#xff0c;并保持其他变量不变&#xff0c;逐步逼近最优解。与坐标下…...

visual studio连接sql server数据库

目录 1、为什么要建立连接2、在sql server中建立数据库3、visual studio连接sql server数据库4、学生信息管理系统页面布局5、添加事件逻辑 5.1 页面跳转5.2 读取学生信息5.3 查询学生信息5.4 修改学生信息5.5 删除学生信息5.6 添加学生信息 bilibili演示视频 github源码 1、…...

磁盘的相关操作

1.让U盘连接到虚拟机中 两种方法&#xff1a;1>在弹出的窗口中设置 2>通过选项设置 菜单栏---->虚拟机----->可移动设备---->找到U盘名---->连接到虚拟机中 2.查看U盘是否已被成功识别 方法&#xff1a;ls /dev/sd* 显示包含除了sda外的文件说明U盘连接成功…...

数据结构与算法Python版 图的应用与广度优先搜索

文章目录 一、图的应用-词梯问题二、图的广度优先搜索 一、图的应用-词梯问题 词梯问题 Word Ladder 从一个单词演变到另一个单词&#xff0c;其中的过程可以经过多个中间单词。要求是相邻两个单词之间差异只能是1个字母如FOOL变SAGE&#xff1a;FOOL >> POOL >>…...

Unity——InputField组件自动换行和enter键换行

文章目录 输入框实现换行功能 输入框实现换行功能 在Unity中&#xff0c;如果你想要在输入框&#xff08;如InputField&#xff09;中实现换行功能 &#xff0c;你需要确保以下几点&#xff1a; 1、文本组件支持多行&#xff1a; 确保你的InputField的文本组件&#xff08;Te…...

solr9.7 单机安装教程

1.环境要求:jdk11以上 2.下载wget https://dlcdn.apache.org/solr/solr/9.7.0/solr-9.7.0.tgz 3.解压 4.修改solr.in.sh配置 5.启动命令 bin/solr start 6.创建core bin/solr create -c <core名称> 注意:用solr ui界面创建&#xff0c;会提示找不到solrconfig.xml和m…...

​虚幻引擎UE5渲染不够快的解决办法

​虚幻引擎是由Epic Games公司开发的一款功能强大、全球最开放且先进的实时 3D 创作工具&#xff0c;广泛应用于游戏、影视、建筑可视化、虚拟现实等多个领域&#xff01;虚幻引擎UE5如何实现在网上极速渲染呢&#xff1f;本文提供云渲染和云电脑两套方案用于渲染提速&#xff…...

基于STM32的智能家居环境监控系统设计

目录 引言系统设计 硬件设计软件设计系统功能模块 环境监控模块控制模块显示模块系统实现 硬件实现软件实现系统调试与优化结论与展望 1. 引言 随着智能家居技术的发展&#xff0c;环境监控系统已经成为家居管理的重要组成部分。智能家居环境监控系统通过实时监测室内温度、湿…...

Android service framework笔记

1. 网络摘录如何添加一个Application Framework Service(一)(without native code) 如何添加一个Application Framework Service(二)(with native code) 2.书籍摘录...

【图像处理lec10】图像压缩

目录 一、图像压缩基础 1、图像压缩的基本概念 2、数据冗余与压缩比 3、三种主要的数据冗余类型 4、保真度评估标准&#xff08;Fidelity Criteria&#xff09; 5、应用与实践 二、图像压缩模型 1、图像压缩模型概述 &#xff08;1&#xff09;压缩系统的结构 &#…...

flask后端开发(2):URL与视图

目录 URL定义request获取请求参数 gitcode地址&#xff1a; https://gitcode.com/qq_43920838/flask_project.git URL定义 from flask import FlaskappFlask(__name__)app.route(/) def hello_world():return Hello World!app.route(/profile) def profile():return 我是个人…...

Linux Ubuntu24配置安装Java

目录 一. 通过apt安装java1.1 列出所有可用java版本1.2 安装指定java版本1.3 安装后确认1.4 /etc/alternatives/目录 二. 手动安装java 一. 通过apt安装java 1.1 列出所有可用java版本 apt list openjdk-*jdk apluserubuntu24-01:~$ apt list openjdk-*jdk Listing... Done …...

线段树例题题解

卫星覆盖&#xff08;NOI1997&#xff09; 题面&#xff1a; SERCOI&#xff08;Space-Earth Resource Cover-Observe lnstitute&#xff09; 是一个致力于利用卫星技术对空间和地球资源进行覆盖观测的组织。现在他们研制成功一种新型资源观测卫星 -SERCOI-308。这种卫星可以…...

极品飞车6的游戏手柄设置

极品飞车&#xff0c;既可以用键盘来控制车辆的前进、后退、左转、右转、加速与减速&#xff0c;也可以使用游戏手柄来操作车辆的运行。需要注意的是&#xff0c;极品飞车虽然支持手柄&#xff0c;但是仅支持常见的北通、罗技还有部分Xbox系列的手柄&#xff0c;至于其他的PS4手…...

为何DeepSeek V3模型为自己是ChatGPT?

DeepSeek V3 AI模型&#xff1a;为何它认为自己是ChatGPT&#xff1f; 引言 在人工智能领域&#xff0c;最新的技术进展总是令人兴奋。最近&#xff0c;一家资金雄厚的中国AI实验室DeepSeek发布了一款新的AI模型——DeepSeek V3&#xff0c;它在多个流行基准测试中超越了许多…...

【每日学点鸿蒙知识】人脸活体检测、NodeController刷新、自动关闭输入框、Row设置中间最大宽、WebView单例

1、HarmonyOS 人脸活体检测调用&#xff1f; H5调用应用侧方法可参考以下demo&#xff1a; index.ets Web()//注册方法.javaScriptProxy({object: this.testObj,name: "testObjName",methodList: ["getLocationTS"],controller: this.webController})cla…...

深入理解Composer自动加载机制

Composer是PHP生态系统中最常用的依赖管理工具之一&#xff0c;它不仅能够帮助开发者管理项目的依赖关系&#xff0c;还能够自动加载这些依赖项。自动加载机制是Composer的核心功能之一&#xff0c;通过自动加载&#xff0c;开发者可以在运行时按需加载所需的类和文件&#xff…...

SQL SERVER日常运维巡检系列之-日志

前言 做好日常巡检是数据库管理和维护的重要步骤&#xff0c;而且需要对每次巡检日期、结果进行登记&#xff0c;同时可能需要出一份巡检报告。 本系列旨在解决一些常见的困扰&#xff1a; 不知道巡检哪些东西不知道怎么样便捷体检机器太多体检麻烦生成报告困难&#xff0c;无…...

2024年中国新能源汽车用车发展怎么样 PaperGPT(二)

用车趋势深入分析 接上文&#xff0c;2024年中国新能源汽车用车发展怎么样 PaperGPT&#xff08;一&#xff09;-CSDN博客本文将继续深入探讨新能源汽车的用车强度、充电行为以及充电设施的现状。 用车强度 月均行驶里程&#xff1a;2024年纯电车辆月均行驶超过1500公里&…...

【数据结构】线性数据结构——链表

1. 定义 链表是一种线性数据结构&#xff0c;由多个节点&#xff08;Node&#xff09;组成。每个节点存储数据和指向下一个节点的指针。与数组不同&#xff0c;链表的节点不需要在内存中连续存储。 2. 特点 动态存储&#xff1a; 链表的大小不固定&#xff0c;可以动态增加或…...

Spring中的设计模式

Spring中的设计模式 控制反转(IoC)和依赖注入(DI) IoC 是一个原则&#xff0c;而不是一个模式&#xff0c;以下模式&#xff08;但不限于&#xff09;实现了 IoC 原则。 **Spring IoC 容器就像是一个工厂一样&#xff0c;当我们需要创建一个对象的时候&#xff0c;只需要配置…...

微信小程序给外面的view设置display:flex;后为什么无法给里面的view设置宽度

如果父盒子view设置了display:flex&#xff0c;子view设置宽度值无效&#xff0c;宽度值都是随着内容多少而改变&#xff1a; 问题视图&#xff1a; 原因&#xff1a; flex布局元素的子元素&#xff0c;自动获得了flex-shrink的属性 解决方法&#xff1a; 给子view增加:fl…...

异步爬虫之aiohttp的使用

在上一篇博客我们介绍了异步爬虫的基本原理和 asyncio 的基本用法&#xff0c;并且在最后简单提及了使用aiohttp 实现网页爬取的过程。本篇博客我们介绍一下 aiohttp 的常见用法。 基本介绍 前面介绍的 asyncio模块&#xff0c;其内部实现了对 TCP、UDP、SSL协议的异步操作&a…...

vue3大屏实现;使用使用CSS Grid实现大屏

文章目录 一、效果1.效果2.使用CSS Grid3.插件4.html代码5.index.scss代码 一、效果 1.效果 方案&#xff1a;采用CSS的Grid布局&#xff0c;实现首页大屏模块划分和自适应功能&#xff1b; 布局&#xff1a; 大屏主要内容&#xff0c;高宽比是1920*1080&#xff1b;即16:9的…...

安卓入门二 Kotlin基础

Kotlin Kotlin的历史 Kotlin由Jet Brains公司开发设计&#xff0c;2011年公布第一版&#xff0c;2012年开源。 2016年发布1.0正式版&#xff0c;并且Jet Brains在IDEA加入对Kotlin的支持&#xff0c;安卓自此又有新的选择。 2019年谷歌宣布Kotlin成为安卓第一开发语言&#x…...

在ubuntu上如何使用sdkman安装两个版本的java并进行管理和维护

在Ubuntu上使用SDKMAN安装和管理两个不同版本的Java的步骤如下&#xff1a; 安装SDKMAN 打开终端&#xff0c;使用以下命令安装SDKMAN&#xff1a; curl -s "https://get.sdkman.io" | bash这个命令会下载并运行SDKMAN!的安装脚本。 安装完成后&#xff0c;需要打开…...

《代码随想录》Day20打卡!

《代码随想录》二叉树&#xff1a;二叉搜索树的最近公共祖先 本题的完整题目如下&#xff1a; 本题的思路如下&#xff1a; 1.之前写过一个二叉树的最近公共祖先&#xff0c;本题相比于另一道题&#xff0c;不同是本题是二叉搜索树&#xff0c;有一些可用的性质。 2.本题使用递…...

GPIO相关寄存器,点灯

目录 一.输入模式 1.浮空输入 2.上拉输入 3.下拉输入 4.模拟输入 二.输出模式 1.推挽输出 2.开漏输出 三.寄存器 1.寄存器的作用 2.功能与类型 3.控制某一引脚输出电压来点灯所需要控制的寄存器 1.打开对应时钟开关 2.端口模式寄存器 ---输出模式 3.输出类型寄存…...

25 - GRACE Mascon数据缺失月份数据插值

25 - GRACE Mascon数据缺失月份数据插值 0 引言1 程序包获取1.1 获取ssa插值算法程序包1.2 try2 利用ssa对grace mascon数据进行插值3 完整代码及相关函数3.1 Main程序3.1 子程序4 总结0 引言 💦💦💦💦💦   上篇介绍了grace mascon数据提取及简单的分析过程,仔细…...

深入理解Redis:从理论到实践的Java之旅

Redis&#xff0c;这个开源的内存数据结构存储系统&#xff0c;自2009年诞生以来&#xff0c;凭借其丰富的数据结构、快速的读写性能以及高度的可扩展性&#xff0c;迅速成为了分布式系统和高并发应用中的明星组件。本文将带你深入理解Redis&#xff0c;并通过Java语言的实践示…...

REDIS的集群

REDIS的集群模式&#xff1a; 主从模式&#xff1a;redis高可用的基础&#xff0c;哨兵和集群都是建立在此基础之上 特点&#xff1a; 主从模式和数据库的主从模式&#xff08;工作模式&#xff09;是一样的&#xff0c;主负责写入&#xff0c;然后把写入到数据同步到从&…...

linux——vi命令常用操作

一、vi模式 vi一般分为三种模式&#xff0c;分别是命令行模式、插入模式、末行模式 1.命令模式&#xff1a;控制屏幕光标的移动&#xff0c;按 &#xff1a;进入末行模式&#xff0c;按 i&#xff08;其他插入命令也可&#xff09; 进入插入模式&#xff1b; 2.插入模式&…...

SKETCHPAD——允许语言模型生成中间草图,在几何、函数、图算法和游戏策略等所有数学任务中持续提高基础模型的性能

概述 论文地址&#xff1a;https://arxiv.org/pdf/2406.09403 素描是一种应用广泛的有效工具&#xff0c;包括产生创意和解决问题。由于素描能直接传达无法用语言表达的视觉和空间信息&#xff0c;因此从古代岩画到现代建筑图纸&#xff0c;素描在世界各地被用于各种用途。儿童…...

计算机网络•自顶向下方法:网络应用原理

网络应用原理 网络应用架构 目前有两种主流的网络应用架构&#xff1a; 客户-服务器架构&#xff08;Client-server&#xff09; 服务器&#xff08;server&#xff09;: 有一台总是在线的主机&#xff0c;上面运行着服务器程序(server)服务器主机(server machine)具有永久的…...

python: Oracle Stored Procedure query table

oracel sql script CREATE OR REPLACE PROCEDURE SelectSchool(paramSchoolId IN char,p_cursor OUT SYS_REFCURSOR ) AS BEGINOPEN p_cursor FORSELECT *FROM SchoolWHERE SchoolId paramSchoolId; END SelectSchool; /-- 查询所有 CREATE OR REPLACE PROCEDURE SelectScho…...

Webpack学习笔记(6)

首先搭建一个基本的webpack环境&#xff1a; 执行npm init -y&#xff0c;创建pack.json&#xff0c;保存安装包的一些信息 执行npm install webpack webpack-cli webpack-dev-server html-webpack-plugin -D&#xff0c;出现node_modules和package-lock.json。 1.source-Ma…...

数仓建模:如何进行实体建模?

目录 1 如何进行实体建模? 业务建模 领域建模 逻辑建模 2 实体建模具体步骤 需求分析...

C++ 设计模式:享元模式(Flyweight Pattern)

链接&#xff1a;C 设计模式 链接&#xff1a;C 设计模式 - 单例模式 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过共享尽可能多的相同对象来减少内存使用和提高性能。享元模式适用于大量细粒度对象的场景&#xff0c;这些对象之…...

idea报错:There is not enough memory to perform the requested operation.

文章目录 一、问题描述二、先解决三、后原因&#xff08;了解&#xff09; 一、问题描述 就是在使用 IDEA 写代码时&#xff0c;IDEA 可能会弹一个窗&#xff0c;大概提示你目前使用的 IDEA 内存不足&#xff0c;其实就是提醒你 JVM 的内存不够了&#xff0c;需要重新分配。弹…...

Kubernetes Gateway API-2-跨命名空间路由

1 跨命名空间路由 Gateway API 具有跨命名空间路由的核心支持。当多个用户或团队共享底层网络基础设施时,这很有用,但必须对控制和配置进行分段,以尽量减少访问和容错域。 Gateway 和 Route(HTTPRoute,TCPRoute,GRPCRoute) 可以部署到不同的命名空间中,路由可以跨命名空间…...

【视觉SLAM:四、相机与图像】

相机模型 相机模型是计算机视觉中的重要内容&#xff0c;用于描述真实相机如何将三维世界投影到二维图像平面。以下从多个角度介绍常见的相机模型。 针孔相机模型 针孔相机模型是最简单的相机模型&#xff0c;用数学公式描述从三维世界到二维图像平面的映射关系。核心公式如…...