T-SNE可以用于数据降维,降维之后的数据我们用散点图进行可视化处理。
在这里我搜集了不少资料,发现散点图添加图例的最好方法还是把不同类的点分开来存储,在绘制的时候也分开来绘制。
具体代码见下,已有十分详细的注释。
import matplotlib.pyplot as plt
from sklearn import manifold, datasets
import scipy.io as scio
# x中保存的是数值矩阵, 每个点的特征为一行
dataFile = 'F:\Image-steganography\\tsne\Data_test.mat'
x = scio.loadmat(dataFile)
x = x['Data_test']
# color是为了可视化做的颜色
dataFile = 'F:\Image-steganography\\tsne\label_test.mat'
color = scio.loadmat(dataFile)
color = color['label']
colors = []
for c in color:
if c == 1:
colors.append('hotpink')
else:
colors.append('deepskyblue')
# 创建自定义图像
fig = plt.figure(figsize=(12, 12)) # 指定图像的宽和高
# t-SNE的降维与可视化
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
ts = manifold.TSNE(n_components=2, init='pca', random_state=0)
# 训练模型
y = ts.fit_transform(x)
X1 = []
X2 = []
Y1 = []
Y2 = []
for i in range(3844):
if color[i] == 1:
X1.append(y[i, 0])
Y1.append(y[i, 1])
else:
X2.append(y[i, 0])
Y2.append(y[i, 1])
a = plt.scatter(X1, Y1, color="hotpink")
b = plt.scatter(X2, Y2, color="deepskyblue")
plt.legend((a, b), ('嵌入点', '非嵌入点'), fontsize=14)
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
# 显示图像
plt.show()