文章目录

  • 维数灾难的提出背景
  • 维数灾难的内涵
    • 数据稀疏性
    • 距离聚集性
  • 数据降维
    • Principal Components Analysis
      • 最大方差思想
      • 最小均方误差思想
      • 使用 SVD 处理高维数据
      • 相关系数矩阵
      • 结果分析
        • 贡献率
        • 被提取率
    • Stochastic Neighbor Embedding
    • Visualizing Data using t-SNE
      • 对称 SNE
      • t-SNE
  • 参考资料

维数灾难的提出背景

1957年,数学家 Richard Bellman 在研究动态规划问题时首次提出了维数灾难(curse of dimensionality)的概念,用于描述高维空间中的一系列数学现象。例如,高维数据会带来指数级增长的计算复杂度,在 GPU 广泛应用之前严重限制了算法的可应用性。

维数灾难的内涵

维数灾难描述了与高维数据相关的一系列数学现象。特别地,在机器学习领域,维数灾难通常指数据集维数和数据集大小之间的指数级关系。机器学习算法将一组特征作为输入,这些特征可能具有许多不同类别的变量。以临床医学机器学习为例,特征可能包括患者人口统计数据(例如年龄、性别、体重)、临床特征(例如 CRP、心率、体温)或来自医学成像的信息(例如每个单独像素的灰度值)。一个数据集的维数,指的是数据集中属性或特征的数量。当数据集的维数达到一定规模,就被称为高维数据。一般来说,随着特征数量的增长,机器模型训练算法所需的样本数量呈指数级增长。由于高维数据而导致训练机器学习模型的困难被称为“维度灾难”。 下面介绍维数灾难的两个重要方面:数据稀疏性(data sparsity)和距离聚集性(distance concentration)。

数据稀疏性

经过训练的机器学习模型可以预测给定输入数据样本的标签。在训练模型时,使用部分数据用于训练模型,其余数据用于评估模型的泛化性能。泛化性能是指模型对于训练集以外的数据样本的预测准确率。泛化性能强的模型对测试数据的预测准确度应该非常接近其在训练数据上的准确度。

建立泛化模型的一种有效方法是捕获预测变量值和相应目标的不同可能组合。例如,一个数据集包含两个特征:性别和年龄段。理想情况下,我们应该捕获两个属性值的所有可能组合的目标。对于两种性别和四个年龄段,我们需要 8 个训练样本来覆盖所有可能组合。如果目标取决于第三个属性,比如体型,覆盖所有组合所需的训练样本数量会显着增加。这个例子表明,随着特征数量的增加,泛化模型所需的训练样本数量也显着增加。

实际应用中,可用的训练样本可能没有观察到所有属性组合的目标。 这是因为某些组合比其他组合出现的概率更高。训练样本没有捕获所有组合的性质在高维数据中被称为“数据稀疏性”或简称为“稀疏性”。数据稀疏性是维度灾难的一个方面。用稀疏数据训练模型可能会导致高方差或过拟合情况。这是因为在训练模型时,模型已经从频繁出现的属性组合中学习,并且可以准确地预测结果。当将不太频繁出现的组合实时输入模型时,它可能无法准确预测结果。

距离聚集性

维数灾难的另一个方面是距离聚集性。随着数据维数的增加,任意两个样本之间的距离会趋于相同。因此,高维空间中的距离度量可能无法反应样本之间的相似性。对于一些基于距离度量的机器学习模型,例如聚类算法,在低维空间中验证有效的距离度量可能不是用于高维空间。

数据降维

数据降维是解决维数灾难的有效方法之一,下面介绍数据降维中常用的 PCA 和 t-SNE 方法。数据降维的目的是将高维空间的一系列数据点 x1,x2,⋯,xm\mathbf{x}_1, \mathbf{x}_2, \cdots, \mathbf{x}_mx1,x2,,xm 映射到低维空间 y1,y2,⋯,ym\mathbf{y}_1, \mathbf{y}_2, \cdots, \mathbf{y}_my1,y2,,ym ,同时最大程度保留数据集信息。一般来说,低维空间的维数远小于原高维空间的维数 nnn

Principal Components Analysis

PCA 尝试寻找 nnn 维原空间的一个 MMM 维子空间,使样本集在其上的投影保留了尽量多的信息。在 PCA 之前,我们首先需要对数据集归一
xi←xi−xˉx_i \leftarrow x_i - \bar x xixixˉ

