n = 1000;
k = 10; % 10 近邻相似度
a = 3 * pi * rand(n,1);
x = [a.*cos(a) 30*rand(n,1) a.*sin(a)]; % 3 维
x = x-repmat(mean(x),[n,1]); % 中心化
x2=sum(x.^2,2);
d = repmat(x2,1,n)+repmat(x2',n,1)-2*x*x';% 高斯核函数
[p,i]=sort(d);
W = sparse(d<=ones(n,1)*p(k+1,:)); % 创建相似度矩阵(稀疏矩阵)
W = (W+W'~=0);
D=diag(sum(W,2));
L=D-W;
[z,v]=eigs(L,D,3,'sm'); % 求一般化特征值
figure(1);
clf;
hold on;
view([15 10]);
scatter3(x(:,1),x(:,2),x(:,3),40,a,'o');
figure(2);
clf;
hold on;
scatter(z(:,2),z(:,1),40,a,'o');
初始化变量:
n = 1000:数据点的数量。
k = 10:近邻的数量,用于计算相似度。
a = 3 * pi * rand(n,1):生成一个长度为n的随机向量a,用于生成数据点的坐标。
x = [a.*cos(a) 30*rand(n,1) a.*sin(a)]:根据随机向量a生成三维数据点的坐标。数据点的x坐标由a的余弦值决定,y坐标为随机值,z坐标由a的正弦值决定。
x = x-repmat(mean(x),[n,1]):将数据点进行中心化,即将每个维度的均值减去整个数据集在该维度上的均值。
计算相似度矩阵W:
x2=sum(x.^2,2):计算每个数据点的平方和。
d = repmat(x2,1,n)+repmat(x2',n,1)-2*x*x':计算数据点之间的欧氏距离的平方,得到距离矩阵d。
[p,i]=sort(d):对距离矩阵d进行排序,返回排序后的值和对应的索引。
W = sparse(d<=ones(n,1)*p(k+1,:)):创建相似度矩阵W,将距离小于等于第k+1个最近邻距离的元素设为1,其余元素设为0。这里使用了稀疏矩阵表示以节省内存。
W = (W+W'~=0):将相似度矩阵W转化为对称矩阵,将非零元素设为1。
D=diag(sum(W,2)):计算度矩阵D,对角线上的元素为每个数据点与其他数据点的相似度之和。
计算拉普拉斯矩阵L和一般化特征值:
L=D-W:计算拉普拉斯矩阵L,L的对角线元素为度矩阵D的对角线元素减去相似度矩阵W的对应元素。
[z,v]=eigs(L,D,3,'sm'):通过求解广义特征值问题,找到L对应于度矩阵D的前3个最小的特征值和特征向量。结果存储在z和v中,其中z是特征向量矩阵,v是特征值矩阵。
可视化结果:
figure(1):创建第一个图形窗口。
scatter3(x(:,1),x(:,2),x(:,3),40,a,'o'):在三维空间中绘制数据点的散点图,颜色由向量a决定。
figure(2):创建第二个图形窗口。
scatter(z(:,2),z(:,1),40,a,'o'):在二维空间中绘制数据点的散点图,颜色由向量a决定。这里只使用了z的前两个特征向量进行可视化。