机器学习笔记之K近邻学习算法

news2024/11/25 0:56:35

机器学习笔记之K近邻学习算法

引言

本节将介绍 K \mathcal K K近邻学习算法的理论描述。

回顾:投票法

详见《机器学习》(周志华著) P182 8.4.2 投票法

在介绍集成学习—— Bagging \text{Bagging} Bagging中针对分类任务,通常以多数表决的方式决定样本最终预测的归属类别,这种方式能够有效消除样本预测结果的方差信息

当然,投票法( Voting \text{Voting} Voting)并非只有多数表决一种方式,这里整理了几种投票方式

  • 场景构建
    已知数据集合 D = { ( x ( i ) , y ( i ) ) } i = 1 N \mathcal D = \{(x^{(i)},y^{(i)})\}_{i=1}^N D={(x(i),y(i))}i=1N,针对一个多分类任务,假设其存在 K \mathcal K K个分类,并将 y ( i ) ( i = 1 , 2 , ⋯   , N ) y^{(i)}(i=1,2,\cdots,N) y(i)(i=1,2,,N)所有可能取值的标签结果组成的集合 L \mathcal L L称作标记集合
    y ( i ) ∈ L = { C 1 , C 2 , ⋯   , C K } i = 1 , 2 , ⋯   , N y^{(i)} \in \mathcal L = \{\mathcal C_1,\mathcal C_2,\cdots,\mathcal C_{\mathcal K}\} \quad i=1,2,\cdots,N y(i)L={C1,C2,,CK}i=1,2,,N
    在模型学习完成后,针对某个陌生样本 x ^ \hat x x^,通过某学习器 h t ( ⋅ ) h_t(\cdot) ht()预测结果记作 h t ( x ^ ) h_t(\hat x) ht(x^)。该结果可表示成一个 K \mathcal K K向量形式,并且向量中的每一个分量 h t k ( x ^ ) ( k = 1 , 2 , ⋯   , K ) h_t^{k}(\hat x)(k=1,2,\cdots,\mathcal K) htk(x^)(k=1,2,,K)表示:学习器 h t ( x ^ ) h_t(\hat x) ht(x^)标签结果 C k \mathcal C_k Ck上的输出信息
    h t ( x ^ ) = [ h t 1 ( x ^ ) , h t 2 ( x ^ ) , ⋯   , h t K ( x ^ ) ] K × 1 T h_t(\hat x) = \left[h_t^{1}(\hat x),h_t^{2}(\hat x),\cdots,h_t^{\mathcal K}(\hat x)\right]_{\mathcal K \times 1}^T ht(x^)=[ht1(x^),ht2(x^),,htK(x^)]K×1T
    这个输出信息 h t k ( x ^ ) h_t^{k}(\hat x) htk(x^)可能是一个概率值 P ( C k ∣ x ^ ) ∣ h t ( ⋅ ) \mathcal P(\mathcal C_k \mid \hat x) \mid h_t(\cdot) P(Ckx^)ht();也有可能 ∈ { 0 , 1 } \in \{0,1\} {0,1}。但不可否认的是, h t ( x ^ ) h_t(\hat x) ht(x^)所有分量之和必然等于 1 1 1
    • 因为最终只会选择一个标记作为 x ^ \hat x x^标签的预测结果。
    • 通常将概率值作为输出的投票方式称为软投票 ( Soft Voting ) (\text{Soft Voting}) (Soft Voting)反之,将 { 0 , 1 } \{0,1\} {0,1}作为输出的投票方式称为硬投票 ( Hard Voting ) (\text{Hard Voting}) (Hard Voting)
      ∑ k = 1 K h t k ( x ^ ) = 1 \sum_{k=1}^{\mathcal K} h_t^{k}(\hat x) = 1 k=1Khtk(x^)=1
      相应地,假设该模型中存在 T \mathcal T T学习器,那么必然有:
      ∑ t = 1 T ∑ k = 1 K h t k ( x ^ ) = T \sum_{t=1}^{\mathcal T} \sum_{k=1}^{\mathcal K} h_t^{k}(\hat x) = \mathcal T t=1Tk=1Khtk(x^)=T
  • 多数表决 / / /绝对多数投票法 ( Majority Voting ) (\text{\text{Majority Voting}}) (Majority Voting)。该投票法的思想是:若某标签结果得票超过半数,则预测为该结果;否则拒绝预测
    这里 H ( x ) \mathcal H(x) H(x)表示包含 T \mathcal T T的完整模型。可以看出 H ( x ^ ) \mathcal H(\hat x) H(x^)有可能无解(拒绝预测)。若学习任务要求必须提供预测结果,该方法则退化为相对多数投票法
    H ( x ^ ) = { C k if   ∑ t = 1 T h t k ( x ^ ) > 1 2 ∑ t = 1 T ∑ k = 1 K h t k ( x ^ ) Reject Otherwise \mathcal H(\hat x) = \begin{cases} \begin{aligned} \mathcal C_k \quad \text{if }\text{ }\sum_{t=1}^{\mathcal T} h_t^{k}(\hat x) > \frac{1}{2} \sum_{t=1}^{\mathcal T}\sum_{k=1}^{\mathcal K} h_t^{k}(\hat x) \end{aligned} \\ \text{Reject} \quad \text{Otherwise} \end{cases} H(x^)= Ckif  t=1Thtk(x^)>21t=1Tk=1Khtk(x^)RejectOtherwise
  • 相对多数投票法 ( Plurality Voting ) (\text{Plurality Voting}) (Plurality Voting)。相比于绝对多数投票法,该方法就是将预测结果设置为投票最多的标签结果。若同时存在多个标签结果获得最高票数,从这些结果中随机选取一个即可:
    通常将‘绝对多数投票法’,‘相对多数投票法’统称为'多数投票法'
    { C ^ = C arg ⁡ max ⁡ k ∑ t = 1 T h t k ( x ^ ) H ( x ^ ) = C ^ \begin{cases} \hat {\mathcal C} = \mathcal C_{\mathop{\arg\max}\limits_{k} \sum_{t=1}^{\mathcal T} h_t^{k}(\hat x)}\\ \mathcal H(\hat x) = \hat {\mathcal C} \end{cases} C^=Ckargmaxt=1Thtk(x^)H(x^)=C^
  • 加权投票法。观察相对多数投票法所有学习器 h t ( ⋅ ) ( t = 1 , 2 , ⋯   , T ) h_t(\cdot) (t=1,2,\cdots,\mathcal T) ht()(t=1,2,,T)对某标签 C k \mathcal C_k Ck的权重结果均相同。加权投票法通过设置权重来区分各学习器的重要程度
    { H ( x ^ ) = C arg ⁡ max ⁡ k ∑ t = 1 T W t ⋅ h t k ( x ^ ) W t ≥ 0 ; ∑ t = 1 T W t = 1 \begin{cases} \mathcal H(\hat x) = \mathcal C_{\mathop{\arg\max}\limits_{k}\sum_{t=1}^{\mathcal T} \mathcal W_t \cdot h_t^{k}(\hat x)} \\ \begin{aligned} \mathcal W_t \geq 0;\sum_{t=1}^{\mathcal T} \mathcal W_t = 1 \end{aligned} \end{cases} H(x^)=Ckargmaxt=1TWthtk(x^)Wt0;t=1TWt=1

回顾:明可夫斯基距离

K-Means \text{K-Means} K-Means算法中介绍过明科夫斯基距离 ( Minkowski Distance ) (\text{Minkowski Distance}) (Minkowski Distance)。其是空间中两点 x ( i ) , x ( j ) x^{(i)},x^{(j)} x(i),x(j)之间距离的一种描述:
Dist m k ( x ( i ) , x ( j ) ) = [ ∑ k = 1 p ∣ x k ( i ) − x k ( j ) ∣ m ] 1 m \text{Dist}_{mk}(x^{(i)},x^{(j)}) = \left[\sum_{k=1}^p \left|x_k^{(i)} - x_k^{(j)}\right|^m\right]^{\frac{1}{m}} Distmk(x(i),x(j))=[k=1p xk(i)xk(j) m]m1
其中 p p p表示样本点 x ( i ) , x ( j ) x^{(i)},x^{(j)} x(i),x(j)随机变量/维度数量。当 m = 1 m=1 m=1时的明可夫斯基距离为曼哈顿距离 ( Manhattan Distance ) (\text{Manhattan Distance}) (Manhattan Distance)。也就是 L 1 L_1 L1范数:
Dist m a n ( x ( i ) , x ( j ) ) = ∑ k = 1 p ∣ x k ( i ) − x k ( j ) ∣ \text{Dist}_{man}(x^{(i)},x^{(j)}) = \sum_{k=1}^p |x_k^{(i)} - x_k^{(j)}| Distman(x(i),x(j))=k=1pxk(i)xk(j)
同理,当 m = 2 m=2 m=2时候的同理,当 m = 2 m=2 m=2时的明可夫斯基距离为欧式距离 ( Euclidean Distance ) (\text{Euclidean Distance}) (Euclidean Distance)。也就是 L 2 L_2 L2范数:
Dist e d ( x ( i ) , x ( j ) ) = ∑ k = 1 p ∣ x k ( i ) − x k ( j ) ∣ 2 \text{Dist}_{ed}(x^{(i)},x^{(j)}) = \sqrt{\sum_{k=1}^p |x_k^{(i)} - x_k^{(j)}|^2} Disted(x(i),x(j))=k=1pxk(i)xk(j)2

K \mathcal K K近邻算法

算法描述

K \mathcal K K近邻 ( K-Nearest Neighbor algorithm,KNN ) (\text{K-Nearest Neighbor algorithm,KNN}) (K-Nearest Neighbor algorithm,KNN)是一种常用的监督学习方法。它的工作流程可表示为如下形式:

  • 给定测试样本,以及训练数据集
  • 基于某种距离度量找出训练集内与其最接近的 K \mathcal K K个样本;
  • 基于该 K \mathcal K K个样本的信息对测试样本进行预测:
    关于不同任务,可以基于距离远近进行加权平均/加权投票。距离测试样本越近的样本点权重越大。
    • 如果是分类任务,关于测试样本的预测标签可使用投票法进行预测;
    • 如果是回归任务,关于测试样本的预测标签可用平均法进行预测。即使用 K \mathcal K K个样本标签信息的均值作为测试样本的预测结果。

假设我们使用 K \mathcal K K近邻算法处理一个分类任务,见下图:
基于不同K值的划分范围
其中 x t e s t x_{test} xtest表示测试样本点
分析过程中并没有使用‘加权投票’。

  • 褐色圆表示 K = 1 \mathcal K =1 K=1时的判别范围。其中包含蓝色点 1 1 1大于红色点 0 0 0,最终测试样本点 x t e s t x_{test} xtest判别为蓝色
  • 黑色圆表示 K = 3 \mathcal K = 3 K=3时的判别范围。其中包含蓝色点 1 1 1小于红色点 2 2 2,最终测试样本点 x t e s t x_{test} xtest被判别为红色
  • 蓝色圆表示 K = 5 \mathcal K = 5 K=5时的判别范围。其中包含蓝色点 2 2 2小于红色点 3 3 3,最终测试样本点 x t e s t x_{test} xtest被判别为红色

很显然, K \mathcal K K是一个重要参数,当 K \mathcal K K取不同值时,我们关于测试样本点的判别结果有可能存在差异;同理,如果使用不同的距离计算方式,可能会找到不同的近邻结果,从而会影响最终的判别结果。
上述示例中使用欧式距离作为距离计算方式。

K \mathcal K K值的选择

K \mathcal K K值自身的意义在于满足某种距离计算方式的条件下,符合条件的样本数量。这意味着 K \mathcal K K是一个 > 0 >0 >0的整数:

  • 如果选择较小 K \mathcal K K值,这意味着选择样本的方式是局部的——只有与测试样本点最近似的 K \mathcal K K个样本点才会对预测结果起作用,这会出现:我们可能并没有对分布进行完整的认识,仅使用很小一部分子集对测试样本进行判别。这种做法会使得预测结果的偏差很小/很准确,但预测结果的方差很大(相同类别的测试样本可能因各自的小子集结果不同而产生不同的判别结果),从而容易发生过拟合 ( Over-Fitting ) (\text{Over-Fitting}) (Over-Fitting)现象
  • 相反,如果选择较大 K \mathcal K K值,此时的选择样本的方式是宽泛的。如果 K \mathcal K K过大,会导致与测试样本点不相似 的其他样本点涵盖进来,从而对大范围的样本进行投票/均值。这会导致回归任务中,两个特征相差较大的样本点经过 K \mathcal K K值的平均操作,反而相差不大。这意味着预测结果的方差很小。从而容易发生欠拟合 ( Under-Fitting ) (\text{Under-Fitting}) (Under-Fitting)现象
  • K \mathcal K K值大到极限,此时 K \mathcal K K等于样本点总数 N N N。以分类任务为例,每一次判别测试样本点的类别信息时,要将所有样本点放在一起去投票。由于训练集内的样本相对于真实分布是不完整的,而我们此时通过各类别样本数量多少来判别结果,这明显是不合理的。

小插曲:懒惰学习与急切学习

上面介绍了 K \mathcal K K近邻算法的执行过程。我们发现它和其他算法的不同之处在于—— K \mathcal K K近邻算法没有显式的训练过程/没有训练所谓的模型。直接是已知样本空间,将测试样本点放入样本空间中找到对应位置,通过最近的 K \mathcal K K个样本点判别测试样本点信息

  • 我们称这种训练代价为零,待收到测试样本后再进行处理的方式称作懒惰学习 ( Lazy Learning ) (\text{Lazy Learning}) (Lazy Learning)
  • 相反,那些在训练阶段就对样本进行学习和处理的算法(如神经网络等),被称作急切学习 ( Eager Learning ) (\text{Eager Learning}) (Eager Learning)

它们各自的特点也是十分明显的:

  • 急切学习虽然在训练过程中耗费了时间进行训练,但在测试/决策过程中花费时间几乎为 0 0 0。此时消耗的内存空间也因训练时模型参数的固定而确定
  • 懒惰学习没有训练过程,但在决策过程消耗时间较长。就以 KNN \text{KNN} KNN自身为例。仅仅计算测试样本点最近的 K \mathcal K K个样本的信息,就需要对训练集内的所有样本点进行 距离计算排序决策时间较慢(时间复杂度较大),占用内存空间比较大。

KD \text{KD} KD树描述及示例

懒惰学习部分,介绍了 KNN \text{KNN} KNN执行过程中的缺陷训练集和测试样本点均已知的条件下,想要找到某种距离计算方式下最近的 K \mathcal K K样本点,它的计算代价较高。

KD \text{KD} KD( K-Dimension Tree,KD-Tree \text{K-Dimension Tree,KD-Tree} K-Dimension Tree,KD-Tree)则给出了一种对样本索引的方式。其底层逻辑就是将整个样本空间有层次地 进行划分,然后通过索引在特定空间寻找合适样本。

KD \text{KD} KD是一棵平衡二叉树。这里通过示例对 KD \text{KD} KD以及对应样本空间进行描述:

  • 已知某二维样本空间包含 6 6 6样本点 D = { ( 2 , 3 ) , ( 5 , 4 ) , ( 9 , 6 ) , ( 4 , 7 ) , ( 8 , 1 ) , ( 7 , 2 ) } \mathcal D = \{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)\} D={(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},其对应图像表示如下:
    样本空间——初始化

  • 确定划分 ( Split ) (\text{Split}) (Split)域:基于当前样本两个维度的方差分别表示为: x : 5.81 , y : 4.47 x:5.81,y:4.47 x:5.81,y:4.47 x x x维度的方差大这意味着沿着该维度方向进行数据分割能够获得最好的分辨率。最终选择 x x x维度(横坐标)作为划分域。

  • 确定了划分域后,确定初始划分结点 ( Node-Data ) (\text{Node-Data}) (Node-Data):将样本点按照 x x x维度数值从小到大排序,位于中间的样本点被选择为 Node-Data \text{Node-Data} Node-Data。该数据集基于 x x x维度的排序结果表示如下:
    [ ( 2 , 3 ) , ( 4 , 7 ) , ( 5 , 4 ) , ( 7 , 2 ) , ( 8 , 1 ) , ( 9 , 6 ) ] [(2,3),(4,7),(5,4),(7,2),(8,1),(9,6)] [(2,3),(4,7),(5,4),(7,2),(8,1),(9,6)]
    这里中间样本点包含两个 ( 5 , 4 ) , ( 7 , 2 ) (5,4),(7,2) (5,4),(7,2),选择哪个都可以建树。这里以 ( 7 , 2 ) (7,2) (7,2) Node-Data \text{Node-Data} Node-Data示例。
    一般情况下取上界。

  • ( 7 , 2 ) (7,2) (7,2)作为 KD \text{KD} KD树的根节点,并以 Node-Data \text{Node-Data} Node-Data x x x维度为界,对样本空间进行划分:
    第一次划分

  • 此时将样本空间划分为两个部分。各部分内部的样本点重复执行上述划分过程。再次以样本子集 { ( 2 , 3 ) , ( 4 , 7 ) , ( 5 , 4 ) } \{(2,3),(4,7),(5,4)\} {(2,3),(4,7),(5,4)}为例:

    确定划分域: x : 1.56 , y : 2.89 x:1.56,y:2.89 x:1.56,y:2.89
    确定划分结点 [ ( 2 , 3 ) , ( 5 , 4 ) , ( 4 , 7 ) ] ⇒ ( 5 , 4 ) [(2,3),(5,4),(4,7)] \Rightarrow (5,4) [(2,3),(5,4),(4,7)](5,4),并以其 y y y维度为界,对子空间进行划分
    第二次划分

  • 以此类推,可得到最终划分结果以及对应 KD \text{KD} KD以及 KD \text{KD} KD表示如下:
    相同颜色的划分边界对应 KD \text{KD} KD树中的相同层。
    最终划分结果
    同理。如果步骤1选择 ( 5 , 4 ) (5,4) (5,4)作为根结点,那么对应结果表示为:
    其他划分结果

K \mathcal K K近邻  VS  \text{ VS }  VS 贝叶斯最优分类器

这里观察 K \mathcal K K近邻算法与贝叶斯最优分类器关于错误率 ( Error Rate ) (\text{Error Rate}) (Error Rate)的描述,并比较它们直接按的大小关系

这里假设距离度量得到的结果是有效的,并且仅以 K = 1 \mathcal K=1 K=1条件下在二分类问题错误率上的简单描述。

  • 定义某测试样本 x ^ \hat x x^,在 K = 1 \mathcal K=1 K=1条件下的最近邻样本点 Z \mathcal Z Z。这意味着,样本 x ^ \hat x x^强行 Z \mathcal Z Z的标签 C \mathcal C C相同:
    从‘软投票’的角度观察, x ^ \hat x x^对于所有具体标签值的概率结果均与 Z \mathcal Z Z相同。
    P ( C ∣ x ^ ) = P ( C ∣ Z ) C ∈ Y \mathcal P(\mathcal C \mid \hat x) = \mathcal P(\mathcal C \mid \mathcal Z) \quad \mathcal C \in \mathcal Y P(Cx^)=P(CZ)CY
  • 那么对应的错误率表示为:
    错误就意味着测试样本 x ^ \hat x x^与样本 Z \mathcal Z Z标记不同类别标签的概率。即 1 − 1 - 1它们标记相同标签的概率。
    P ( e r r ) = 1 − ∑ C ∈ Y P ( C ∣ x ^ ) ⋅ P ( C ∣ Z ) \mathcal P(err) = 1 - \sum_{\mathcal C \in \mathcal Y} \mathcal P(\mathcal C \mid \hat x) \cdot \mathcal P(\mathcal C \mid \mathcal Z) P(err)=1CYP(Cx^)P(CZ)
  • 如果使用贝叶斯最优分类器来描述测试样本 x ^ \hat x x^的最优标签结果 C ∗ \mathcal C^* C,那么 C ∗ \mathcal C^* C可表示为:
    C ∗ = arg ⁡ max ⁡ C ∈ Y P ( C ∣ x ^ ) ⇔ P ( C ∗ ∣ x ^ ) = max ⁡ C ∈ Y P ( C ∣ x ^ ) \mathcal C^* = \mathop{\arg\max}\limits_{\mathcal C \in \mathcal Y} \mathcal P(\mathcal C \mid \hat x) \Leftrightarrow \mathcal P(\mathcal C^* \mid \hat x) = \mathop{\max}\limits_{\mathcal C \in \mathcal Y} \mathcal P(\mathcal C \mid \hat x) C=CYargmaxP(Cx^)P(Cx^)=CYmaxP(Cx^)
  • 至此, P ( e r r ) \mathcal P(err) P(err)可表示为如下形式:首先将 P ( C ∣ x ^ ) = P ( C ∣ Z ) \mathcal P(\mathcal C \mid \hat x) = \mathcal P(\mathcal C \mid \mathcal Z) P(Cx^)=P(CZ)带入 P ( e r r ) \mathcal P(err) P(err)中:
    P ( e r r ) = 1 − ∑ C ∈ Y P ( C ∣ x ^ ) ⋅ P ( C ∣ Z ) = 1 − ∑ C ∈ Y [ P ( C ∣ x ^ ) ] 2 \begin{aligned} \mathcal P(err) & = 1 - \sum_{\mathcal C \in \mathcal Y} \mathcal P(\mathcal C \mid \hat x) \cdot \mathcal P(\mathcal C \mid \mathcal Z) \\ & = 1 - \sum_{\mathcal C \in \mathcal Y} \left[\mathcal P(\mathcal C \mid \hat x)\right]^2 \end{aligned} P(err)=1CYP(Cx^)P(CZ)=1CY[P(Cx^)]2
    关于 ∑ C ∈ Y [ P ( C ∣ x ^ ) ] 2 \sum_{\mathcal C \in \mathcal Y} \left[\mathcal P(\mathcal C \mid \hat x)\right]^2 CY[P(Cx^)]2 [ P ( C ∗ ∣ x ^ ) ] 2 \left[\mathcal P(\mathcal C^* \mid \hat x)\right]^2 [P(Cx^)]2之间的大小关系。很明显, [ P ( C ∗ ∣ x ^ ) ] 2 \left[\mathcal P(\mathcal C^* \mid \hat x)\right]^2 [P(Cx^)]2 ∑ C ∈ Y [ P ( C ∣ x ^ ) ] 2 \sum_{\mathcal C \in \mathcal Y} \left[\mathcal P(\mathcal C \mid \hat x)\right]^2 CY[P(Cx^)]2内的一项,自然 [ P ( C ∗ ∣ x ^ ) ] 2 ≤ ∑ C ∈ Y [ P ( C ∣ x ^ ) ] 2 \left[\mathcal P(\mathcal C^* \mid \hat x)\right]^2\leq\sum_{\mathcal C \in \mathcal Y} \left[\mathcal P(\mathcal C \mid \hat x)\right]^2 [P(Cx^)]2CY[P(Cx^)]2。从而有:
    P ( e r r ) ≤ 1 − [ P ( C ∗ ∣ x ^ ) ] 2 \mathcal P(err) \leq 1 - [\mathcal P(\mathcal C^* \mid \hat x)]^2 P(err)1[P(Cx^)]2
    使用乘法分配律将其展开,其中 1 − P ( C ∗ ∣ x ^ ) 1 - \mathcal P(\mathcal C^* \mid \hat x) 1P(Cx^)表示贝叶斯最优分类器的错误率。且 P ( C ∗ ∣ x ^ ) ≤ 1 \mathcal P(\mathcal C^* \mid \hat x) \leq 1 P(Cx^)1恒成立。因而有:
    P ( e r r ) ≤ [ 1 + P ( C ∗ ∣ x ^ ) ] ⋅ [ 1 − P ( C ∗ ∣ x ^ ) ] ≤ 2 × [ 1 − P ( C ∗ ∣ x ^ ) ] \begin{aligned} \mathcal P(err) & \leq [1 + \mathcal P(\mathcal C^* \mid \hat x)] \cdot [1 - \mathcal P(\mathcal C^* \mid \hat x)] \\ & \leq 2 \times [1 - \mathcal P(\mathcal C^* \mid \hat x)] \end{aligned} P(err)[1+P(Cx^)][1P(Cx^)]2×[1P(Cx^)]

这意味着 KNN \text{KNN} KNN泛化错误率不超过贝叶斯最优分类器的两倍。

相关参考:
详细的 KNN \text{KNN} KNN算法原理步骤
一看就懂的K近邻算法(KNN),K-D树,并实现手写数字识别!
机器学习(周志华著)

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

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

相关文章

汽车基础软件信息安全与AUTOSAR

AUTOSAR 信息安全框架和关键技术分析 随着汽车网联化和智能化,汽车不再孤立,越来越多地融入到互联网中。在这同时,汽车也慢慢成为潜在的网络攻击目标,汽车的网络安全已成为汽车安全的基础,受到越来越多的关注和重视。AUTOSAR 作为目前全球范围普遍认可的汽车嵌入式软件架…

HDFS FileSystem 导致的内存泄露

目录 一、问题描述 二、问题定位和源码分析 一、问题描述 ftp程序读取windows本地文件写入HDFS,5天左右程序 重启一次,怀疑是为OOM挂掉,马上想着就分析 GC日志了。 ### 打印gc日志 /usr/java/jdk1.8.0_162/bin/java \-Xmx1024m -Xms512m …

Net2FTP搭建免费web文件管理器『打造个人网盘』

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 前言 文件传输可以说是互联网最主要的应用之一,特别是智能设备的大面积使用,无论是个人存储文件资料,还是商业文件流转&#xff0c…

老杨说运维 | 数智时代,运维一体化如何落地实践?

在IT运维的发展过程中,随着分布式架构的加速推进,云原生技术加入应用,运维工具相比过去呈现出了更高强度的进化态势,即从多个相对独立的软件向EA形态的一体化系统进化。本次樱花论坛正是基于这一新的变革点,邀请了行业…

(十二)rk3568 NPU 中部署自己训练的模型,(2)模型转换

对于rknn 模型部署,本人使用*.pt -> *.onnx -> *.rknn的方式。 一、首先是pt文件到onnx文件的转换。 onnx文件导出时,需要修改models/yolo.py文件中的后处理部分。 注意:在训练时不要修改yolo.py的这段代码,训练完成后使用export.py进行模型导出转换时一定要进行修…

RHCE第六次作业

目录 一、编写脚本for1.sh,使用for循环创建20账户,账户名前缀由用户从键盘输入,账户初始密码由用户输入,例如: test1、test2、test3、.....、 test10 1.创建脚本for1.sh 2.执行脚本并查看是否创建成功 二、编写脚本for2.sh,使用for循环,通过…

微积分:微分

目录 1.代数推导 2.几何推导 3.总结 1.代数推导 假设我们有一个正方形初始边长为X,这时面积S1x 然后正方形的边长增加△x,此时面积S2(x△x) 变化的面积大小是△s(x△x)- x2x△x(△x&#x…

软件测试外包干了4年,感觉废了..

先说一下自己的情况,大专生,18年通过校招进入湖南某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

c++算法——枚举法

枚举概念 枚举法是通过计算机速度快的特点,对问题所有可能性进行枚举,从中找到答案,需要利用循环。 例题 1,简单数字谜 题目描述 在□内填上一个合适的相同的数字,使等式“□365283□8256”成立。 输入格式 无 输出…

5.2 构造数值积分公式的基本方法与有关概念

学习目标: 如果要学习构造数值积分公式的基本方法与有关概念,可以遵循以下步骤: 1.了解数值积分的基本概念和性质:包括积分的定义、积分的性质、数值积分的定义及其误差等。这可以通过课本或相关的学习资料来了解。 2.掌握构造…

ubuntu 安装vmware tool(优先安装最新ubantu,可以不安装vmware tools)

1在虚拟机种站到安装vmware-tools 然后重启虚拟机 2在磁盘中可以看到如下文件,将zip文件移动到桌面解压备用 3关闭虚拟机 找到编辑虚拟机设置 4点击左侧 CD/dvd(SATA) 如果是使用镜像文件,改成使用物理驱动器. 5 打开命令行 cd 桌面 (如…

yara规则--构建yara规则库

零、快速构建yara规则库的方案 Yara官方预置的规则库,链接 https://github.com/Yara-Rules/rules ClamAV的特征码转换为yara规则,利用工具clamav_to_yara.py将clamav的特征码转换为yara规则 从yara-generator爬取别人上传的样本的规则 利用 yarGen工具 …

电容笔和触控笔有什么区别?2023平价好用的电容笔测评

无论是导电的材料,还是工作的原理,还是操作的方式,甚至是价格,电容笔都和一般的触控笔有着明显的区别。电容笔具有更小的笔尖,并且具有更好的耐磨性。而且现在科技进步很快,IPAD的市场也越来越大&#xff0…

【蓝桥杯省赛真题18】python阴影图形面积 青少年组蓝桥杯python编程省赛真题解析

目录 python阴影图形面积 一、题目要求 1、编程实现 2、输入输出

Linux-零拷贝及Java实现

RabbitMQ比RocketMQ、Kafka较慢点一点重要原因就是 零拷贝 什么是零拷贝? 零拷贝指的是在进行IO的时候减少或避免让CPU拷贝数据(数据在IO缓冲区中进行拷贝) 零拷贝的优点: 减少甚至完全避免不必要的CPU拷贝,从而让C…

paddlepaddle 的 CPU 和 GPU

想记录一下一个 bug 改了一上午改到最后发现并没有 bug 的 bug。 总结: 因为下午要跑很久,为了省 GPU 算力,我想上午先用 CPU 把数据处理部分跑出来(感觉数据处理部分不像网络训练那样涉及太多计算,所以感觉用 CPU 就…

JavaWeb开发 —— MyBatis动态SQL

目录 一、XML映射文件 1. 介绍 2. MyBatisX插件 二、MyBatis动态SQL 1. if 2. foreach 3. sql & include 一、XML映射文件 1. 介绍 ① XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名…

【Java EE】-网络编程(三) TCP/IP协议详解

作者:学Java的冬瓜 博客主页:☀冬瓜的主页🌙 专栏:【JavaEE】 主要内容:应用层HTTP协议、DNS域名解析系统、传输层UDP协议,TCP协议。TCP协议的工作机制:确认应答、超时重传、连接管理、滑动窗口…

【Linux】MySQL高可用之读写分离监控实践

一、Mycat-web安装配置 1、Mycat节点安装zookeeper(在mycat实现了读写分离上安装) ① 解压zookeeper压缩包 tar -zxvf zookeeper-3.4.14.tar.gz -C /opt/② cd到cnf目录下将文件复制 ③ cd到bin目录下启动 ./zkServer.sh start2、Mycat节点安装mycat-we…

跨境卖家不可错过的2023开斋节选品和营销技巧,轻松拓展海外市场

开斋节是穆斯林世界最重要的节日之一,同时也是跨境电商一个非常重要的销售节点。在这个节日期间,跨境卖家可以通过合适的选品和营销策略吸引更多的消费者,提高销售额。本文将探讨2023年跨境卖家在开斋节期间如何做好选品和营销。 一、选品 1…