统计学习方法 感知机

文章目录

  • 统计学习方法 感知机
    • 模型定义
    • 学习策略
    • 学习算法
      • 原始算法
      • 对偶算法
    • 学习算法的收敛性

统计学习方法 感知机

读李航的《统计学习方法》时,关于感知机的笔记。

感知机(perceptron)是一种二元分类的线性分类模型,属于判别模型,是 NN 和 SVM 的基础。

模型定义

感知机:输入空间 X ⊆ R n \mathcal{X}\subseteq \R^n XRn ,输出空间是 Y = { 1 , − 1 } \mathcal{Y}=\set{1,\,-1} Y={1,1} ;输入 x ∈ X x\in \mathcal{X} xX 表示实例的特征向量,输出 y ∈ Y y\in\mathcal{Y} yY 表示实例的类别。由输入空间到输出空间的如下函数:
f ( x ) = sign ( w ⋅ x + b ) f(x)=\text{sign}(w \cdot x+b) f(x)=sign(wx+b)
称为感知机。其中 w ∈ R n w \in \R^n wRn 称为权重, b ∈ R b\in\R bR 称为偏置。

线性方程 w ⋅ x + b w \cdot x+b wx+b 对应特征空间 R n \R^n Rn 中的一个超平面 S S S ,位于两边的点(特征向量)则被分为正、负两类:

请添加图片描述

学习策略

当训练数据是完全线性可分的,我们则可以找到一个超平面将正负类的数据完全分开。但数据不完全线性可分时,我们则要定义损失函数,找到一个感知机使得损失函数极小化。(但其实即使完全线性可分,也要定义损失函数,不然怎么学习 [乐.jpg])

很容易想到用分类错误的点的总数作为损失函数,但是这样对 w w w b b b 就不是连续可导的了,不好优化。所以我们选择所有误分类点到超平面 S S S 的总距离作为损失函数。

空间中任意一点 x 0 ∈ R n x_0\in \R^n x0Rn 到超平面 S S S 的距离为:
dis ( x 0 , S ) = 1 ∣ ∣ w ∣ ∣ ∣ w ⋅ x 0 + b ∣ \text{dis}(x_0,S)=\frac{1}{||w||}|w\cdot x_0+b| dis(x0,S)=∣∣w∣∣1wx0+b

  • ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣ w w w L 2 L_2 L2 范数;

其次,对于误分类的数据 ( x i , y i ) (x_i,y_i) (xi,yi) 来说, y i y_i yi f ( x ) f(x) f(x) 符号相反,因此:
− y i ( w ⋅ x i + b ) > 0 -y_i(w\cdot x_i+b)\gt 0 yi(wxi+b)>0
我们利用这个大于零的性质,可以将误分类点到超平面的距离表示为(因为 y i y_i yi 只有可能是正负 1,所以乘上去也不会改变距离的大小):
dis ( x 0 , S ) = − 1 ∣ ∣ w ∣ ∣ y i ( w ⋅ x i + b ) \text{dis}(x_0,S)=-\frac{1}{||w||}y_i(w\cdot x_i+b) dis(x0,S)=∣∣w∣∣1yi(wxi+b)
因此,所有误分类点到超平面 S S S 的距离之和:
− 1 ∣ ∣ w ∣ ∣ ∑ x i ∈ M y i ( w ⋅ x i + b ) -\frac{1}{||w||}\sum_{x_i\in M} y_i(w\cdot x_i+b) ∣∣w∣∣1xiMyi(wxi+b)

  • M M M 为被误分类点的集合;

这里不考虑 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} ∣∣w∣∣1 ,即得到感知机的损失函数:
L ( w , b ) = − ∑ x i ∈ M y i ( w ⋅ x i + b ) L(w,\,b)=-\sum_{x_i\in M} y_i(w\cdot x_i+b) L(w,b)=xiMyi(wxi+b)
去掉 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} ∣∣w∣∣1 对损失函数的优化至关重要, y i ( w ⋅ x i + b ) y_i(w\cdot x_i+b) yi(wxi+b) 被称为样本点的函数间隔,在 SVM 中会涉及到。

学习算法

感知机学习算法的原始形式和对偶形式与第7支待向量机学习法的原始形式和偶形式相对应。

