低维流形空间映射到高维空间中去(低维 -> 高维,看了一天以为这样好理解),也就是说一个高维空间能够有一个简单的低维流形空间来刻画。html
网上冲浪的许久,这个回答(麋路)让我赞了python
机器学习中降维的技术有不少种,上图是一些常见的降维技术,而SNE和t-SNE是才出现不久的降维技术,二者的差异不大主要是低维空间中几率函数选择的不一样,由于t-SNE好不少,因此果断选择后者++算法
\ | 高维空间 | 低维空间 |
---|---|---|
\(x^i,x^j\)之间的距离 | \(S(x^i,x^j)=\frac{1}{\sqrt{2\pi \sigma}}e^{-\frac{(x^i-x^j)^2}{2\sigma^2}}\) | \ |
\(z^i,z^j\)之间的距离 | \ | \(S'(z^i,z^j)=\frac{1}{(z^i-z^j)^2}\) |
任意两点间的类似程度: | \(P(x^j|x^i)=\frac{S(x^j,x^i)}{\sum_{k\neq i}S(x^j,x^k)}\) | \(P'(z^j|z^i)=\frac{S'(z^j,z^i)}{\sum_{k\neq i}S(z^j,z^k)}\) |
理想状态下数据的性质是不会改变的,只是表现方式改变而已,也就是说在不一样维度下对应的任意相同两点间的类似程度应该相等,即在整个类似程度方程上来看,\(P(x^i,x^j)\)与\(P'(z^i,z^j)\)是彻底相同的分布,这就找到了咱们须要优化的对象。网络
\ | 描述 |
---|---|
优化目的 | \(P(x^i,x^j)\)与\(P'(z^i,z^j)\)尽量的类似 |
优化对象 | KL散度方程\(C=\sum_iKL(P_i||P'_i)=\sum_i\sum_jP_{j|i}log\frac{P_{j|i}}{P'_{j|i}}\) |
优化方法 | 梯度降低(晕),经过GD找到最优的一组\(z^i\)参数即找到了低维空间 |
from time import time import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from sklearn import manifold, datasets n_points = 1000 # X 是一个(1000, 3)的 2 维数据,color 是一个(1000,)的 1 维数据 X, color = datasets.make_s_curve(n_points, random_state=0) n_neighbors = 10 n_components = 2 fig = plt.figure(figsize=(8, 8)) # 建立了一个 figure,标题为"Manifold Learning with 1000 points, 10 neighbors" plt.suptitle("Manifold Learning with %i points, %i neighbors" % (1000, n_neighbors), fontsize=14) '''绘制 S 曲线的 3D 图像''' ax = fig.add_subplot(211, projection='3d') ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=color, cmap=plt.cm.Spectral) ax.view_init(4, -72) # 初始化视角 '''t-SNE''' t0 = time() tsne = manifold.TSNE(n_components=n_components, init='pca', random_state=0) Y = tsne.fit_transform(X) # 转换后的输出 t1 = time() print("t-SNE: %.2g sec" % (t1 - t0)) # 算法用时 ax = fig.add_subplot(2, 1, 2) plt.scatter(Y[:, 0], Y[:, 1], c=color, cmap=plt.cm.Spectral) plt.title("t-SNE (%.2g sec)" % (t1 - t0)) plt.xticks([]) plt.yticks([]) plt.show()
其实这个包有不少参数,好比困惑度(晕)和一些梯度降低须要用到的参数,这个贴出大佬传送门dom