两种经典的非线性降维(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
- Principal component analysis (PCA)
- Singular value decomposition (SVD)
- Factor analysis (FA)
- Generative topographic mapping (GTM)
- Gaussian process latent variable models (GPLVM)
- Neural network methods
- Multidimensional scaling (MDS)
- Isomap
- Locally linear embeddings (LLE)
- 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。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/163003.html