原始算法

给定一个训练数据集:
T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x N , y N ) } T=\{(x_1,\,y_1),\,(x_2,\,y_2),\,\cdots,\,(x_N,\,y_N)\} T={(x1,y1),(x2,y2),,(xN,yN)}
其中 x i ∈ X = R n x_i\in\mathcal{X}=\bold{R}^n xiX=Rn y i ∈ Y = { − 1 , 1 } y_i\in\mathcal{Y}=\{-1,\,1\} yiY={1,1} i = 1 , 2 , ⋯ , N i=1,\,2,\,\cdots,\,N i=1,2,,N ,求参数 w w w b b b ,使得以下损失函数极小化:
min ⁡ w , b L ( w , b ) = − ∑ x i ∈ M y i ( w ⋅ x i + b ) \min_{w,\,b}L(w,\,b)=-\sum_{x_i\in M}y_i(w\cdot x_i +b) w,bminL(w,b)=xiMyi(wxi+b)
我们采用随机梯度下降法来学习参数 w w w b b b ,梯度为:
∇ w L ( w , b ) = − ∑ x i ∈ M y i x i ∇ b L ( w , b ) = − ∑ x i ∈ M y i \begin{align} \nabla_wL(w,\,b)=&\,-\sum\limits_{x_i\in M}y_ix_i \\ \nabla_bL(w,\,b)=&\,-\sum\limits_{x_i\in M}y_i \\ \end{align} wL(w,b)=bL(w,b)=xiMyixixiMyi
但学习的时候并不是一次使 M M M 中所有的误分类点都梯度下降,而是一次随机选取一个误分类点使其梯度下降。

算法:感知机学习算法的原始形式

输入:训练数据集 T T T ,学习率 η \eta η 0 < η ≤ 1 0 \lt\eta\leq 1 0<η1);

输出 w w w b b b ,感知机模型 f ( x ) = sign ( w ⋅ x + b ) f(x)=\text{sign}(w\cdot x+b) f(x)=sign(wx+b)

  1. 选取初值 w 0 w_0 w0 b 0 b_0 b0
  2. 在训练集中选取数据 ( x i , y i ) (x_i,\,y_i) (xi,yi)
  3. y i ( w ⋅ x i + b ) ≤ 0 y_i(w\cdot x_i+b) \leq 0 yi(wxi+b)0

w ← w + η y i x i b ← b + η y i \begin{align} w \leftarrow&\, w+\eta y_ix_i \\ b \leftarrow&\, b+\eta y_i \end{align} wbw+ηyixib+ηyi

  1. 若当前训练集中仍有误分类点,则跳转至 2. ,否则结束;

对偶算法

我们前面对误分类点修改参数时的形式为:
w ← w + η y i x i b ← b + η y i \begin{align} w \leftarrow&\, w+\eta y_ix_i \\ b \leftarrow&\, b+\eta y_i \end{align} wbw+ηyixib+ηyi
因此,我们可以认为模型参数是训练样本值的线性组合,即最后学习到的 w w w b b b 可以表示为:
w = ∑ i = 1 N α i y i x i b = ∑ i = 1 N α i y i \begin{array}{c} w=\sum\limits_{i=1}^N \alpha_iy_ix_i \\ b=\sum\limits_{i=1}^{N}\alpha_iy_i \end{array} w=i=1Nαiyixib=i=1Nαiyi
这里 α i ≥ 0 \alpha_i \geq 0 αi0 i = 1 , 2 , ⋯ , N i=1,2,\cdots,N i=1,2,,N)。

算法:感知机学习算法的对偶形式

输入:训练数据集 T T T ,学习率 η \eta η 0 < η ≤ 1 0 \lt\eta\leq 1 0<η1);

输出 α \alpha α b b b ,感知机模型 f ( x ) = sign ( ∑ j = 1 N α j y j x j ⋅ x + b ) f(x)=\text{sign}(\sum\limits_{j=1}^N \alpha_jy_jx_j\cdot x+b) f(x)=sign(j=1Nαjyjxjx+b)

  1. 初始化: α ← 0 \alpha \leftarrow 0 α0 b ← 0 b \leftarrow 0 b0
  2. 在训练集中选取数据 ( x i , y i ) (x_i,\,y_i) (xi,yi)
  3. y i ( ∑ j = 1 N α j y j x j ⋅ x + b ) ≤ 0 y_i(\sum\limits_{j=1}^N \alpha_jy_jx_j\cdot x+b) \leq 0 yi(j=1Nαjyjxjx+b)0

