深度学习巨头之一的Hinton大神在数据降维领域有一篇经典论文Visualizing Data using t-SNE。该方法是流形(非线性)数据降维的经典,从发表至今鲜有新的降维方法能全面超越。该方法相比PCA等线性方法能有效将数据投影到低维空间并保持严格的分割界面;缺点是计算复杂度大,一般推荐先线性降维然后再用tSNE降维。python sklearn有相应的实现。我现在用Tensorflow实现这个算法。
tSNE的核心思想是:把高维数据看做高维空间中的点
with tf.device(‘/cpu:0‘):
X = tf.placeholder(‘float‘,(150,150))
initial = tf.random_normal([150,2]) * 0.0001#映射到二维空间
Y = tf.Variable(initial)
A = tf.reduce_sum(Y*Y, axis=1)
A = tf.reshape(r, [-1, 1])
#pair wise distance
pairD = A - 2*tf.matmul(Y, tf.transpose(Y)) + tf.transpose(A) + 1.
qij = 1./pairD
sumq = tf.reduce_sum(qij,axis=1)
qij /= sumq
loss = tf.reduce_sum( X*tf.log(X / qij) )
global_step = tf.Variable(0, name = ‘global_step‘,trainable=False)
starter_learning_rate = 0.1
learning_rate = tf.train.exponential_decay(starter_learning_rate, global_step,20, 0.95, staircase=True)
train_op = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(loss=loss,global_step = global_step)
直接使用原始数据绘图第0、1维:
求解之后,绘制图像得到
经过tSNE降维映射,不同的数据在低维空间中依然能够被分开。整个最优化过程空间复杂度较高;此外不同的参数会导致最终的降维图不一样,但是降维图中的3类数据全部都被分隔开了。这个降维方法用于可视化居多。全程由Tensorflow自动最优化得到,如果使用GPU的话更加快,tSNE计算慢的问题可以解决了,空间复杂度有点头疼。
原文:http://blog.csdn.net/lpsl1882/article/details/58741475