流形学习(⼀)LLE在MATLAB中的实现及实例
⽬录
流形学习,全称流形学习⽅法(Manifold Learning),⾃2000年在著名的科学杂志《Science》被⾸次提出以来,已成为信息科学领域的研究热点。在理论和应⽤上,流形学习⽅法都具有重要的研究意义。假设数据是均匀采样于⼀个⾼维欧⽒空间中的低维,流形学习就是从⾼维采样数据中恢复低维流形结构,即找到⾼维空间中的低维流形,并求出相应的嵌⼊映射,以实现维数约简或者数据可视化。它是从观测到的现象中去寻找事物的本质,找到产⽣数据的内在规律。(百度百科)
下⾯我们将介绍三种流形学习及其在瑞⼠卷上的应⽤
LLE(Locally linear Embedding)
LLE ⽅法是发表在science上的⽂章, 是流形学习的开⼭之作,⾃然被最先介绍。论⽂地址为
S. Roweis and L. Saul, “Nonlinear dimensionality reduction by locally linear embedding,” Science, vol. 290, pp. 2323–2326, 2000.
清仓处理广告词
基本思想
给定数据集,通过最近邻等⽅式构造⼀个数据图(data graph)。然后在每⼀个局部区域,⾼维空间中的样本线性重构关系在低维空间中均得以保持。
Step1 最近邻确定与最佳权重
对于数据集中的任意⼀个, 按照欧式距离我们确定出离它最近的 k 个元素, 记为 , 我们计算 的最优权重表⽰
由拉格朗⽇乘⼦法,可得 的线性表⽰解为
其中
step2 全局嵌⼊学习模型
我们希望对于降维后的数据也有这种局部线性重构关系, 即
故有此可得⽬标函数
故学习模型为
step3 求解优化问题
对矩阵 进⾏特征分解
1. 取出该矩阵最⼩的k+1个特征值对应的特征向量
2. 丢弃特征值零对应的分量全相等的特征向量
3. 即采⽤第2⾄第d+1个最⼩的特征值对应的特征向量组成样本的新的坐标
由于我们侧重于程序实现,故具体证明细节不作展开,只作简要分析,可以参考这篇博客查看具体细节
算法步骤
MATLAB程序实现
考虑对如下瑞⼠卷数据进⾏分类
N = 2000;
rand('state',123456789);
%Gaussian noi
noi = 0.001*randn(1,N);
%standard swiss roll data
tt = (3*pi/2)*(1+2*rand(1,N)); height = 21*rand(1,N); X = [(tt+ noi).*cos(tt); height; (tt+ noi).*sin(tt)];
将其可视化
%show the picture
point_size = 20;
figure(1)
cla
scatter3(X(1,:),X(2,:),X(3,:), point_size,tt,'filled');
view([12 12]); grid off; axis off; hold on;
axis off;
axis equal;
drawnow;
有
我们取最近邻个数为12 ,降维为2维,即
k = 12;如何更改电脑开机密码
d = 2;
X = X';
计算每个元素对应的最近邻元素,并按照
来计算 W 的值, 此处lambda是为了防⽌矩阵奇异
[m, ~] = size(X); % d < ~
lambda = 1e-10;
W = zeros(m);
e = ones(k,1);
for i =1 : m
xx = repmat(X(i, :), m, 1);
diff = xx - X;
dist = sum(diff.* diff, 2);
[~, pos] = sort(dist);
index = pos(1 : k + 1)';
index(index == i) = [];
w_numerator = (X(index, :) * X(index, :)' + lambda * eye(k)) \ e;
w_denominator = e' * w_numerator;
w = w_numerator / w_denominator;
W(i, index) = w;
end
6级真题
令 , 则问题的解为 A的第2到d+1个⼩特征值对应的特征向量,即
W =spar(W);
I = eye(m);
A = (I - W)' * (I - W); [eigenvector, eigenvalue] = eig(A); eigenvalue = diag(eigenvalue);
[~,pos] = sort(eigenvalue);
index = pos(1: d+1);
tran = eigenvector(:, index);
p =sum(tran.*tran);
j = find(p == min(p));
tran(:, j) = [];
X = tran;
最后显⽰降维结果
figure(2)
scatter(X(:,1),X(:,2),point_size, tt,'filled'); grid off; axis off;
即
攻壳机动队sss
总的MATLAB代码
function X = LLE(X, k, d)
%% minifold learning: locally linear embedding
% k : neighbors
% x : data t
% d : low dimension;
if nargin < 1
N = 2000;
rand('state',123456789);
%Gaussian noi
noi = 0.001*randn(1,N);
%standard swiss roll data
tt = (3*pi/2)*(1+2*rand(1,N)); height = 21*rand(1,N);
X = [(tt+ noi).*cos(tt); height; (tt+ noi).*sin(tt)];
%show the picture
point_size = 20;
figure(1)
服兵役的条件cla
scatter3(X(1,:),X(2,:),X(3,:), point_size,tt,'filled');
view([12 12]); grid off; axis off; hold on;
axis off;
axis equal;
drawnow;
经常梦到前男友是怎么回事
railwaysX = X';
k = 12;
d = 2;
end
[m, ~] = size(X); % d < ~
lambda = 1e-10;
W = zeros(m);
e = ones(k,1);
for i =1 : m
xx = repmat(X(i, :), m, 1);
diff = xx - X;
dist = sum(diff.* diff, 2);
[~, pos] = sort(dist);
index = pos(1 : k + 1)';
index(index == i) = [];
w_numerator = (X(index, :) * X(index, :)' + lambda * eye(k)) \ e; w_denominator = e' * w_numerator;
w = w_numerator / w_denominator;
W(i, index) = w;
2019年国庆
end
W =spar(W);
I = eye(m);
A = (I - W)' * (I - W);
[eigenvector, eigenvalue] = eig(A);
eigenvalue = diag(eigenvalue);
[~,pos] = sort(eigenvalue);
index = pos(1: d+1);
tran = eigenvector(:, index);
p =sum(tran.*tran);
j = find(p == min(p));
tran(:, j) = [];
X = tran;
figure(2)
scatter(X(:,1),X(:,2),point_size, tt,'filled');
grid off; axis off;
下⼀篇我们将介绍 Isomap 算法的思想及实现,详见