α i ← α i + η b ← b + η y i \begin{align} \alpha_i \leftarrow&\, \alpha_i+\eta \\ b \leftarrow&\, b+\eta y_i \end{align} αibαi+ηb+ηyi

  1. 若当前训练集中仍有误分类点,则跳转至 2. ,否则结束;

为了方便,可以预先将训练集中的实例间的内积计算出来并以矩阵的形式存储,即 Gram 矩阵:
G = [ x i ⋅ x j ] N × N \bold{G}=[x_i \cdot x_j]_{N\times N} G=[xixj]N×N

学习算法的收敛性

当数据集不可分时,显然上述算法会震荡。现在证明,对于线性可分数据集,感知机学习算法原始形式收敛,即经过有限次迭代就可以得到一个将数据集完全正确划分的分离超平面及感知机模型。

为了数学推导方面,我们将偏置 b b b 放入权重向量 w w w ,记作 w ^ = [ w t , b ] T \hat{w}=[w^t,\,b]^T w^=[wt,b]T 。同样将输入向量进行增广,得到 x ^ = [ x T , 1 ] T \hat{x}=[x^T,\,1]^T x^=[xT,1]T ,显然:
w ^ ⋅ x ^ = w ⋅ x + b \hat{w}\cdot\hat{x}=w\cdot x+b w^x^=wx+b
Th 2.1(Novikoff) 设训练数据集 T T T 是线性可分的,则:

  1. 存在满足条件 ∣ ∣ w ^ o p t ∣ ∣ = 1 ||\hat{w}_{opt}||=1 ∣∣w^opt∣∣=1 的超平面 w ^ o p t ⋅ x ^ = 0 \hat{w}_{opt}\cdot \hat{x}=0 w^optx^=0 将训练数据集完全正确分开,且存在 γ > 0 \gamma >0 γ>0 ,对所有 i = 1 , 2 , ⋯ , N i=1,\,2,\,\cdots,\,N i=1,2,,N ,都有:

y i ( w ^ o p t ⋅ x ^ i ) = y i ( w o p t ⋅ x i + b o p t ) ≥ γ y_i(\hat{w}_{opt}\cdot \hat{x}_{i})=y_i(w_{opt}\cdot x_{i}+b_{opt})\geq \gamma yi(w^optx^i)=yi(woptxi+bopt)γ

  1. R = max ⁡ 1 ≤ i ≤ N ∣ ∣ x ^ i ∣ ∣ R=\max\limits_{1\leq i\leq N}||\hat{x}_{i}|| R=1iNmax∣∣x^i∣∣ ,则感知机算法在训练数据集上的误分类次数 k k k 满足:

k ≤ ( R γ ) 2 k\leq \left(\frac{R}{\gamma}\right)^2 k(γR)2

证明:第一点较为简单。因为训练数据集线性可分,因此存在超平面 ( w o p t , b o p t ) (w_{opt},\,b_{opt}) (wopt,bopt) 可将数据集完全正确分开。只要令:
γ = min ⁡ i { y i ( w o p t ⋅ x i + b o p t ) } \gamma=\min_{i}\{ y_i(w_{opt}\cdot x_i+b_{opt}) \} γ=imin{yi(woptxi+bopt)}
就有:
y i ( w ^ o p t ⋅ x ^ i ) = y i ( w o p t ⋅ x i + b o p t ) ≥ γ y_i(\hat{w}_{opt}\cdot \hat{x}_{i})=y_i(w_{opt}\cdot x_{i}+b_{opt})\geq \gamma yi(w^optx^i)=yi(woptxi+bopt)γ
现在来看第二点,看起来还蛮神奇的。感知机算法从 w ^ 0 = 0 \hat{w}_0=0 w^0=0 开始,记每一次迭代得到的参数为 w ^ k \hat{w}_k w^k 。第 k k k 个参数下,记 ( x i , y i ) (x_i,\,y_i) (xi,yi) 是被误分类的实例,则条件是:
y i ( w ^ k − 1 ⋅ x ^ i ) = y i ( w k − 1 ⋅ x i + b k − 1 ) ≤ 0 y_i(\hat{w}_{k-1}\cdot \hat{x}_i)=y_i(w_{k-1}\cdot x_i + b_{k-1})\leq 0 yi(w^k1x^i)=yi(wk1xi+bk1)0
w w w b b b 的更新是:
w k ← w k − 1 + η y i x i b k ← b k − 1 + η y i \begin{align} w_k \leftarrow&\, w_{k-1}+\eta y_ix_i \\ b_k \leftarrow&\, b_{k-1}+\eta y_i \end{align} wkbkwk1+ηyixibk1+ηyi
即:
w ^ k = w ^ k − 1 + η y i x ^ i \hat{w}_k=\hat{w}_{k-1}+\eta y_i\hat{x}_i w^k=w^k1+ηyix^i
下面证明两个不等式:

① 由于我们是从 w ^ 0 = 0 \hat{w}_0=0 w^0=0 开始的,因此迭代过程中的参数应当从小到大越来越接近 w ^ o p t \hat{w}_{opt} w^opt ,即 w k w_{k} wk w o p t w_{opt} wopt 的内积越来越大:
w ^ k ⋅ w ^ o p t = w ^ k − 1 ⋅ w ^ o p t + η y i w ^ o p t ⋅ x ^ i ≥ w ^ k − 1 ⋅ w ^ o p t + η γ ≥ w ^ k − 2 ⋅ w ^ o p t + 2 η γ ≥ ⋯ ≥ k η γ \begin{align} \hat{w}_k\cdot \hat{w}_{opt} =&\, \hat{w}_{k-1}\cdot \hat{w}_{opt}+\eta y_i\hat{w}_{opt}\cdot\hat{x}_i \\ \geq &\, \hat{w}_{k-1}\cdot \hat{w}_{opt}+\eta \gamma \\ \geq &\, \hat{w}_{k-2}\cdot \hat{w}_{opt}+2\eta \gamma \\ \geq &\, \cdots \\ \geq &\, k\eta \gamma \end{align} w^kw^opt=w^k1w^opt+ηyiw^optx^iw^k1w^opt+ηγw^k2w^opt+2ηγkηγ

  • 第二个大于等于是因为,我们已经假设了 γ \gamma γ 是最小的 y i w ^ o p t x ^ i y_i\hat{w}_{opt}\hat{x}_i yiw^optx^i ,因此任意 i i i 都有 y i w ^ o p t x ^ i ≥ γ y_i\hat{w}_{opt}\hat{x}_i\geq \gamma yiw^optx^iγ

即:
w ^ k ⋅ w ^ o p t ≥ k η γ \hat{w}_k\cdot \hat{w}_{opt}\geq k\eta \gamma w^kw^optkηγ
② 由于我们是从 w ^ 0 = 0 \hat{w}_0=0 w^0=0 开始的,因此迭代过程中的参数更新过大时,就会被后续的迭代给“拉”回来:
∣ ∣ w ^ k ∣ ∣ 2 = ∣ ∣ w ^ k − 1 ∣ ∣ 2 + 2 η y i w ^ k − 1 ⋅ x ^ i + η 2 ∣ ∣ x ^ i ∣ ∣ 2 ≤ ∣ ∣ w ^ k − 1 ∣ ∣ 2 + η ∣ ∣ x ^ i ∣ ∣ 2 ≤ ∣ ∣ w ^ k − 1 ∣ ∣ 2 + η R 2 ≤ ∣ ∣ w ^ k − 2 ∣ ∣ 2 + 2 η R 2 ≤ ⋯ ≤ k η 2 R 2 \begin{align} ||\hat{w}_k||^2=&\,||\hat{w}_{k-1}||^2+2\eta y_i\hat{w}_{k-1}\cdot \hat{x}_i+\eta^2||\hat{x}_i||^2 \\ \leq &\, ||\hat{w}_{k-1}||^2+\eta||\hat{x}_i||^2 \\ \leq &\, ||\hat{w}_{k-1}||^2+\eta R^2 \\ \leq &\, ||\hat{w}_{k-2}||^2+2\eta R^2 \\ \leq &\, \cdots \\ \leq &\, k\eta^2R^2 \end{align} ∣∣w^k2=∣∣w^k12+2ηyiw^k1x^i+η2∣∣x^i2∣∣w^k12+η∣∣x^i2∣∣w^k12+ηR2∣∣w^k22+2ηR2kη2R2

  • 第一个等号是因为:

