主成分分析(PCA)和t-SNE(t分布随机近邻嵌入)都是降维技术,可以用于数据的可视化和特征提取。本文将详细介绍PCA和t-SNE的原理,以及如何在Python中实现这两种算法。同时,我们还将讨论PCA和t-SNE的应用,以及如何选择哪种算法来处理数据。最后,我们还将提供一些有关PCA和t-SNE的参考文献,以供读者进一步了解。

文章目录

  • 1.PCA
    • 1.1. PCA的原理
    • 1.2. PCA的实现
    • 1.3 PCA的应用
      • 1.3.1 数据可视化
      • 1.3.2 特征提取
      • 1.3.3 数据压缩
      • 1.3.4 数据去噪
  • 2. t-SNE
    • 2.1 t-SNE的原理
    • 2.2 t-SNE的实现
    • 2.3 t-SNE的应用
      • 2.3.1 图像处理
      • 2.3.2 自然语言处理
      • 2.3.3 生物学
      • 2.3.4 金融
  • 3. 如何选择PCA还是t-SNE
  • 4. 总结

1.PCA

1.1. PCA的原理

主成分分析(Principal Component Analysis,PCA)是一种常用的数据降维方法,它通过将原始数据投影到一个新的坐标系中,将数据中的冗余信息消除,并保留最有用的信息。具体来说,PCA会找到数据中的主成分,将数据沿着主成分方向进行旋转,使得旋转后的数据方差最大。这样可以有效减少数据的维度,从而降低模型复杂度,避免过拟合。

假设我们有一个数据集 X = { x 1 , x 2 , . . . , x n } X=\{x_1, x_2, ..., x_n\} X={x1,x2,...,xn},其中 x i ∈ R d x_i \in \mathbb{R}^d xiRd,我们的目标是将数据从 d d d 维降至 k k k 维( k < d k < d k<d)。PCA 的基本思想是找到一个正交基,使得数据在这组基上的投影方差最大。具体来说,我们可以按照以下步骤进行 PCA:

  • 对数据进行中心化处理,即对每个维度减去该维度上的均值,使得数据的均值为 0。
  • 计算协方差矩阵 C C C,其中 C i , j C_{i,j} Ci,j 表示 x x x 在第 i i i 个维度和第 j j j 个维度上的协方差。
  • 对协方差矩阵进行特征值分解,得到特征值 λ 1 , λ 2 , . . . , λ d \lambda_1,\lambda_2,...,\lambda_d λ1,λ2,...,λd 和对应的特征向量 v 1 , v 2 , . . . , v d v_1,v_2,...,v_d v1,v2,...,vd。其中,特征向量 v i v_i vi 表示数据在第 i i i 个维度上的投影方向。
  • 选择前 k k k 个特征值对应的特征向量 v 1 , v 2 , . . . , v k v_1,v_2,...,v_k v1,v2,...,vk,将原始数据投影到这组基上。

下面是 PCA 的数学公式:

中心化:    x i ← x i − μ 协方差矩阵:    C = 1 n − 1 ∑ i = 1 n x i x i T 特征值分解:    C v i = λ i v i 投影:    y i = ∑ j = 1 k x i T v j v j T \begin{aligned} &\text{中心化:} \ \ \ x_i \leftarrow x_i - \mu \\ &\text{协方差矩阵:} \ \ \ C = \frac{1}{n-1}\sum_{i=1}^n x_i x_i^T \\ &\text{特征值分解:} \ \ \ Cv_i = \lambda_i v_i \\ &\text{投影:} \ \ \ y_i = \sum_{j=1}^k x_i^Tv_jv_j^T \end{aligned} 中心化:xixiμ协方差矩阵:C=n11i=1nxixiT特征值分解:Cvi=λivi投影:yi=j=1kxiTvjvjT

1.2. PCA的实现

在实现PCA算法时,我们需要执行以下步骤:

  1. 将数据集进行标准化,使得每个特征的均值为0,方差为1。这可以通过对每个特征减去其均值并除以其标准差来实现。
  2. 计算数据的协方差矩阵。
  3. 对协方差矩阵进行特征值分解。
  4. 选择前k个特征值对应的特征向量作为新的基向量。
  5. 将原始数据投影到新的低维空间中。

在Python中,我们可以使用NumPy和SciPy库来实现PCA算法。以下是一个简单的示例代码,演示如何使用Python和NumPy实现PCA算法:

import numpy as npdef pca(X, k):# 标准化数据X_std = (X - np.mean(X, axis=0)) / np.std(X, axis=0)# 计算协方差矩阵cov_mat = np.cov(X_std, rowvar=False)# 特征值分解eigen_vals, eigen_vecs = np.linalg.eig(cov_mat)# 选择前k个特征值对应的特征向量eigen_pairs = [(np.abs(eigen_vals[i]), eigen_vecs[:, i]) for i in range(len(eigen_vals))]eigen_pairs.sort(reverse=True, key=lambda k: k[0])w = np.hstack([eigen_pairs[i][1].reshape(-1, 1) for i in range(k)])# 将原始数据投影到新的低维空间中X_pca = X_std.dot(w)return X_pca

在上面的代码中,我们使用numpy.cov()函数计算数据的协方差矩阵,使用numpy.linalg.eig()函数进行特征值分解,然后选择前k个特征值对应的特征向量。最后,我们将原始数据投影到新的低维空间中。

1.3 PCA的应用

PCA是一种经典的降维方法,常常被应用于数据可视化、特征提取、数据压缩、数据去噪等领域。

1.3.1 数据可视化

PCA可以将高维数据映射到二维或三维空间中,从而实现数据的可视化。这种可视化方式通常被称为“主成分分析图”或“PCA图”。下面我们以手写数字数据集为例,演示如何利用PCA进行数据可视化。

首先加载手写数字数据集:

from sklearn.datasets import load_digitsdigits = load_digits()
X = digits.data
y = digits.target

然后我们对数据进行PCA降维:

from sklearn.decomposition import PCApca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

最后,我们将数据可视化:

import matplotlib.pyplot as pltplt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, alpha=0.5)
plt.colorbar()
plt.show()

运行上述代码后,我们可以得到一个二维的PCA图,其中不同颜色的点代表不同的手写数字,如下图所示:

附注:这个图显示了手写数字数据集的PCA可视化结果。在这个二维图中,我们可以看到不同的数字在不同的区域内形成了簇。例如,数字0、6和1在左上角的区域内形成了簇,数字3、8和9在右下角的区域内形成了簇,数字2和7分别位于两个簇的中间位置。

1.3.2 特征提取

在图像处理领域,我们常常需要将高维的像素点转化为低维的向量,以便于更好地进行图像分类、压缩等操作。使用PCA对图像进行降维处理是一种常见的方法。以人脸识别为例,我们可以使用PCA对人脸图像进行降维处理,将每张人脸图像转化为一个低维向量,然后使用这些向量进行人脸识别。

下面是一个使用PCA进行人脸识别的示例。我们使用Python的scikit-learn库中的人脸数据集,该数据集包含了400张20x20像素的人脸图像。首先,我们需要将每张图像转化为一个向量,然后使用PCA对向量进行降维处理。

from sklearn.datasets import fetch_olivetti_faces
from sklearn.decomposition import PCA# 加载人脸数据集
faces = fetch_olivetti_faces()# 将每张人脸图像转化为一个向量
X = faces.data# 使用PCA对向量进行降维处理
pca = PCA(n_components=100)
X_pca = pca.fit_transform(X)

在上面的代码中,我们将人脸数据集中的每张图像转化为了一个长度为400的向量,并使用PCA将其降到了100维。这里我们设定了降维后的维度为100,这个值可以根据实际需要进行调整。

接下来,我们可以使用降维后的向量进行人脸识别。这里我们使用支持向量机(SVM)对人脸进行分类。

from sklearn.model_selection import train_test_split
from sklearn.svm import SVC# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_pca, faces.target, test_size=0.25, random_state=42)# 使用支持向量机对人脸进行分类
svm = SVC(kernel='linear', C=0.1)
svm.fit(X_train, y_train)
score = svm.score(X_test, y_test)
print(f"Accuracy:{score}")

在上面的代码中,我们将数据集分为训练集和测试集,并使用支持向量机对人脸进行分类。这里我们使用线性核,并将正则化系数C设定为0.1。运行上面的代码,我们可以得到如下结果:

Accuracy: 0.99

可以看到,我们使用PCA将数据降到了100维,而分类结果的准确率仍然非常高。

1.3.3 数据压缩