使用设计矩阵的定义 X=[x1,x2,…,xm]T∈Rm×nX = [x_1, x_2,\dots,x_m]^T \in \R^{m \times n}X=[x1,x2,,xm]TRm×n 我们可以完成从原空间到子空间的映射
Y=XPY = XP Y=XP

其中 P=[u1,u2,…,uM]∈Rn×MP = [u_1, u_2, \dots, u_M] \in \R^{n \times M}P=[u1,u2,,uM]Rn×M 是由一组单位正交向量构成的变换矩阵。对于保留尽量多的原始信息这一目标,存在着下面两种理解

  1. YYY 的样本方差尽可能大
  2. YYY 恢复到原空间后偏差尽可能小

下面将会证明这两种理解是等价的。

最大方差思想

首先考虑 M=1M = 1M=1 的情况,也就是样本集被映射为一维空间的一组数。因为变换矩阵 P=[u1]∈Rn×1P = [u_1] \in \R^{n \times 1}P=[u1]Rn×1 ,所以算法只需找到一个向量 u=u1u = u_1u=u1 满足
max⁡u∣∣Xu∣∣2/ms.t.uTu=1\begin{array}{rl} \max\limits_u & ||Xu||^2 / m\\ s.t. & u^Tu = 1 \end{array} umaxs.t.Xu2/muTu=1

样本集的协方差矩阵表示为
Σ=1mXTX\Sigma = \frac{1}{m} X^TX Σ=m1XTX

则优化目标可以化为 uTΣuu^T\Sigma uuTΣu 。应用拉格朗日乘数法可以得到
∂∂u(uTΣu+λ(uTu−1))=Σu+λu=0\frac{\partial}{\partial u} (u^T\Sigma u + \lambda(u^Tu - 1)) = \Sigma u + \lambda u = 0 u(uTΣu+λ(uTu1))=Σu+λu=0

因此 uuuλ\lambdaλ 分别是 Σ\SigmaΣ 的特征向量和对应特征值。重新考察目标函数
uTΣu=λuTu=λu^T\Sigma u = \lambda u^Tu = \lambda uTΣu=λuTu=λ

也就是说,样本在特征向量 uuu 方向上的投影,所构成的样本集的方差即为其特征值。因此 uuu 应该是 Σ\SigmaΣ 的最大特征值对应的特征向量,称为 first principal components 。一般地对于 M≠1M \ne 1M=1 的情况,可以循环地执行以下步骤

  1. 选取原空间中的第一主成分 uuu
  2. 取原空间对于向量 uuu 的补空间作为下一次循环的原空间

最小均方误差思想

假设存在原空间的某个坐标系 [u1,u2,…,un][u_1, u_2, \dots, u_n][u1,u2,,un] ,取其中前 MMM 个坐标轴 [u1,u2,…,uM][u_1, u_2, \dots, u_M][u1,u2,,uM] 构成子空间坐标变换矩阵 PPP 。不妨设某个样本 xxx 在这样的坐标系下具有坐标 (x1,x2,…,xn)(x_1, x_2, \dots, x_n)(x1,x2,,xn) ,则容易证明其对应的 y=(x1,x2,…,xM)y = (x_1, x_2, \dots, x_M)y=(x1,x2,,xM)

现在我们希望找到一种方法使 yyy 恢复到原空间,并与 xxx 尽可能一致。但是由于缺少 xM+1,xM+2,…,xnx_{M + 1}, x_{M + 2}, \dots, x_nxM+1,xM+2,,xn 的信息,我们只能用其均值 000 来进行估计。也就是说重构得到的向量
x~=(y1,y2,…,yM,0,…,0)\tilde x = (y_1, y_2, \dots, y_M, 0, \dots, 0) x~=(y1,y2,,yM,0,,0)

这时就会引入重构误差
J=∣∣x−x~∣∣2=∑i=M+1nxi2=∑i=M+1nuiTxxTuiJ = ||x - \tilde x||^2 = \sum\limits_{i = M + 1}^n x_i^2 = \sum\limits_{i = M + 1}^n u_i^Txx^Tu_i J=xx~2=i=M+1nxi2=i=M+1nuiTxxTui

对于所有样本,均方误差的定义如下
J=∑i=M+1nuiTΣuiJ = \sum\limits_{i = M + 1}^n u_i^T \Sigma u_i J=i=M+1nuiTΣui