∣ ∣ w ^ k ∣ ∣ 2 = w ^ k T w ^ k = ( w ^ k − 1 + η y i x ^ i ) T ( w ^ k − 1 + η y i x ^ i ) = ( w ^ k − 1 T + η y i x ^ i T ) ( w ^ k − 1 + η y i x ^ i ) = w ^ k − 1 T w ^ k − 1 + η y i ( w ^ k − 1 T x ^ i + x ^ i T w ^ k − 1 ) + η 2 y i 2 x ^ i T x ^ i = ∣ ∣ w ^ k − 1 ∣ ∣ 2 + 2 η y i w ^ k − 1 ⋅ x ^ i + η 2 ∣ ∣ x ^ i ∣ ∣ 2 (有 y i 2 = 1 ) \begin{align} ||\hat{w}_k||^2=&\,\hat{w}_k^T\hat{w}_k \\ =&\,(\hat{w}_{k-1}+\eta y_i\hat{x}_i)^T(\hat{w}_{k-1}+\eta y_i\hat{x}_i) \\ =&\,(\hat{w}_{k-1}^T+\eta y_i\hat{x}_i^T)(\hat{w}_{k-1}+\eta y_i\hat{x}_i) \\ =&\,\hat{w}_{k-1}^T\hat{w}_{k-1}+\eta y_i(\hat{w}_{k-1}^T\hat{x}_i+\hat{x}_i^T\hat{w}_{k-1})+\eta^2y_i^2\hat{x}_i^T\hat{x}_i \\ =&\,||\hat{w}_{k-1}||^2+2\eta y_i\hat{w}_{k-1}\cdot \hat{x}_i+\eta^2||\hat{x}_i||^2 \quad\text{(有$\,y_i^2=1$)} \end{align} ∣∣w^k2=====w^kTw^k(w^k1+ηyix^i)T(w^k1+ηyix^i)(w^k1T+ηyix^iT)(w^k1+ηyix^i)w^k1Tw^k1+ηyi(w^k1Tx^i+x^iTw^k1)+η2yi2x^iTx^i∣∣w^k12+2ηyiw^k1x^i+η2∣∣x^i2(yi2=1)

  • 第二个小于等于是因为我们假设 ( x i , y i ) (x_i,\,y_i) (xi,yi) 是被误分类的实例,因此 y i w ^ k − 1 ⋅ x ^ i < 0 y_i\hat{w}_{k-1}\cdot \hat{x}_i<0 yiw^k1x^i<0
  • 第三个小于等于是因为我们假设 R R R 是最大的特征向量的模,因此对于任意 i i i 都有 R ≥ ∣ ∣ x ^ i ∣ ∣ R \geq ||\hat{x}_i|| R∣∣x^i∣∣

即:
∣ ∣ w ^ k ∣ ∣ 2 ≤ k η 2 R 2 ||\hat{w}_k||^2\leq k\eta^2R^2 ∣∣w^k2kη2R2
综合不等式 ① 和 ② 得:
k η γ ≤ w ^ k ⋅ w ^ o p t ≤ ∣ ∣ w ^ k ∣ ∣ ∣ ∣ w ^ o p t ∣ ∣ ≤ k η R ⇒ k 2 γ 2 ≤ k R 2 \begin{array}{c} k\eta \gamma \leq \hat{w}_k\cdot \hat{w}_{opt} \leq ||\hat{w}_{k}||\,||\hat{w}_{opt}|| \leq \sqrt{k}\eta R \\ \Rightarrow k^2\gamma^2 \leq kR^2 \end{array} kηγw^kw^opt∣∣w^k∣∣∣∣w^opt∣∣k ηRk2γ2kR2

  • 第二个小于等于是柯西不等式, x ⋅ y = ∣ ∣ x ∣ ∣ ∣ ∣ y ∣ ∣ cos ⁡ θ ≤ ∣ ∣ x ∣ ∣ ∣ ∣ y ∣ ∣ x\cdot y=||x||\,||y||\,\cos\theta\leq ||x||\,||y|| xy=∣∣x∣∣∣∣y∣∣cosθ∣∣x∣∣∣∣y∣∣ ,其中 θ \theta θ 是两个向量的夹角。

