t-SNE⾼维数据可视化(python)
t-SNE实践——sklearn教程
t-SNE是⼀种集降维与可视化于⼀体的技术,它是基于SNE可视化的改进,解决了SNE在可视化后样本分布拥挤、边界不明显的特点,是⽬前最好的降维可视化⼿段。
关于t-SNE的历史和原理详见。
代码见下⾯例⼀
TSNE的参数
函数参数表:
parameters描述
n_components嵌⼊空间的维度
perpexity混乱度,表⽰t-SNE优化过程中考虑邻近点的多少,默认为30,建议取值在5到50之间
early_exaggeration表⽰嵌⼊空间簇间距的⼤⼩,默认为12,该值越⼤,可视化后的簇间距越⼤
learning_rate学习率,表⽰梯度下降的快慢,默认为200,建议取值在10到1000之间
n_iter迭代次数,默认为1000,⾃定义设置时应保证⼤于250
min_grad_norm如果梯度⼩于该值,则停⽌优化。默认为1e-7
metric表⽰向量间距离度量的⽅式,默认是欧⽒距离。如果是precomputed,则输⼊X是计算好的距离矩阵。也可以是⾃定义的距离度量函数。
init初始化,默认为random。取值为random为随机初始化,取值为pca为利⽤PCA进⾏初始化(常⽤),取值为numpy数组时必须shape=(n_samples, n_components)
verbose是否打印优化信息,取值0或1,默认为0=>不打印信息。打印的信息为:近邻点数量、耗时、σσ、KL散度、误差等random_state随机数种⼦,整数或RandomState对象
method两种优化⽅法:barnets_hut和exact。第⼀种耗时O(NlogN),第⼆种耗时O(N^2)但是误差⼩,同时第⼆种⽅法不能⽤于百万级样本
angle当method=barnets_hut时,该参数有⽤,⽤于均衡效率与误差,默认值为0.5,该值越⼤,效率越⾼&误差越⼤,否则反之。当该值在0.2-0.8之间时,⽆变化。
返回对象的属性表:
Atrtributes描述
embedding_嵌⼊后的向量
kl_divergence_KL散度
n_iter_迭代的轮数
t-distributed Stochastic Neighbor Embedding(t-SNE)
t-SNE可降样本点间的相似度关系转化为概率:在原空间(⾼维空间)中转化为基于⾼斯分布的概率;在嵌⼊空间(⼆维空间)中转化为基于t分布的概率。这使得t-SNE不仅可以关注局部(SNE只关注相邻点之间的相似度映射⽽忽略了全局之间的相似度映射,使得可视化后的边界不明显),还关注全局,使可视化效果更好(簇内不会过于集中,簇间边界明显)。
⽬标函数:原空间与嵌⼊空间样本分布之间的KL散度。
优化算法:梯度下降。
注意问题:KL散度作⽬标函数是⾮凸的,故可能需要多次初始化以防⽌陷⼊局部次优解。
t-SNE的缺点:
计算量⼤,耗时间是PCA的百倍,内存占⽤⼤。
专⽤于可视化,即嵌⼊空间只能是2维或3维。
需要尝试不同的初始化点,以防⽌局部次优解的影响。
t-SNE的优化
在优化t-SNE⽅⾯,有很多技巧。下⾯5个参数会影响t-SNE的可视化效果:
perplexity 混乱度。混乱度越⾼,t-SNE将考虑越多的邻近点,更关注全局。因此,对于⼤数据应该使⽤较⾼混乱度,较⾼混乱度也可以帮助t-SNE拜托噪声的影响。相对⽽⾔,该参数对可视化效果影响不⼤。
early exaggeration factor 该值表⽰你期望的簇间距⼤⼩,如果太⼤的话(⼤于实际簇的间距),将导致
⽬标函数⽆法收敛。相对⽽⾔,该参数对可视化效果影响较⼩,默认就⾏。
learning rate 学习率。关键参数,根据具体问题调节。
maximum number of iterations 迭代次数。迭代次数不能太低,建议1000以上。
angle (not used in exact method) ⾓度。相对⽽⾔,该参数对效果影响不⼤。
PS:⼀个形象展⽰t-SNE优化技巧的⽹站
代码
例⼀
1.
import numpy as np
2.
import matplotlib.pyplot as plt
3.
from sklearn import manifold, datasets
4.
5.
digits = datasets.load_digits(n_class=6)
6.
X, y = digits.data, digits.target
7.
n_samples, n_features = X.shape
8.
9.
'''显⽰原始数据'''
10.
n = 20 # 每⾏20个数字,每列20个数字
11.
img = np.zeros((10 * n, 10 * n))
12.
for i in range(n):
13.
ix = 10 * i + 1
14.
for j in range(n):
15.
iy = 10 * j + 1
16.
img[ix:ix + 8, iy:iy + 8] = X[i * n + j].reshape((8, 8))
17.
plt.figure(figsize=(8, 8))
18.
plt.imshow(img, binary)
19.
20.
21.
plt.show()
1.
'''t-SNE'''
2.
tsne = manifold.TSNE(n_components=2, init='pca', random_state=501) 3.
X_tsne = tsne.fit_transform(X)
4.
5.
print("Org data dimension is {}.
6.
Embedded data dimension is {}".format(X.shape[-1], X_tsne.shape[-1]))
7.
8.
'''嵌⼊空间可视化'''
9.
x_min, x_max = X_tsne.min(0), X_tsne.max(0)
10.
X_norm = (X_tsne - x_min) / (x_max - x_min) # 归⼀化
11.
plt.figure(figsize=(8, 8))
12.
for i in range(X_norm.shape[0]):
13.
<(X_norm[i, 0], X_norm[i, 1], str(y[i]), Set1(y[i]),
14.
fontdict={'weight': 'bold', 'size': 9})
15.
16.
17.
plt.show()
t-SNE⾼维数据可视化(python)
t-SNE(t-distributedstochastic neighbor embedding )是⽬前最为流⾏的⼀种⾼维数据降维的算法。在⼤数据的时代,数据不仅越来越⼤,⽽且也变得越来越复杂,数据维度的转化也在惊⼈的增加,例如,⼀组图像的维度就是该图像的像素个数,其范围从数千到数百万。
对计算机⽽⾔,处理⾼维数据绝对没问题,但是⼈类能感知的确只有三个维度,因此很有必要将⾼维数据可视化的展现出来。那么如何将数据集从⼀个任意维度的降维到⼆维或三维呢。T-SNE就是⼀种数据降维的算法,其成⽴的前提是基于这样的假设:尽管现实世界中的许多数据集是嵌⼊在⾼维空间中,但是都具有很低的内在维度。也就是说⾼维数据经过降维后,在低维状态下更能显⽰出其本质特性。这就是流⾏学习的基本思想,也称为⾮线性降维。
关于t-SNE的详细介绍可以参考:
下⾯就展⽰⼀下如何使⽤t-SNE算法可视化sklearn库中的⼿写字体数据集。
1.
import numpy as np
2.
import sklearn
3.
from sklearn.manifold import TSNE
4.
from sklearn.datasets import load_digits
5.
6.
# Random state.
7.
RS = 20150101
8.
9.
import matplotlib.pyplot as plt
10.
import matplotlib.patheffects as PathEffects
11.
import matplotlib
12.
13.
# We import seaborn to make nice plots.
14.
import seaborn as sns
15.
sns.set_style('darkgrid')
16.
sns.set_palette('muted')
17.
sns.set_context("notebook", font_scale=1.5,
18.
rc={"lines.linewidth": 2.5})
numpy教程 pdf19.
digits = load_digits()
20.
# We first reorder the data points according to the handwritten numbers.
21.
X = np.vstack([digits.data[digits.target==i]
22.
for i in range(10)])
23.
y = np.hstack([digits.target[digits.target==i]
24.
for i in range(10)])
25.
digits_proj = TSNE(random_state=RS).fit_transform(X)
26.
27.
def scatter(x, colors):
28.
# We choose a color palette with seaborn.
29.
palette = np.lor_palette("hls", 10))
30.
31.
# We create a scatter plot.
32.
f = plt.figure(figsize=(8, 8))
33.
ax = plt.subplot(aspect='equal')
34.
sc = ax.scatter(x[:,0], x[:,1], lw=0, s=40,
35.
c=palette[colors.astype(np.int)])
36.
plt.xlim(-25, 25)
37.
plt.ylim(-25, 25)
38.
ax.axis('off')
39.
ax.axis('tight')
40.
41.
# We add the labels for each digit.
42.
txts = []
43.
for i in range(10):
44.
# Position of each label.
45.
xtext, ytext = np.median(x[colors == i, :], axis=0)
46.
txt = ax.text(xtext, ytext, str(i), fontsize=24)
47.
txt.set_path_effects([
48.
PathEffects.Stroke(linewidth=5, foreground="w"),
49.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论