用t-SNE进行流形学习
流行学习算法是一类用于可视化的算法,它允许进行更复杂的映射,通常也可以给出更好的可视化。PCA是用于变换数据的首选方法,也可以进行可视化,但它的性质(先旋转然后减少方向)限制了有效性。因此,我们可以使用流形学习算法进行数据可视化。
t-SNE算法主要思想:找到数据的一种二维表示,尽可能保持数据点之间的距离,主要保存那些点比较靠近的信息。
(1)数据集(digits数据集)
from sklearn.datasets import load_digits
digits = load_digits()
fig, axes = plt.subplots(2, 5, figsize=(10, 5),
subplot_kw={'xticks':(), 'yticks': ()})
for ax, img in zip(axes.ravel(), digits.images):
ax.imshow(img)
(2)利用PCA将降维的数据可视化
对前两个主成分作图,按照类别对数据点着色
pca = PCA(n_components=2)
pca.fit(digits.data)
digits_pca = pca.transform(digits.data)
colors = ["#476A2A", "#7851B8", "#BD3430", "#4A2D4E", "#875525",
"#A83683", "#4E655E", "#853541", "#3A3120", "#535D8E"]
plt.figure(figsize=(10, 10))
plt.xlim(digits_pca[:, 0].min(), digits_pca[:, 0].max())
plt.ylim(digits_pca[:, 1].min(), digits_pca[:, 1].max())
for i in range(len(digits.data)):
# actually plot the digits as text instead of using scatter
plt.text(digits_pca[i, 0], digits_pca[i, 1], str(digits.target[i]),
color = colors[digits.target[i]],
fontdict={'weight': 'bold', 'size': 9})
plt.xlabel("First principal component")
plt.ylabel("Second principal component")
实际用每个类别对应的数字作为符号显示类别的位置,利用前两个成分可以将数字0、6、4较好分开,大部分其他的数字都重叠在一起。
(3)将t-SNE应用于数据集
from sklearn.manifold import TSNE
tsne = TSNE(random_state=42)
digits_tsne = tsne.fit_transform(digits.data)
plt.figure(figsize=(10, 10))
plt.xlim(digits_tsne[:, 0].min(), digits_tsne[:, 0].max() + 1)
plt.ylim(digits_tsne[:, 1].min(), digits_tsne[:, 1].max() + 1)
for i in range(len(digits.data)):
plt.text(digits_tsne[i, 0], digits_tsne[i, 1], str(digits.target[i]),
color = colors[digits.target[i]],
fontdict={'weight': 'bold', 'size': 9})
plt.xlabel("t-SNE feature 0")
plt.ylabel("t-SNE feature 1")
可以发现t-SNEde结果很棒,所有的类别都被明确地分开,形成密集的组,但是这种方法不知道类别标签,完全无监督,但找到数据的一种二维表示,仅根据原始空间中数据点之间的靠近程度就能将各个类别明确分开