接下来的讨论与最大方差思想类似。不同点在于这里需要选出 n−Mn - MnM 个特征向量使特征值最小。这些特征向量将作为补空间的一组基,而子空间的基则是剩余的 MMM 个主成分。因此在结论上,最小均方误差思想和最大方差思想一致。

使用 SVD 处理高维数据

模型求解可以通过 SVD 完成,但是对于高维数据 n≫mn \gg mnm 计算量会大一些。对于这种情况我们可以计算矩阵 XXTXX^TXXT 的特征值 λ\lambdaλ 和特征向量 uuu 。这个矩阵的维数是 mmm 因此比较容易计算。算出来之后可以证明
XTX(XTu)=XT⋅λuX^TX(X^Tu) = X^T\cdot \lambda u XTX(XTu)=XTλu

因此 XTuX^TuXTu 即为 Σ\SigmaΣ 的特征向量,同时特征值 λ\lambdaλ 并没有改变。因为
∣∣Avi∣∣2=(Avi)TAvi=viTATAvi=viT(λivi)=λi\begin{array}{rcl} ||Av_i||^2 &=& (Av_i)^TAv_i\\ &=& v_i^TA^TAv_i\\ &=& v_i^T(\lambda_iv_i)\\ &=& \lambda_i \end{array} Avi2====(Avi)TAviviTATAviviT(λivi)λi

所以有 ∣∣XTu∣∣2=λ||X^Tu||^2 = \lambdaXTu2=λ 。归一化可得特征向量
v=XTuλv = \frac{X^Tu}{\sqrt{\lambda}} v=λ

XTu

相关系数矩阵

如果原空间中数据的各个特征量纲不同,可以使用数据的相关系数矩阵代替原数据。但是计算相关系数时,需要保证特征的标准差非零。当且仅当某个特征的取值为常数,其标准差才会为零。因此可以将标准差为零的特征提前删除,而不会造成误差。

结果分析

