1. t-NSE 可视化
t-SNE
是t-Distributed Stochastic Neighbor Embedding简写,出自Visualizing Data using t-SNE论文。
t-SNE
是一种非线性降维算法,通过原始空间和嵌入空间的联合概率的KL散度来评估降维到嵌入空间的效果,就是用KL散度的函数作为loss函数,然后通过梯度下降最小化loss函数,最终获得收敛结果。但是t-SNE计算复杂度高。
下面是t-SNE
可视化手写数字的代码:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
from sklearn.preprocessing import StandardScaler
import seaborn as sns
df = pd.read_csv('mnist_train.csv')
# 看看数据样子
print(df.head(4))
# 获取标签列
labels = df['label']
# 获取训练的数字图片的pixel
data = df.drop("label", axis=1)
输出:
label 1x1 1x2 1x3 1x4 1x5 ... 28x23 28x24 28x25 28x26 28x27 28x28
0 5 0 0 0 0 0 ... 0 0 0 0 0 0
1 0 0 0 0 0 0 ... 0 0 0 0 0 0
2 4 0 0 0 0 0 ... 0 0 0 0 0 0
3 1 0 0 0 0 0 ... 0 0 0 0 0 0
[4 rows x 785 columns]
2. 数据预处理
## 预处理数据 标准化
standardized_data = StandardScaler().fit_transform(data)
print(standardized_data.shape) #(60000, 784)
#只取前5000样例
data_5000 = standardized_data[0:5000, :]
labels_5000 = labels[0:5000]
3. t-SNE降维及可视化
##建立TSNE实例
model = TSNE(n_components=2, random_state=0)
# n_components:降维后维度,一般设置2,
# 还有像perplexity困惑度,默认30
# learning rate学习率,默认200
# n_iter迭代次数,最大1000
#训练得到降维后数据
tsne_data = model.fit_transform(data_5000)
#将降维后数据和对应label纵向拼接后再转置为样本数5000x4列的矩阵
tsne_data = np.vstack((tsne_data.T, labels_5000)).T
tsne_df = pd.DataFrame(data=tsne_data,
columns=("dim_1", "dim_2", "label"))
# 可视化tSNE结果
plt.figure(dpi=500)
sns.FacetGrid(tsne_df, hue="label", height=10).map(
plt.scatter, 'dim_1', 'dim_2').add_legend()
plt.savefig('tSNE.png')
plt.show()
结果如下:
Inference
[1] 数据降维与可视化——t-SNE