1、TSNE的基本概念
2、例1 鸢尾花数据集降维
3、例2 MINISET数据集降维
t-SNE(t-distributed stochastic neighbor embedding)是用于降维的一种机器学习算法,是由 Laurens van der Maaten 等在08年提出来。此外,t-SNE 是一种非线性降维算法,非常适用于高维数据降维到2维或者3维,进行可视化。该算法可以将对于较大相似度的点,t分布在低维空间中的距离需要稍小一点;而对于低相似度的点,t分布在低维空间中的距离需要更远。
作者的主页: http://lvdmaaten.github.io/tsne/
t-SNE的梯度更新有两大优势:
主要不足有四个:
from sklearn.manifold import TSNE
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
# 加载数据集
iris = load_iris()
# 共有150个例子, 数据的类型是numpy.ndarray
print(iris.data.shape)#(150,4)
# 对应的标签有0,1,2三种
print(iris.target.shape)#(150,)
# 使用TSNE进行降维处理。从4维降至2维。
tsne = TSNE(n_components=2, learning_rate=100).fit_transform(iris.data)
# 使用PCA 进行降维处理
pca = PCA().fit_transform(iris.data)
# 设置画布的大小
plt.figure(figsize=(12, 6))
plt.subplot(121)
plt.scatter(tsne[:, 0], tsne[:, 1], c=iris.target)
plt.subplot(122)
plt.scatter(pca[:, 0], pca[:, 1], c=iris.target)
plt.colorbar()
plt.show()
结果:
左边是:tsne降维度,右边是pca降低维度
从图中也可以看出,原数据不同类别之间降低降到2维后,可以很好的分开
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.datasets import load_digits
from sklearn.manifold import TSNE
digits = load_digits(n_class=6)
X = digits.data#1083*64
y = digits.target#1083 max(y)=5
n_img_per_row = 20
img = np.zeros((10 * n_img_per_row, 10 * n_img_per_row))
for i in range(n_img_per_row):
ix = 10 * i + 1
for j in range(n_img_per_row):
iy = 10 * j + 1
img[ix:ix + 8, iy:iy + 8] = X[i * n_img_per_row + j].reshape((8, 8))
#按行放置 取前400个图片
#img中会有0、10、20列这些没有,是为了形成空列吧。
plt.imshow(img, cmap=plt.cm.binary)#cmap: 颜色图谱(colormap), 默认绘制为RGB(A)颜色空间。
plt.title('A selection from the 64-dimensional digits dataset')
import time#需导入包
tsne = TSNE(n_components=3, init='pca', random_state=0)
t0 = time
X_tsne = tsne.fit_transform(X)
def plot_embedding_3d(X, title=None):
#坐标缩放到[0,1]区间
x_min, x_max = np.min(X,axis=0), np.max(X,axis=0)
X = (X - x_min) / (x_max - x_min)
#降维后的坐标为(X[i, 0], X[i, 1],X[i,2]),在该位置画出对应的digits
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')
for i in range(X.shape[0]):
ax.text(X[i, 0], X[i, 1], X[i,2],str(digits.target[i]),
color=plt.cm.Set1(y[i] / 10.),
fontdict={'weight': 'bold', 'size': 9})
if title is not None:
plt.title(title)
plot_embedding_3d(X_tsne,"t-SNE 3D " )
TSNE嵌入到三维
import time#需导入包
tsne = TSNE(n_components=2, init='pca', random_state=0)
X_tsne = tsne.fit_transform(X)
plt.scatter(X_tsne[:,0],X_tsne[:,1],c=y)
plt.colorbar()
def plot_embedding(data, label, title):
x_min, x_max = np.min(data, 0), np.max(data, 0)
data = (data - x_min) / (x_max - x_min)
fig = plt.figure()
ax = plt.subplot(111)
for i in range(data.shape[0]):
plt.text(data[i, 0], data[i, 1], str(label[i]),
color=plt.cm.Set1(label[i] / 10.),
fontdict={'weight': 'bold', 'size': 9})
plt.xticks([])
plt.yticks([])
plt.title(title)
return fig
plot_embedding(X_tsne,y,"t-SNE 2D")
如有问题请大家留言
请给个赞奥
参考:
1、http://www.datakit.cn/blog/2017/02/05/t_sne_full.html
2、https://blog.csdn.net/u012162613/article/details/45920827
3、https://www.jianshu.com/p/d6e7083d7d61
编辑于 2020-03-15