寫在前面
- 態(tài)度決定高度!讓優(yōu)秀成為一種習(xí)慣!
- 世界上沒有什么事兒是加一次班解決不了的,如果有,就加兩次!(- - -茂強(qiáng))
綜述
面對(duì)著大數(shù)據(jù)時(shí)代的發(fā)展,數(shù)據(jù)成為目前一切科學(xué)的基礎(chǔ),擁有數(shù)據(jù),就代表著擁有商機(jī),擁有決定權(quán),每個(gè)公司或者科研項(xiàng)目,想要用實(shí)際說話,就必須有一個(gè)良好的數(shù)據(jù)基礎(chǔ),所以數(shù)據(jù)清晰,數(shù)據(jù)結(jié)構(gòu)化,標(biāo)準(zhǔn)化,數(shù)據(jù)降維,數(shù)據(jù)可視化是目前大數(shù)據(jù)或者數(shù)據(jù)科學(xué)重中之重。
目前的數(shù)據(jù)降維技術(shù)
我們可以用一張圖來說明一下目前的數(shù)據(jù)降維技術(shù)
-
主成分分析算法(PCA)
Principal Component Analysis(PCA)是最常用的線性降維方法,它的目標(biāo)是通過某種線性投影,將高維的數(shù)據(jù)映射到低維的空間中表示,并期望在所投影的維度上數(shù)據(jù)的方差最大,以此使用較少的數(shù)據(jù)維度,同時(shí)保留住較多的原數(shù)據(jù)點(diǎn)的特性。
通俗的理解,如果把所有的點(diǎn)都映射到一起,那么幾乎所有的信息(如點(diǎn)和點(diǎn)之間的距離關(guān)系)都丟失了,而如果映射后方差盡可能的大,那么數(shù)據(jù)點(diǎn)則會(huì)分散開來,以此來保留更多的信息。可以證明,PCA是丟失原始數(shù)據(jù)信息最少的一種線性降維方式。(實(shí)際上就是最接近原始數(shù)據(jù),但是PCA并不試圖去探索數(shù)據(jù)內(nèi)在結(jié)構(gòu))
設(shè)n維向量w為目標(biāo)子空間的一個(gè)坐標(biāo)軸方向(稱為映射向量),最大化數(shù)據(jù)映射后的方差,有:
主成分目標(biāo)
其中m是數(shù)據(jù)實(shí)例的個(gè)數(shù), xi是數(shù)據(jù)實(shí)例i的向量表達(dá), x拔是所有數(shù)據(jù)實(shí)例的平均向量。定義W為包含所有映射向量為列向量的矩陣,經(jīng)過線性代數(shù)變換,可以得到如下優(yōu)化目標(biāo)函數(shù):
優(yōu)化目標(biāo)函數(shù)
其中tr表示矩陣的跡
A
A是數(shù)據(jù)協(xié)方差矩陣。
容易得到最優(yōu)的W是由數(shù)據(jù)協(xié)方差矩陣前k個(gè)最大的特征值對(duì)應(yīng)的特征向量作為列向量構(gòu)成的。這些特征向量形成一組正交基并且最好地保留了數(shù)據(jù)中的信息。
PCA的輸出就是Y = W‘X,由X的原始維度降低到了k維。
PCA追求的是在降維之后能夠最大化保持?jǐn)?shù)據(jù)的內(nèi)在信息,并通過衡量在投影方向上的數(shù)據(jù)方差的大小來衡量該方向的重要性。但是這樣投影以后對(duì)數(shù)據(jù)的區(qū)分作用并不大,反而可能使得數(shù)據(jù)點(diǎn)揉雜在一起無法區(qū)分。這也是PCA存在的最大一個(gè)問題,這導(dǎo)致使用PCA在很多情況下的分類效果并不好。具體可以看下圖所示,若使用PCA將數(shù)據(jù)點(diǎn)投影至一維空間上時(shí),PCA會(huì)選擇2軸,這使得原本很容易區(qū)分的兩簇點(diǎn)被揉雜在一起變得無法區(qū)分;而這時(shí)若選擇1軸將會(huì)得到很好的區(qū)分結(jié)果。
PCA - Linear Discriminant Analysis(LDA)線性判別分析
Linear Discriminant Analysis (也有叫做Fisher Linear Discriminant)是一種有監(jiān)督的(supervised)線性降維算法。與PCA保持?jǐn)?shù)據(jù)信息不同,LDA是為了使得降維后的數(shù)據(jù)點(diǎn)盡可能地容易被區(qū)分!
了解詳情可參考LDA線性判別 -
基于重建權(quán)值 (LLE)
Locally linear embedding(LLE)是一種非線性降維算法,它能夠使降維后的數(shù)據(jù)較好地保持原有流形結(jié)構(gòu)。LLE可以說是流形學(xué)習(xí)方法最經(jīng)典的工作之一。很多后續(xù)的流形學(xué)習(xí)、降維方法都與LLE有密切聯(lián)系。
見圖1,使用LLE將三維數(shù)據(jù)(b)映射到二維(c)之后,映射后的數(shù)據(jù)仍能保持原有的數(shù)據(jù)流形(紅色的點(diǎn)互相接近,藍(lán)色的也互相接近),說明LLE有效地保持了數(shù)據(jù)原有的流行結(jié)構(gòu)。
但是LLE在有些情況下也并不適用,如果數(shù)據(jù)分布在整個(gè)封閉的球面上,LLE則不能將它映射到二維空間,且不能保持原有的數(shù)據(jù)流形。那么我們?cè)谔幚頂?shù)據(jù)中,首先假設(shè)數(shù)據(jù)不是分布在閉合的球面或者橢球面上。
LLE
LLE算法認(rèn)為每一個(gè)數(shù)據(jù)點(diǎn)都可以由其近鄰點(diǎn)的線性加權(quán)組合構(gòu)造得到。算法的主要步驟分為三步:(1)尋找每個(gè)樣本點(diǎn)的k個(gè)近鄰點(diǎn);(2)由每個(gè)樣本點(diǎn)的近鄰點(diǎn)計(jì)算出該樣本點(diǎn)的局部重建權(quán)值矩陣;(3)由該樣本點(diǎn)的局部重建權(quán)值矩陣和其近鄰點(diǎn)計(jì)算出該樣本點(diǎn)的輸出值。具體的算法流程如圖2所示:
流程 - Laplacian Eigenmaps 拉普拉斯特征映射
繼續(xù)寫一點(diǎn)經(jīng)典的降維算法,前面介紹了PCA,LDA,LLE,這里講一講Laplacian Eigenmaps。其實(shí)不是說每一個(gè)算法都比前面的好,而是每一個(gè)算法都是從不同角度去看問題,因此解決問題的思路是不一樣的。這些降維算法的思想都很簡(jiǎn)單,卻在有些方面很有效。這些方法事實(shí)上是后面一些新的算法的思路來源。
Laplacian Eigenmaps看問題的角度和LLE有些相似,也是用局部的角度去構(gòu)建數(shù)據(jù)之間的關(guān)系。詳情可參考:拉普拉斯特征映射
其他的就不一一介紹了,下面就切入正題,本文將介紹一種新的降維方式
T-SNE降維
TSNE是由SNE衍生出的一種算法,SNE最早出現(xiàn)在2002年,它改變了MDS和ISOMAP中基于距離不變的思想,將高維映射到低維的同時(shí),盡量保證相互之間的分布概率不變,SNE將高維和低維中的樣本分布都看作高斯分布,而Tsne將低維中的坐標(biāo)當(dāng)做T分布,這樣做的好處是為了讓距離大的簇之間距離拉大,從而解決了擁擠問題。從SNE到TSNE之間,還有一個(gè)對(duì)稱SNE,其對(duì)SNE有部分改進(jìn)作用。
可以參考TSNE
-
首先介紹一下SNE
高維數(shù)據(jù)用X表示,Xi表示第i個(gè)樣本,低維數(shù)據(jù)用Y表示,則高維中的分布概率矩陣P定義如下:
X
P(i,j)表示第i個(gè)樣本分布在樣本j周圍的概率。delta是依據(jù)最大熵原理來決定,entropy=sum(pi*log(pi)),以每個(gè)樣本點(diǎn)作為中心的delta都需要使得最后分布的熵較小,通常以log(k)為上限,k為你所決定的鄰域點(diǎn)的個(gè)數(shù)。
低維中的分布概率矩陣計(jì)算如下:
Y
這里我們把低維中的分布看作是均衡的,每個(gè)delta都是0.5,由此可以基本判斷最后降維之后生成的分布也是一個(gè)相對(duì)均勻的分布。
隨機(jī)給定一個(gè)初始化的Y,進(jìn)行優(yōu)化,使得Y的分布矩陣逼近X的分布矩陣。我們給定目的函數(shù),用KL散度來定義兩個(gè)不同分布之間的差距:
KL
則可以計(jì)算梯度為:
SGD
每次梯度下降的步長(zhǎng)可設(shè)定固定或者自適應(yīng)、隨機(jī)等,也可以加上一個(gè)動(dòng)量的梯度,初始值一般設(shè)為1e-4的隨機(jī)正態(tài)分布。
STEP
這樣通過不斷的迭代,就可以達(dá)到X,Y分布的逼近 -
對(duì)稱SNE
顧名思義,就是讓高維和低維中的概率分布矩陣是對(duì)稱的,能方便運(yùn)算,但是對(duì)擁擠問題無改進(jìn)。
低維的分布為:
Y
高維的分布為:
X
同樣采用KL散度作為兩個(gè)分布之間的差異標(biāo)準(zhǔn),只是梯度有一些改變:
梯度 -
TSNE
TSNE對(duì)高維中的分布采用對(duì)稱SNE中的做法,低維中的分布則采用更一般的T分布,也是對(duì)稱的,我們可以發(fā)現(xiàn)sum(P)=sum(Q)=1。
高維分布:
X
低維一版的T分布
Y
則梯度為:
梯度
TSNE算法流程如下:
TSNE算法流程 - 最后不得不說一下LargeVis
這個(gè)是最新的流形學(xué)數(shù)據(jù)降維方式,主要也是采用了tnse的思想,LargeVis在t-SNE改進(jìn)算法的基礎(chǔ)上,參考了近年來較為新穎的優(yōu)化技巧,如隨機(jī)投影樹、負(fù)采樣、邊采樣(實(shí)質(zhì)也是負(fù)采樣)等,直接將訓(xùn)練的時(shí)間復(fù)雜度降至線性級(jí)。
怎么用可以參考LargeVis
數(shù)據(jù)降維的實(shí)現(xiàn)
推薦大家參考一下數(shù)據(jù)降維
tsne可以參考TSNE
- 看個(gè)tsne的python例子
import numpy as np
from sklearn.manifold import TSNE
X = np.array([[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]])
model = TSNE(n_components=2, random_state=0)
np.set_printoptions(suppress=True)
model.fit_transform(X)
array([[ 0.00017599, 0.00003993],
[ 0.00009891, 0.00021913],
[ 0.00018554, -0.00009357],
[ 0.00009528, -0.00001407]])
如果數(shù)據(jù)量比較大,我們可以采用spark來跑tnse
可以參考: spark-tsne
在spark這個(gè)項(xiàng)目上有個(gè)很好的例子,就是MINIST
MINIST可視化
如果想更深層次的了解sne -> tsne -> largvis可以參考:
from-sne-to-tsne-to-largevis