IsoMap实战

两种经典的非线性降维(Nonlinear Dimensionality Reduction)方法:LLE和IsoMap。实验有很多环节,最有趣的一个环节, 是给你698张人脸的图像(64×64灰度),通过isomap降维方法将每张脸当做一个点映到二维平面上,使得横坐标恰好反映人脸左右看的程度,纵坐标反映人脸上下看的程度。
1.实验环境:Matlab6.5

2.实验步骤

步骤一:准备数据集和工具包

下载人脸数据集:http://waldron.stanford.edu/~isomap/face_data.mat.Z

下载isomap算法实现的所有代码http://waldron.stanford.edu/~isomap/code/

步骤二:

准备图片标记的人脸序号集:一共有698张人脸,都画在平面上太拥挤了,所以选了30个人脸(存入posesSelect.mat的ks向量),选取的准则是:30个人脸的姿态尽量不同,也就是希望画在平面上尽量分散。事实上,face_data.mat数据集中,poses是一个2行698列的矩阵,第j列就是第j张人脸的客观姿态。

绘制客观姿态分布图:

load face_data

load posesSelect

showFacesOnR2(images,poses,ks)

http://lh6.ggpht.com/_iMG9M3S-9Xo/SWXkfHPcWNI/AAAAAAAACBs/otRKwIQ6DMc/s800/image002.gif

步骤三:降维

用Isomap算法将4096维的人脸数据images降维到2维,并绘制在平面上

load face_data

load posesSelect

D=L2_distance(images,images,1);

options.dims = [2];

[Y, R, E] = IsomapII(D, 'k', 7, options);

showFacesOnR2(images,Y.coords{1},ks);

http://lh4.ggpht.com/_iMG9M3S-9Xo/SWXkfu3IIOI/AAAAAAAACB0/nbFaLN3X1HM/s800/image004.gif

D是一个距离矩阵,i行j列值表示人脸i和人脸j的距离,这里把一个人脸图像数据当做一个向量,使用2范数定义距离。

IsoMapII是高性能算法,先把D用k=7近邻打成稀疏矩阵,然后用基于斐波那契堆的Dijkstra算法计算最短路,Dijkstra算法用C实现使用并且编译成了.dll文件为了提高效率。计算结果对我们有用的是Y.coords{1},它保存了降维后的结果,是2行698列的矩阵。

观察计算结果发现,以中间那个正的人脸为中心,他左边的都在向左看,而且越是靠左的转动越明显。同理,他右面的都在向右看、上面的都在向下看、下面的在向上看。与客观姿态分布基本吻合。

3.实验细节:

showFacesOnR2.m

%把头像和姿态坐标画在平面上

function showFacesOnR2(images,poses,ks);

%normalize into 1:1

poses(1,:)=poses(1,:)/range(poses(1,:));

poses(2,:)=poses(2,:)/range(poses(2,:));

%draw all points

scatter(poses(1,:),poses(2,:),12,'o','filled');

xlabel('left-right pose');

ylabel('up-down pose');

hold on

%draw selected points

scatter(poses(1,ks),poses(2,ks),24,'ro');

hold on

%draw images on selected points

scale = 0.001;

x=zeros(64,64);

for p=1:size(ks,2)

    k=ks(p);

    for i=1:64

        x(:,i)=images((i-1)*64+1:i*64,k);

    end

    xc=poses(1,k);

    yc=poses(2,k);

    imshow(xc:scale:xc+64*scale,yc:-scale:yc-64*scale,x);

    hold on

end

return

4.实验总结:
高維度的資料往往很難描述、計算,一個常用的方法是假設這些資料並非真的存在於這麼高的維度上,也就是說,可以用一個較低維度的非線性流形
(non-linear manifold)  來模擬這些資料。流形(Manifold) ,一般可以認為是局部具有歐氏空間性質的空間。而實際上歐氏空間就是流形最簡單的實例。像地球表面
這樣的球面是一個稍為複雜的例子。一般的流形可以通過把許多平直的片折彎並粘連而成。
如果這個manifold 的維度夠低,我們就可以在這個低維度的空間上視覺化原先的資料。降維的方法可以概括分成以下三種: 
1. 線性方法(Linear methods) 
  • Principal component analysis (PCA) 
  • Singular value decomposition (SVD) 
  • Factor analysis (FA) 
2. 非線性對應(Non-linear mappings) 
  • Generative topographic mapping (GTM) 
  • Gaussian process latent variable models (GPLVM) 
  • Neural network methods 
3. 逼近法(Proximity) 
  • Multidimensional scaling (MDS) 
  • Isomap 
  • Locally linear embeddings (LLE) 
Isomap 
  • Step 1:Isomap的input 是許多高維度的 data ,並把它們當作一個 graph,只要兩個vertex 是鄰居,就會有一條edge 連結,至於鄰居的判定方法可以是K-nearest neighbors 或是用直接距離再取threshold 都可以。 
  • Step 2:接著,利用Floyd’s Algorithm 算出每個vertex 之間的shortest path distances 。 
  • Step 3:最後,把 Step 2 當中的結果當作MMDS的input,就可以得到一個座標軸,利用這個座標軸描述出的data 就是一個低維度的 manifold。 
Isomap 的演算法雖然簡單,但確實解決了PCA 或其他linear methods 在non-linear manifold 上遇到的問題,透過”neighbor”的定義,加強了各 data 之間的連結性,而不是只以絕對距離當作衡量的方法。 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值