Fj=XujF_j = Xu_jFj=Xuj 表示第 jjj 个主成分的取值。不难证明
FiTFj=uiTXTXuj={mλji=j0i≠jF_i^TF_j = u_i^TX^TXu_j = \begin{cases} m\lambda_j & i = j\\ 0 & i \ne j \end{cases} FiTFj=uiTXTXuj={mλj0i=ji=j

因为 XXX 经过了归一化,因此
Var(Fj)=λjCov(Fi,Fj)=0\begin{array}{rcl} Var(F_j) &=& \lambda_j\\ Cov(F_i, F_j) &=& 0 \end{array} Var(Fj)Cov(Fi,Fj)==λj0

贡献率

从最大方差的角度思考,我们的目标是最大化 ∑j=1MVar(Fj)\sum_{j = 1}^M Var(F_j)j=1MVar(Fj) 。因此某个主成分对整体的贡献可以被 λ\lambdaλ 所度量。定义第 jjj 主成分贡献率
cj=λj∑j=1nλjc_j = \frac{\lambda_j}{\sum_{j = 1}^n \lambda_j} cj=j=1nλjλj

不难看出随着 jjj 的增大,贡献率在逐渐减小,但累积贡献率 ∑i=1jci\sum_{i = 1}^j c_ii=1jci 却在增大。实际应用中,一般对累积贡献率设定某个阈值 ξ\xiξ 来确定主成分的个数。

被提取率

对于原数据中的每个特征,其信息可能分散到多个主成分中
x=[u1,u2,…,un]yx = [u_1, u_2, \dots, u_n]y x=[u1,u2,,un]y

我们同样使用方差作为信息的度量,设
Var(xi)=σi2=Var(∑j=1n(uj)iFj)=∑j=1n(uj)i2λjVar(x_i) = \sigma_i^2 = Var\left(\sum_{j = 1}^n (u_j)_iF_j\right) = \sum_{j = 1}^n (u_j)_i^2\lambda_j Var(xi)=σi2=Var(j=1n(uj)iFj)=j=1n(uj)i2λj

其中 (uj)i(u_j)_i(uj)i 表示主成分 uju_juj 的第 iii 个元素。定义
Ωi=∑j=1M(uj)i2λjσi2\Omega_i = \sum_{j = 1}^M \frac{(u_j)_i^2\lambda_j}{\sigma_i^2} Ωi=j=1Mσi2(uj)i2λj

为特征 xix_ixi 的被提取率。事实上相关系数
ρ(xi,Fj)=(uj)iλjσi\rho(x_i, F_j) = \frac{(u_j)_i\sqrt{\lambda_j}}{\sigma_i} ρ(xi,Fj)=σi(uj)iλj

因此被提取率还可以被定义为
Ωi=∑j=1Mρ2(xi,Fj)\Omega_i = \sum_{j = 1}^M \rho^2(x_i, F_j) Ωi=j=1Mρ2(xi,Fj)

Stochastic Neighbor Embedding

SNE 方法由 Hinton 于 2002 年提出,其基本思想是在低维空间中保持样本在原高维空间中的距离分布。具体来说,对于样本对 (i,j)(i, j)(i,j) ,使用 dijd_{ij}dij 表示其距离。 SNE 使用类似 Softmax 的方式激活距离度量

pij=exp⁡(−dij2)∑k≠iexp⁡(−dik2),p_{i j}=\frac{\exp \left(-d_{i j}^{2}\right)}{\sum_{k \neq i} \exp \left(-d_{i k}^{2}\right)}, pij=k=iexp(dik2)exp(dij2),

类似地,低维空间中的距离度量表示为

qij=exp⁡(−d~ij2)∑k≠iexp⁡(−d~ik2),q_{i j}=\frac{\exp \left(-\tilde d_{i j}^{2}\right)}{\sum_{k \neq i} \exp \left(-\tilde d_{i k}^{2}\right)}, qij=k=iexp(d~ik2)exp(d~ij2),

其中 d~ij\tilde d_{ij}d~ij 表示样本对 (i,j)(i, j)(i,j) 在低维空间中的距离。 为了保持降维前后,样本之间的距离关系,SNE 最小化 pijp_{ij}pijqijq_{ij}qij 之间的 KL 散度

C=∑iKL(Pi∥Qi)=∑ijpijlog⁡pijqij.C = \sum_{i} KL(P_i\|Q_i) = \sum_{ij} p_{ij}\log\frac{p_{ij}}{q_{ij}}. C=iKL(PiQi)=ijpijlogqijpij.

距离度量 dijd_{ij}dij 可以作为输入,也可以通过高维空间的样本计算出来

dij2=∥xi−xj∥22σi2,d_{i j}^{2}=\frac{\left\|\mathbf{x}_{i}-\mathbf{x}_{j}\right\|^{2}}{2 \sigma_{i}^{2}}, dij2=2σi2xixj2,

其中 xix_ixixjx_jxj 分别表示样本 iiijjj 在高维空间中的特征表示。σi\sigma_iσi 可以人工设置,也可以通过求解 log⁡k=H(Pi)=−∑jpijlog⁡pij\log k = H(P_i) = -\sum_{j} p_{ij} \log p_{ij}logk=H(Pi)=jpijlogpij 得到,其中 kkk 是一个手工设置的超参数,称为困惑度(perplexity)。类似地,低维空间中的距离定义为

d~ij2=∥yi−yj∥2,\tilde d_{i j}^{2}=\left\|\mathbf{y}_{i}-\mathbf{y}_{j}\right\|^{2}, d~ij2=yiyj2,

其中 yi\mathbf{y}_iyiyj\mathbf{y}_jyj 分别表示样本 iiijjj 在低维空间中的特征表示。

Visualizing Data using t-SNE

针对 SNE 方法的两个问题

  1. 损失函数难以优化
  2. 拥挤问题(crowding problem)

t-SNE 做出了两点改进

  1. 将高维空间的距离度量改为对称形式,以简化 SNE 损失函数的梯度
  2. 将低维空间的距离度量改为学生 t 分布

对称 SNE

SNE 方法中,样本对 (i,j)(i, j)(i,j) 的距离度量 pijp_{ij}pij 和样本对 (j,i)(j, i)(j,i) 的距离度量 pjip_{ji}pji 不相等,这是因为 σi\sigma_iσiσj\sigma_jσj 不相等导致的。一个直观的想法是对所有样本对使用相同的 σ\sigmaσ 。但是当数据集中存在离群点时,这样的修改会带来问题。设 xi\mathbf{x}_ixi 是一个离群点,则对于任意一个样本 xj\mathbf{x}_jxjpijp_{ij}pij 的值很小。因此 yi\mathbf{y}_iyi 的位置基本不影响 SNE 的损失函数,导致 yi\mathbf{y}_iyi 无法反应 xi\mathbf{x}_ixi 所包含的信息。

为了解决这个问题,对称 SNE 重新定义邻居概率为

pij←pij+pji2.p_{ij} \leftarrow \frac{p_{ij} + p_{ji}}{2}. pij2pij+pji.

需要注意,这一定义只对高维空间中的距离度量生效,因为低维空间的距离度量已经是对称形式了。对称 SNE 的损失函数具有简单的梯度函数

δCδyi=4∑j(yi−yj)(pij−qij).\frac{\delta C}{\delta \mathbf{y}_{i}}=4 \sum_{j}\left(\mathbf{y}_{i}-\mathbf{y}_{j}\right)\left(p_{i j}-q_{i j}\right). δyiδC=4j(yiyj)(pijqij).

作为对比, SNE 的损失函数如下

∂C∂yi=2∑j(yi−yj)(pij−qij+pji−qji).\frac{\partial C}{\partial \mathbf{y}_{i}}=2 \sum_{j}\left(\mathbf{y}_{i}-\mathbf{y}_{j}\right)\left(p_{i j}-q_{i j}+p_{j i}-q_{j i}\right). yiC=2j(yiyj)(pijqij+pjiqji).

t-SNE

t-SNE 方法是 SNE 方法的改进,同样由 Hinton 提出。想象二维曲线流形上的一系列点,将其映射到高维空间中。下图中的“瑞士卷”数据集就是这样的一个例子。显然,我们可以在二维空间中重建这些点之间的距离关系。

下面想象一个十维空间中的流形(例如 MNIST 手写数字数据集),将其表示为高维空间中的一系列样本点。有许多可能的原因使得这些样本被映射到二维空间后不能保持距离关系。首先,十维空间中可能有至多 11 个相互等距的样本点。想要在二维空间中找到 11 个相互等距的样本点却是不可能的。另一个相关的问题是拥挤问题。如果要在二维空间中准确建模相近样本的距离,那么距离稍远的样本就需要被放在二维空间中非常远的位置。在 SNE 中使用样本间的弹簧连接来避免样本在低维空间中过于分散。

t-SNE 使用学生 t 分布建模低维空间的样本距离。相比 SNE 中使用的正态分布, t 分布的尾部概率更大,从而在样本间提供适当的引力。具体来说, t-SNE 使用下式计算 qijq_{ij}qij

qij=(1+∥yi−yj∥2)−1∑k≠l(1+∥yk−yl∥2)−1.q_{i j}=\frac{\left(1+\left\|\mathbf{y}_{i}-\mathbf{y}_{j}\right\|^{2}\right)^{-1}}{\sum_{k \neq l}\left(1+\left\|\mathbf{y}_{k}-\mathbf{y}_{l}\right\|^{2}\right)^{-1}}. qij=k=l(1+ykyl2)1(1+yiyj2)1.

t-SNE 的梯度函数如下

δCδyi=4∑j(yi−yj)(pij−qij)(1+∥yi−yj∥2)−1.\frac{\delta C}{\delta \mathbf{y}_{i}}=4 \sum_{j}\left(\mathbf{y}_{i}-\mathbf{y}_{j}\right)\left(p_{i j}-q_{i j}\right)\left(1+\left\|y_{i}-y_{j}\right\|^{2}\right)^{-1}. δyiδC=4j(yiyj)(pijqij)(1+yiyj2)1.

参考资料

  1. Bellman, R. (1957). Dynamic Programming.
  2. Chmiel, E., & Moore, C. Curse of dimensionality. Reference article, Radiopaedia.org. (accessed on 27 Mar 2022) https://doi.org/10.53347/rID-69156
  3. Understanding Curse of Dimensionality
  4. Shlens, J. (2003). A Tutorial on Principal Component Analysis. http://arxiv.org/abs/1404.1100
  5. Hinton, G., & Roweis, S. (2002). Stochastic Neighbor Embedding. Annual Conference on Neural Information Processing Systems.
  6. van der Maaten, L., & Hinton, G. (2008). Visualizing Data using t-SNE. Journal of Machine Learning Research, 9, 2579–2605.

ML Note 3.4 - 数据降维算法 PCA / t-SNE相关推荐

  1. ML之DR:基于鸢尾花(Iris)数据集利用多种降维算法(PCA/TSVD/LDA/TSNE)实现数据降维并进行二维和三维动态可视化应用案例

    ML之DR:基于鸢尾花(Iris)数据集利用多种降维算法(PCA/TSVD/LDA/TSNE)实现数据降维并进行二维和三维动态可视化应用案例 目录 基于鸢尾花(Iris)数据集利用多种降维算法(PCA ...

  2. 降维算法PCA的应用----高维数据的可视化

    文章目录 序言 废话不多说看代码 导入相关模块 数据提取 降维 降维后数据信息展示 新的特征矩阵 可视化 关于X_dim2[y==i, 0]的解释 总结 序言 当我们拿到一堆数据的时候,几乎不可能通过 ...

  3. python用tsne降维_哈工大硕士实现了 11 种经典数据降维算法,源代码库已开放

    网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码.这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法,包括:PCA.LDA.MDS.LLE. ...

  4. svd降维 python案例_菜菜的机器学习sklearn实战-----sklearn中的降维算法PCA和SVD

    菜菜的机器学习sklearn实战-----sklearn中的降维算法PCA和SVD 概述 从什么叫维度说开来 简单讲,shape中返回了几个数字就是几维. 一张表最多就是一维 当一个数组中存在2张3行 ...

  5. std中稳定排序算法_源代码库已开放 | 哈工大硕士生用 Python 实现了 11 种经典数据降维算法...

    转自:AI开发者 网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码.这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法,包括:PCA.LDA ...

  6. python 最优化算法库_哈工大硕士生用?Python 实现了 11 种经典数据降维算法,源代码库已开放...

    雷锋网 AI 开发者按:网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码.这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法,包括:PCA. ...

  7. 《菜菜的机器学习sklearn课堂》降维算法PCA和SVD

    降维算法PCA和SVD 什么是维度? sklearn中的降维算法 PCA 与 SVD 降维究竟是怎样实现的? PCA重要参数 n_components 迷你案例:高维数据的可视化 附录 PCA参数列表 ...

  8. 哈工大硕士生实现 11 种数据降维算法,代码已开源!

    网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码.这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法,包括:PCA.LDA.MDS.LLE. ...

  9. 10 降维算法(PCA降维/LDA分类/NMF非负矩阵)

    数据降维简介 降维就是一种对高维度特征数据预处理方法.降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的. 降维具有如下一些优点: 减少所需的存储空间. ...

  10. 机器学习-Sklearn-04(降维算法PCA和SVD)

    机器学习-Sklearn-04(降维算法PCA和SVD) 学习04 1 概述 1.1 从什么叫"维度"说开来 对于数组和Series来说,维度就是功能shape返回的结果,shap ...

最新文章

  1. FGMap学习之--三维地图
  2. 关于《Android应用开发揭秘》中早期版本中联系人例子错误的解决办法
  3. 从HTML页面重定向
  4. 在quartus 和 ISE 里直接调用modelsim的方法(转)
  5. UESTC 1851 Kings on a Chessboard
  6. 我的2021年度总结
  7. 前端学习(1806):前端调试之列表伪类练习二
  8. c语言中x的n次方怎么表示_线性代数的本质及其在人工智能中的应用
  9. 回顾 | AAAI 2019最佳论文公布,CMU、斯坦福、MIT上榜
  10. Oracle统计信息中的Pending Statistics
  11. java 字符串比较 == equals_java怎么比较字符串,==和equals有什么区别
  12. 三部委明确能源互联网建设10重点
  13. sessionFactory.getCurrentSession()的引出
  14. 比赛-6月Round1
  15. 高速信号采集的相关知识
  16. Markdown编辑器如何配置图片大小
  17. python怎么过滤标点符号大全_python 过滤标点符号
  18. 2020年小米校招JAVA岗笔试第二题
  19. XP系统开机后桌面没有软件怎么修复?
  20. python字符串驻留机制_python字符串驻留(intern)机制

热门文章

  1. 从fototool谈景深与超焦距
  2. Ubuntu 安装 brightness-controller 调节显示亮度
  3. 展锋芒,一遇风云便化龙
  4. 电驴搜索服务器正在连接,电驴连接不上服务器怎么解决?
  5. 小米账号无故泄露 手机安全问题何解?
  6. 自己动手XP集成SP3补丁
  7. 基于Visual C++2010与windows SDK fo windows7开发windows7平台的tabletpc应用(2)-轨迹多文档手写轨迹输入多语言识别范例
  8. 各品牌电脑官方驱动下载
  9. 基于同义词词林扩展版的词语相似度计算
  10. python使用win32*模块模拟人工操作——城通网盘下载器(零)