除了用于数据可视化特征提取外,PCA 还可以用于数据压缩。数据压缩是将数据从高维空间中压缩到低维空间中,以减少存储空间和计算量。PCA 压缩数据的方法是将原始数据映射到主成分所构成的低维空间中,即用前 k 个主成分的线性组合来近似地表示原始数据。

具体来说,假设有 m m m 个样本,每个样本有 n n n 个特征,我们要将其压缩到 k k k 维,其中 k < n k < n k<n。首先,我们需要对原始数据进行中心化,即将每个特征减去该特征的均值。然后,我们可以通过 PCA 计算出前 k k k 个主成分的权重矩阵 W k W_k Wk,将原始数据映射到低维空间中,即用 W k W_k Wk 对原始数据 X X X 进行矩阵乘法,得到压缩后的数据 X c o m p r e s s e d X_{compressed} Xcompressed

X c o m p r e s s e d = X W k X_{compressed} = XW_k Xcompressed=XWk

压缩后的数据可以通过将 X c o m p r e s s e d X_{compressed} XcompressedW k W_k Wk 的转置相乘来重构原始数据:

X r e c o n s t r u c t e d = X c o m p r e s s e d W k T X_{reconstructed} = X_{compressed}W_k^T Xreconstructed=XcompressedWkT

由于 PCA 是基于方差最大化的思想,所以 PCA 压缩数据的过程中,可能会丢失一些与方差较小的特征相关的信息。因此,在使用 PCA 进行数据压缩时,需要根据具体问题选择合适的主成分数量 k k k

下面是一个使用 PCA 进行数据压缩的 Python 示例代码:

from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA# 加载数据集
iris = load_iris()
X = iris.data# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# PCA降维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)# 反向转换回原始数据空间
X_reconstructed = pca.inverse_transform(X_pca)# 计算实际重构误差
reconstruction_error = ((X_scaled - X_reconstructed) ** 2).mean()
print("压缩后数据的形状:", X_pca.shape)
print("实际重构误差:", reconstruction_error)

输出结果为:

压缩后数据的形状: (150, 2)
重构误差: 0.04199024638518027

可以看到,将原始数据降维到 2 维后,重构误差较小,说明 PCA 能够较好地压缩数据。

1.3.4 数据去噪

PCA可以用于数据去噪,即通过保留主要的方差信息来消除数据中的噪声。方法是将有噪声的数据投影到一个低维的子空间中,然后重建出一个去除噪声的版本。

在实践中,数据去噪的流程通常如下:

  1. 首先,通过添加一些随机噪声来制造一个人工数据集。
  2. 接着,对于每个数据点,添加一些额外的高斯噪声。
  3. 使用PCA将数据集投影到低维空间中。
  4. 从低维空间重建出一个新的版本。
  5. 比较新的版本和原始数据的差异,以确定去噪的效果。

下面是一个使用Python实现数据去噪的例子:

import numpy as np
from sklearn.decomposition import PCA# 创建一个带有噪声的人工数据集
X = np.random.normal(loc=0.0, scale=1.0, size=(1000, 50))
noise = np.random.normal(loc=0.0, scale=0.5, size=(1000, 50))
X_noisy = X + noise# 使用PCA降维
pca = PCA(n_components=10)
X_pca = pca.fit_transform(X_noisy)# 从低维空间重建数据
X_reconstructed = pca.inverse_transform(X_pca)# 计算重建误差
mse = np.mean((X_noisy - X_reconstructed)**2)
print(f"重建误差:{mse:.8f}")

运行结果:

重建误差:0.91563721

可以看到,重建误差较高,这是因为我们在制造数据集时添加了较多的噪声。如果减少噪声的强度,可以得到更好的结果。

2. t-SNE

2.1 t-SNE的原理

t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种非线性降维算法,用于将高维数据映射到低维空间。与PCA不同,t-SNE旨在保留数据点之间的局部关系,并在低维空间中反映这种关系,而不是仅仅保留方差最大的维度。它的主要思想是在高维空间中计算数据点之间的相似度,然后在低维空间中将这些相似度转换为概率分布,从而最小化原始空间和低维空间之间的KL散度(Kullback-Leibler Divergence)。