于是:
k ≤ ( R γ ) 2 k\leq \left(\frac{R}{\gamma}\right)^2 k(γR)2
该定理表明,误分类次数 k k k 是有上界的,即训练集线性可分时,感知机学习算法原始形式迭代是收敛的。

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

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

相关文章

【JAVA-Day49】Java LinkedList集合详解

Java LinkedList集合详解 摘要引言Java LinkedList集合详解一、什么是LinkedList集合1.1 链表数据结构1.2 双向链表1.3 动态大小1.4 插入和删除元素1.5 适用场景 二、LinkedList集合的使用2.1 创建 LinkedList 集合、添加元素、遍历元素2.2 在指定位置插入元素2.3 获取指定位置…

Maven的详细介绍(maven的全据配置以及idea中maven的配置)

maven的理解 Maven 是一个强大的项目管理和构建自动化工具&#xff0c;它通过抽象的项目对象模型(POM&#xff1a;Project Object Model)和构建生命周期模型(Project Lifecycle)来对项目及其构建过程进行管理(Dependency Management System)&#xff0c;Maven 最大化的消除了构…

【TensorFlow1.X】系列学习笔记【入门二】

【TensorFlow1.X】系列学习笔记【入门二】 大量经典论文的算法均采用 TF 1.x 实现, 为了阅读方便, 同时加深对实现细节的理解, 需要 TF 1.x 的知识 文章目录 【TensorFlow1.X】系列学习笔记【入门二】前言神经网络的参数神经网络的搭建前向传播反向传播 总结 前言 学习了张量、…

SpringBoot 第一个接口编写

RestController //表示该类为请求处理类public class HttpDeal {RequestMapping("/login")//这个方法处理哪一个地址过来的请求public String hello(){return "返回给浏览器";}}

测试Android webview 加载本地html

最近开发一个需要未联网功能的App, 不熟悉使用Java原生开发界面&#xff0c;于是想使用本地H5做界面&#xff0c;本文测试了使用本地html加载远程数据。直接上代码&#xff1a; MainActivity.java package com.alex.webviewlocal;import androidx.appcompat.app.AppCompatAct…

DataGridView的下拉DataGridViewComboBoxColumn的数据绑定问题

DataGridView的下拉DataGridViewComboBoxColumn的数据绑定问题 需求&#xff1a;左边这列固定x行&#xff0c;右边显示下拉&#xff0c;并且赋上默认值 public void Set(){// 添加需要固定显示的行数dataGridView1.Rows.Add("早班";dataGridView1.Rows.Add("中…

小团队之间有哪些好用免费的多人协同办公软件

在小团队协作中&#xff0c;选择适合的多人协同办公软件是提高工作效率和团队协作的重要一环。幸运的是&#xff0c;市场上有许多大多数功能都免费的多人协同办公软件&#xff0c;为小团队提供了强大的协作功能和便捷的工作环境。 在本文中&#xff0c;我将根据自己多年的在线…

[C++] C++入门

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C和Linux &#x1f33c;博客专栏&#xff1a;C入门 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4aa;&#x1f3fb; …

Cesium Vue(六)— 材质(Material)

1. 设置entity材质 添加棋盘纹理材质 // 棋盘纹理 let material new Cesium.CheckerboardMaterialProperty({ evenColor: Cesium.Color.RED, oddColor: Cesium.Color.YELLOW, repeat: new Cesium.Cartesian2(2, 2), });添加条纹纹理材质 // 条纹纹理 let material new Cesium…

Java利用反射和读取xml实现迷你容器

由于需要框架能实现多态&#xff0c;达到控制反转解耦。所以容器还是需要的&#xff0c;容器的存在可以简化对象获取工作&#xff0c;但是容器也不是万能的。合理使用即可&#xff0c;Spring对我来说太庞大了&#xff0c;用不着&#xff0c;为此给框架写一个迷你版容器。 容器…

