转自:https://blog.csdn.net/u012162613/article/details/45920827
https://www.jianshu.com/p/d6e7083d7d61
1.思想
t-SNE(t-distributed stochastic neighbor embedding)是用于降维的一种机器学习算法,是由 Laurens van der Maaten 和 Geoffrey Hinton在08年提出来。
此外,t-SNE 是一种非线性降维算法,非常适用于高维数据降维到2维或者3维,进行可视化。
2.例1——鸢尾花数据集降维
# _*_ coding:utf-8 -*- from sklearn.manifold import TSNE from sklearn.datasets import load_iris from sklearn.decomposition import PCA import matplotlib.pyplot as plt class data(): def __init__(self, data, target): self.data = data self.target = target # 加载数据集 iris = load_iris() # 共有150个例子, 数据的类型是numpy.ndarray print(iris.data.shape) # 对应的标签有0,1,2三种 print(iris.target.shape) # 使用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得到的结果查看,第0维,第1维:
对PCA结果进行查看:
结果:
尝试使用Seaborn画图,需要先构造数据框:
import seaborn as sns import pandas as pd df=pd.DataFrame(tsne,columns=['x1','x2']) df['t']=iris.target df.head()
sns.lmplot(x="x1",y="x2",hue="t",data=df,fit_reg=False) plt.grid(True)
3.例2——MINISET数据集
digits = datasets.load_digits(n_class=5) X = digits.data y = digits.target print X.shape 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) plot_embedding2D(X_tsne[:,0:2],"t-SNE 2D") plot_embedding3D(X_tsne,"t-SNE 3D (time %.2fs)" %(time - t0))
//最终画图的代码, 没有运行起来,不太会。
博主给的结果:
![](https://i-blog.csdnimg.cn/blog_migrate/35e80dbeffb978dfdb2af74ded9ef9cd.png)
我使用散点图画出的二维结果:
plt.scatter(X_tsne[:,0],X_tsne[:,1],c=Y)
plt.colorbar()