【机器学习】(十八)用t-SNE进行流行学习:手写数字分类
程序员文章站
2022-05-20 19:34:17
...
PCA是用于变换数据的首选方法,也可以进行可视化,但它的性质(先旋转然后减少方向)限制了有效性。
流行学习算法:是一类用于可视化的算法,它允许进行更复杂的映射,通常也可以给出更好的可视化。t-SNE算法是其中一种。
t-SNE算法:找到数据的一种二维表示,尽可能保持数据点之间的距离(相同的靠近,不同的远离,分堆)。这种方法不知道类别标签,是完全无监督的。但是它只能变换用于训练的数据,不支持新数据(没有transform方法),即不能用于测试集。具有调节参数(perplexity、early_exaggeration),通常默认参数的效果就很好。
# 导入一个手写数据集(比MNIST数据集小),每个数据点是0-9的一张8*8灰度图像
from sklearn.datasets import load_digits
digits = load_digits()
# 使用t-SNE降维(二维)
from sklearn.manifold import TSNE
tsne = TSNE(random_state=42)
digits_tsne = tsne.fit_transform(digits.data)
# 设置字体颜色
colors = ['#FFB7DD', '#FF3333', '#C63300', '#FFAA33', '#DDAA00',
'#FFFF00', '#66DD00', '#33FFFF', '#0066FF', '#B088FF']
# 数据可视化
import matplotlib.pyplot as plt
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')
plt.text函数:画图时给点加标签。fontdict参数覆盖文本属性的字典。