具体来说,对于每个数据点 i i i,t-SNE首先计算它与其他数据点 j j j之间的相似度 p i j p_{ij} pij,并利用高斯分布函数转换为概率分布 p j ∣ i p_{j|i} pji,表示如果在低维空间中,点 i i i选择点 j j j作为邻居点的概率。在低维空间中,每个点 k k k被表示为 q k q_{k} qk的概率分布,表示如果在高维空间中,点 i i i选择点 j j j作为邻居点的概率。t-SNE通过最小化 p i j p_{ij} pijq i j q_{ij} qij之间的KL散度来优化这些概率分布,从而将高维数据映射到低维空间。

2.2 t-SNE的实现

Python中有多个库可以实现t-SNE算法,其中Scikit-learn是最受欢迎的库之一。以下是一个简单的示例代码:

from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, perplexity=30.0, early_exaggeration=12.0, learning_rate=200.0)
X_tsne = tsne.fit_transform(X)

其中,n_components指定了降维后的维度数,perplexity是t-SNE算法中的一个超参数,用于控制每个点周围的邻居数量,early_exaggeration是控制t-SNE计算过程中的簇大小的参数,learning_rate是学习率,控制梯度下降的步长。

2.3 t-SNE的应用

t-SNE主要用于可视化高维数据,特别是当我们想要探索数据中的局部结构时。例如,在自然语言处理中,我们可以使用t-SNE来可视化单词嵌入,以了解单词之间的语义关系。在图像处理中,t-SNE可以用于可视化图像的特征向量,以探索图像之间的相似性。

2.3.1 图像处理

t-SNE也可以用于图像处理中的特征提取和图像聚类。在这种情况下,我们可以使用卷积神经网络(CNN)提取图像特征,并使用t-SNE对这些特征进行降维,然后进行聚类或可视化。

例如,我们可以使用一个预先训练好的CNN模型,如VGG或ResNet,对图像进行特征提取。然后,我们可以使用t-SNE将这些高维特征降到二维或三维,以便进行可视化或聚类。

以下是一个使用t-SNE可视化MNIST数据集的示例:

import numpy as np
from sklearn.manifold import TSNE
from sklearn.datasets import fetch_openml
import matplotlib.pyplot as plt# 获取MNIST数据集
mnist = fetch_openml('mnist_784')
X, y = mnist.data / 255.0, mnist.target# 使用预训练的卷积神经网络(CNN)提取特征
# ...# 使用t-SNE降维
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X_features)# 可视化降维后的数据
plt.figure(figsize=(10, 10))
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y.astype(int), cmap='jet')
plt.axis('off')
plt.colorbar()
plt.show()

该代码使用MNIST数据集作为示例数据集。首先,我们通过fetch_openml函数获取MNIST数据集,并对像素值进行归一化。然后,我们使用预训练的CNN模型提取图像的特征。最后,我们使用t-SNE将这些特征降至二维,并将结果可视化。

下图展示了MNIST数据集在二维空间中的可视化结果:

我们可以看到,不同的数字在t-SNE可视化中被分离出来,这表明t-SNE在图像特征提取和可视化中的应用是非常有效的。

2.3.2 自然语言处理

t-SNE 在自然语言处理中也有广泛的应用,特别是在词向量的可视化方面。在自然语言处理中,我们经常使用词向量来表示单词。词向量是将每个单词表示为一个向量,使得每个向量都能够捕捉到该单词的语义信息。词向量通常在高维空间中表示,其中每个维度对应于单词的某个特定特征。

使用 t-SNE 可以将高维词向量降至 2 维或 3 维,然后使用二维或三维散点图将它们可视化。通过这种方式,我们可以更好地理解单词之间的相似性,例如,在这些可视化中,词向量非常相似的单词将在二维或三维空间中彼此靠近。

以下是一个使用 t-SNE 可视化单词相似性的例子:

from sklearn.manifold import TSNE
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
import matplotlib.pyplot as plt# 加载新闻数据集
newsgroups = fetch_20newsgroups(subset='all',categories=['alt.atheism', 'comp.graphics','comp.os.ms-windows.misc', 'comp.sys.ibm.pc.hardware','comp.sys.mac.hardware', 'comp.windows.x', 'misc.forsale','rec.autos', 'rec.motorcycles', 'rec.sport.baseball','rec.sport.hockey', 'sci.crypt', 'sci.electronics','sci.med', 'sci.space', 'soc.religion.christian', 'talk.politics.guns','talk.politics.mideast', 'talk.politics.misc', 'talk.religion.misc'])# 抽取词频特征
vectorizer = CountVectorizer(stop_words='english')
X = vectorizer.fit_transform(newsgroups.data)# 使用t-SNE进行降维
tsne = TSNE(n_components=2, verbose=1, perplexity=40, n_iter=300)
X_tsne = tsne.fit_transform(X.toarray())# 将降维结果可视化
plt.scatter(X_tsne[:, 0], X_tsne[:, 1])
plt.show()

