T-SNE可以对高维特征降维,可以降至三维、二维、一维使得特征容易在图像中展示出来。
使用T-SNE对提取的特征降维
perplexity = 100
# 将特征降至一维
tsne = TSNE(n_components=1, n_iter=20000, init='pca', perplexity=perplexity)
X_tsne_1d = tsne.fit_transform(feature_all)
print('(特征数量,降维后源域特征维度)')
print(X_tsne_1d.shape)
也可以先合并源域和目标域特征再放入TSNE降维,降维后拆分开画图
# 将合并后的特征矩阵一起降维,降维后分开源域和目标域的特征方便画图
tsne = TSNE(n_components=1, n_iter=20000, init='pca', perplexity=perplexity)
merged_features_1d = tsne.fit_transform(merged_features)
print('(特征数量,降维后特征维度)')
print(merged_features_1d.shape)
X_tsne_1d = merged_features_1d[:len(feature_all)]
X_tsne_1d2 = merged_features_1d[len(feature_all):]
使用kdeplot画图
# kdeplot画图
sns.set() # 切换到seaborn默认配置
# 一维kde图像
ax1 = sns.kdeplot(X_tsne_1d, color='r', fill=True, legend=True, bw_adjust=1.5)
ax2 = sns.kdeplot(X_tsne_1d2, color='b', fill=True, legend=True, bw_adjust=1.5)
# bw_adjust带宽,带宽越大图像越光滑
plt.legend(labels=['sourceDomain', 'targetDomain'], loc="upper right")
plt.title('one-dimensional visualization of feature distribution')
plt.show()
画出来的图像
我这里使用的无域适应的模型提取的特征,画出来特征分布很接近,换了源域和目标域也不行,统统是这样。于是查看TSNE和kdeplot文档看看有没有参数需要调整
弄了半天画的图
T-SNE降维后的可视化效果非常依赖于参数perplecity以及特征是否合并后降维还是分开降维,以及画图函数kdeplot的bw_adjust参数,bw_adjust越大图像越平滑;合并降维会使两个域特征距离变近,即使在没有预适应的情况下图像也会很接近;可以根据自己数据集的分布差异自行调整这两个参数。
最后是用DANN训练的模型出来的图:
可以看到有一定的域适应效果。还有一点问题就是不知道为什么颜色参数失效了。