Qt中Json的操作

在 Json的两种格式中介绍了Json的格式以及应用场景。由于这种数据格式与语言无关,下面介绍一下Json在Qt中的使用。 从Qt 5.0开始提供了对Json的支持,我们可以直接使用Qt提供的Json类进行数据的组织和解析。相关的类常用的主要有四个,具体如下: Json类介绍 QJsonDocument |…

【vSphere 8 自签名证书】企业 CA 签名证书替换 vSphere Machine SSL 证书Ⅰ—— 生成 CSR

目录 替换拓扑图证书关系示意图说明 & 关联博文 1. 默认证书截图2. 使用certificate-manager生成CSR2.1 创建存放CSR的目录2.2 记录PNID和IP2.3 生成CSR2.4 验证CSR 参考资料 替换拓扑图 证书关系示意图 默认情况下&#xff0c;VMCA 与 Machine SSL的关系是 本系列博文要…

UE5--物体卡片与材质入门

参考资料&#xff1a; 《Unreal Engine5 入门到精通》--左央 虚幻引擎5.2文档&#xff1a;https://docs.unrealengine.com/5.2/zh-CN/ 前言&#xff1a; 跟着左央老师的《Unreal Engine5 入门到精通》学习制作AI版胡闹厨房&#xff0c;把学习过程与学习到的东西归纳总结起来。 …

【网络协议】聊聊网关 NAT机制

再宿舍的时候&#xff0c;其实只能通过局域网进行处理&#xff0c;但是如果接入互联网&#xff0c;一般是配置路由器当然还有网关。 MAC头和IP头的细节 一旦配置了IP地址和网关&#xff0c;就可以制定目标地址进行访问。 MAC头主要信息目标和源MAC地址&#xff0c;以及协议类…

【试题040】多个逻辑或例题2

1.题目&#xff1a;设int n0;&#xff0c;执行表达式n ||(n-1) ||(n0)||(n1)||(n2)后n的值是 &#xff1f; 2.代码解析&#xff1a; 逻辑或 || 运算符是一个短路运算符&#xff0c;它从左到右依次计算表达式&#xff0c;如果遇到一个为真&#xff08;非零&#xff09;的值&am…

uCOSIII实时操作系统 十 事件标志组

目录 事件标志组&#xff1a; 事件标志组API函数&#xff1a; 创建事件标志组&#xff1a; 等待事件标志组&#xff1a; 向事件标志组发送标志&#xff1a; 事件标志组实验&#xff1a; 事件标志组&#xff1a; 有时候一个任务可能需要和多个事件同步这个时候就需要使用事…

39.克鲁斯卡尔(Kruskal)算法

一言 已知n个顶点&#xff0c;选n-1条最短的边&#xff0c;不可成环。 概述 克鲁斯卡尔&#xff08;Kruskal&#xff09;算法是用来求加权连通图的最小生成树的算法。其基本思想是按照权值从小到大的顺序选择n-1条边&#xff0c;保证这n-1条边不构成回路。 这就要求要首先构…

一百九十一、Flume——Flume配置文件各参数含义(持续完善中)

一、目的 在实际项目的开发过程中&#xff0c;不同Kafka主题的数据规模、数据频率&#xff0c;需要配置不同的Flume参数&#xff0c;而这一切的调试、配置工作&#xff0c;都要建立在对Flume配置文件各参数含义的基础上 二、Flume各参数及其含义 &#xff08;一&#xff09;…

集成学习方法(随机森林和AdaBoost)

释义 集成学习很好的避免了单一学习模型带来的过拟合问题 根据个体学习器的生成方式&#xff0c;目前的集成学习方法大致可分为两大类&#xff1a; Bagging(个体学习器间不存在强依赖关系、可同时生成的并行化方法) 流行版本&#xff1a;随机森林(random forest)Boosting(个体…

springboot缓存篇之mybatis一级缓存和二级缓存

前言 相信很多人都用过mybatis&#xff0c;这篇文章主要是介绍mybatis的缓存&#xff0c;了解一下mybatis缓存是如何实现&#xff0c;以及它在实际中的应用 一级缓存 什么是mybatis一级缓存&#xff1f;我们先看一个例子&#xff1a; GetMapping("/list") public…