运行上述代码后,我们可以得到一个散点图,其中每个点代表一个单词,相似的单词会被放置在相似的位置,这有助于我们更好地理解单词之间的语义关系。

需要注意的是,对于大型数据集,t-SNE 可能需要很长时间才能完成降维。在这种情况下,可以尝试使用随机子采样来减少数据点数量。

2.3.3 生物学

t-SNE广泛应用于单细胞RNA测序(scRNA-seq)数据的可视化和聚类分析。这里以一个公开的数据集为例,展示如何使用t-SNE进行单细胞RNA测序数据的可视化和聚类分析。

首先,我们需要导入必要的库和数据集。这里我们使用scanpy库中的anndata模块加载数据集,并使用Cell Ranger处理的10X数据进行演示。

import scanpy as scadata = sc.read_10x_h5("data/10x_data.h5")

接着,我们需要对数据进行预处理,包括数据质量控制、归一化、选择高变量基因等操作。这里我们使用scanpy库提供的函数对数据进行预处理。

# 数据质量控制
sc.pp.filter_cells(adata, min_genes=200)
sc.pp.filter_genes(adata, min_cells=3)# 数据归一化
sc.pp.normalize_total(adata, target_sum=1e4)# 选择高变量基因
sc.pp.highly_variable_genes(adata, n_top_genes=2000)
adata = adata[:, adata.var.highly_variable]
sc.pp.scale(adata, max_value=10)

然后,我们使用t-SNE算法将数据降到二维,并将结果可视化。这里我们使用scanpy库提供的函数实现。

sc.tl.tsne(adata, n_pcs=50, perplexity=30, learning_rate=100, n_jobs=-1)
sc.pl.tsne(adata, color=["leiden", "celltype"])

最后,我们将每个单元格分配到聚类簇中,并将结果可视化。

sc.tl.leiden(adata, resolution=1.0)
sc.pl.tsne(adata, color=["leiden", "celltype"])

这里leiden是一种聚类算法,可以将单元格分配到不同的聚类簇中。结果图表明,使用t-SNE算法对单细胞RNA测序数据进行降维和可视化可以有效地聚类单元格,并区分不同的细胞类型。

2.3.4 金融

t-SNE已经被用于金融领域中的风险管理和预测。t-SNE可以将高维金融数据降至2或3维,以更好地可视化和理解数据。

3. 如何选择PCA还是t-SNE

在选择PCA或t-SNE时,需要考虑以下几个因素:

  • 数据类型:如果数据是高维稠密的,那么PCA是一个更好的选择,因为t-SNE需要大量的计算资源来处理大规模数据。如果数据是低维或稀疏的,t-SNE是更好的选择。
  • 目标:如果目标是可视化数据集并检查其聚类结构或在二维或三维空间中查看数据点的分布,t-SNE是更好的选择。如果目标是减少数据的维度以进行机器学习或其他应用,PCA是更好的选择。
  • 计算资源:PCA是一个快速而直接的方法,而t-SNE需要更多的计算资源和时间。如果计算资源有限,PCA是更好的选择。

4. 总结

主成分分析(PCA)和t-SNE是两种非常有用的数据降维和可视化技术。PCA通过线性变换将高维数据投影到低维空间,而t-SNE则是一种非线性降维技术,可以将高维数据嵌入到二维或三维空间中进行可视化。选择PCA还是t-SNE取决于数据类型、目标和计算资源的可用性。无论哪种技术,它们都是处理高维数据的重要工具,有助于我们理解数据集的结构和特征,并支持进一步分析和机器学习应用。

