t-SNE(Stochastic Neighbor Embedding t分布随机邻域嵌入)
PCA的局限性
PCA是一种线性算法,它不能解释特征之间的复杂多项式关系。而t-SNE是基于在邻域图上随机游走的概率分布来找到数据内的结构。
线性降维算法的一个主要问题是不相似的数据点放置在较低维度表示为相距甚远。但为了在低维度用非线性流形表示高维数据,相似数据点必须表示为非常靠近,这不是线性降维算法所能做的。
t-SNE算法的细节
步骤1:
随机邻接嵌入(SNE)通过将数据点之间的高维欧几里得距离转换为表示相似性的条件概率而开始,数据点之间的条件概率
由下式给出:
其中是以数据点为中心的高斯方差。
步骤2:
对于高维数据点和
的低维对应点和而言,可以计算类似的条件概率
SNE试图最小化条件概率的差异。
步骤3:
为了测量条件概率差的和最小值,SNE使用梯度下降法最小化KL距离。而SNE代价函数关注于映射中数据的局部结构,优化该函数是非常困难的,而t-SNE采用重尾分布,以减轻拥挤问题和SNE的优化问题。
步骤4:
定义困惑度:
其中是香农熵:
t-SNE实际上是做什么?
t-SNE非线性降维算法通过基于具有多个特征的数据点的相似性识别观察到的簇来在数据中找到模式。本质上是一种降维和可视化技术。另外t-SNE的输出可以作为其他分类算法的输入特征。
t-SNE与其他降维算法相比
基于所实现的精度,将t-SNE与PCA和其他线性降维模型相比,结果表明t-SNE能够提供更好的结果。这是因为算法定义了数据的局部和全部结构之间的软边界。
python代码实现t-SNE降维
# coding=utf-8
from sklearn.manifold import TSNE
from pandas.core.frame import DataFrame
import pandas as pd
import numpy as np
l=[]
with open('1.csv','r') as fd:
line= fd.readline()
while line:
if line =="":
continue
line = line.strip()
word = line.split(",")
l.append(word)
line= fd.readline()
data_l=DataFrame(l)
print ("data_l ok")
dataMat = np.array(data_l)
pca_tsne = TSNE(n_components=2)
newMat = pca_tsne.fit_transform(dataMat)
data1 = DataFrame(newMat)
data1.to_csv('2.csv',index=False,header=False)