sklearn.manifold.TSNE可视化高位数据工具

manifold learning流形学习

多维度数据集非常难于可视化。反而2维或者3维数据很容易通过图表展示数据本身的内部结构,等价的高维绘图就远没有那么直观了。为了实现数据集结构的可视化,数据的维度必须通过某种方式降维。

最简单的降维手段是数据的随机投影。虽然这种方式实现一定程度的数据结构可视化,但是选择的随意性导致结果远不如意。在随机投影中,更有趣的结构容易丢失。

​ 为了解决这种问题,人们设计了一系列监督或非监督的线性降维框架,例如Principal Component Analysis(PCA,主成分分析)、Independent Component Analysis(独立成分分析)、 Linear Discriminant Analysis(线性判别分析)…这些算法定义了特殊的评估量用于多维数据选择有趣的线性投影,这些手段是有效的,不过经常会错失数据结构中的非线性项。

​ Manifold Learing是一种非线性降维的手段,可以看作一种生成类似PCA的线性框架,不同的是可以对数据中的非线性结构敏感。虽然存在监督变体,但是典型的流式学习问题是非监督的:它从数据本身学习高维结构,不需要使用既定的分类

t-SNE 

是可视化高维数据的工具。它将数据点之间的相似性转换为联合概率,并尝试最小化低维嵌入和高维数据的联合概率之间的Kullback-Leibler差异。t-SNE的成本函数不是凸的,即使用不同的初始化,我们可以获得不同的结果。

如果特征的数量非常多,强烈建议使用另一种降维方法(例如,对于密集数据使用PCA或对于稀疏数据使用TruncatedSVD)将尺寸数量减少到合理的数量(例如50个)。这将抑制一些噪声并加快样本之间成对距离的计算。有关更多技巧

用法

反正只需要了解这个函数的大概用途是将特征弄成一坨,变成一个变量,然后和聚类后的label画图就OK了,具体原理细节,暂时不深究

class sklearn.manifold.TSNE(n_components=2, *, perplexity=30.0, early_exaggeration=12.0, learning_rate=200.0, 
n_iter=1000, n_iter_without_progress=300, min_grad_norm=1e-07, metric='euclidean', init='random', verbose=0,
random_state=None, method='barnes_hut', angle=0.5, n_jobs=None)

参数什么的请参考官方文档:https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html

这里主要看一些怎么使用

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans

X=load_iris().data
kmeans = KMeans(n_clusters=3,random_state=0)
kmeans.fit(X)

labels = kmeans.labels_
labels = pd.DataFrame(labels,columns=['labels'])
X=pd.DataFrame(X)
X.insert(4,'labels',labels)

from sklearn.manifold import TSNE
tsne = TSNE()
a = tsne.fit_transform(X)
liris = pd.DataFrame(a,index=X.index)

d1 = liris[X['labels']==0]
#plt.plot(d1[0],d1[1],'r.')
d2 = liris[X['labels']==1]
#plt.plot(d2[0],d2[1],'go')
d3 = liris[X['labels']==2]
#plt.plot(d3[0],d3[1],'b*')
plt.plot(d1[0],d1[1],'r.',d2[0],d2[1],'go',d3[0],d3[1],'b*')

原文地址:https://www.cnblogs.com/cgmcoding/p/14072237.html