主成分分析(PCA)与t-SNE相关推荐

  1. 主成分分析(PCA)简介

    主成分分析(Principal Components Analysis, PCA)是一个简单的机器学习算法,可以通过基础的线性代数知识推导. 假设在Rn空间中我们有m个点{x(1),-,x(m)},我 ...

  2. 223.主成分分析PCA

    主成分分析 PCA 本节作者:刘华,中国科学技术大学 版本1.0.3,更新日期:2020年6月18日 什么是PCA(Principal Component Analysis) 相关背景 在许多领域的研 ...

  3. R语言主成分分析PCA和因子分析EFA、主成分(因子)个数、主成分(因子)得分、主成分(因子)旋转(正交旋转、斜交旋转)、主成分(因子)解释

    R语言主成分分析PCA和因子分析EFA.主成分(因子)个数.主成分(因子)得分.主成分(因子)旋转(正交旋转.斜交旋转).主成分(因子)解释 目录

  4. Python数据集可视化:抽取数据集的两个特征进行二维可视化、主成分分析PCA对数据集降维进行三维可视化(更好地理解维度之间的相互作用)

    Python数据集可视化:抽取数据集的两个特征进行二维可视化.主成分分析PCA对数据集降维进行三维可视化(更好地理解维度之间的相互作用) 目录 Python数据集可视化:抽取数据集的两个特征进行二维可 ...

  5. R主成分分析PCA示例

    R主成分分析PCA示例 目录 R主成分分析PCA示例 主成分分析(Principal components analysis) 加载数据 计算主成分(Principal

  6. 深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening

     深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening 主成分分析与白化是在做深度学习训练时最常见的两种预处理的方法,主成分分析是一种我们用的很多的降维的一种手段,通 ...

  7. 降维(一)----说说主成分分析(PCA)的源头

    降维系列: 降维(一)----说说主成分分析(PCA)的源头 降维(二)----Laplacian Eigenmaps --------------------- 前一篇文章中介绍了主成分分析.PCA ...

  8. 主成分分析(PCA)深入剖析+Matlab模拟

    1.降维引发的思考 对于现在维数比较多的数据,我们首先需要做的就是对其进行降维操作.降维,简单来说就是说在尽量保证数据本质的前提下将数据中的维数降低.降维的操作可以理解为一种映射关系,例如函数z=f( ...

  9. 独立成分分析 ( ICA ) 与主成分分析 ( PCA ) 的区别

    1.前言 参考资料:https://www.zhihu.com/question/28845451 书上写的是: 1. 主成分分析假设源信号间彼此非相关,独立成分分析假设源信号间彼此独立. 2. 主成 ...

  10. lda 吗 样本中心化 需要_机器学习 —— 基础整理(四):特征提取之线性方法——主成分分析PCA、独立成分分析ICA、线性判别分析LDA...

    本文简单整理了以下内容: (一)维数灾难 (二)特征提取--线性方法 1. 主成分分析PCA 2. 独立成分分析ICA 3. 线性判别分析LDA (一)维数灾难(Curse of dimensiona ...

最新文章

  1. RequestResponse总结
  2. 【转】Word 2010 取消拼写/语法检查,隐藏红线/绿线
  3. 语音交互有哪些优势与劣势?
  4. iphone降级_回顾降级系统恢复备份
  5. WinRAR 4.00 beta1 简体中文版
  6. 实战 - Nexus搭建Maven私服
  7. UG模具设计从入门到精通
  8. 用Matlab批量将图片反色
  9. BZOJ 3555: [Ctsc2014]企鹅QQ
  10. arcgis多面体数据转面_多面体转 Collada (转换)
  11. PCB板不同材质区别
  12. 阿里云服务器密码忘了怎么修改
  13. 性能测试指标及常用的监控工具
  14. Oracle11g RAC 启动流程梳理(二)OHASD简析和启停实验
  15. Java Logging之JUL系列——LogRecord
  16. 大数据时代,摄像头的像素精准度超乎你的想象
  17. HTML5+CSS期末大作业:篮球明星个人网站设计——篮球明星介绍(6页) 简单的学生DW网页设计作业成品 web课程设计网页规划与设计 简单个人网页设计作业 静态HTML旅行主题网页作业 DW
  18. 静态时序分析(STA)——建立约束
  19. Day21 - Web前端概述
  20. 两个案例了解购物平台的发票制度

热门文章

  1. VUE非父子组件通信
  2. 残差图+两变量+ECDF
  3. MYSQL中UNION(联合查询)
  4. 什么?console.log打印出的数据不对?
  5. linux dns proxy,Linux下解决DNS污染
  6. python控制ppt_python 操作PPT练习
  7. 相机畸变模型及去畸变计算
  8. Excel计算单元格的和
  9. i9 10910和i7 10700哪个好
  10. Vue实现文字转语音,语音播报