MATLAB数学建模——谱聚类

% 清除工作区和关闭所有图窗
clear; close all; clc;

%% 生成任意维度数据
d = 2; % 数据的维数 (可以调整为任意维度)
n = 100; % 每个聚类的数据点数量

% 第一个半月,除了前两维是半月形,其它维度为随机值
theta1 = linspace(0, pi, n)';
x1 = [cos(theta1), sin(theta1), randn(n, d-2)];

% 第二个半月,除了前两维是半月形,其它维度为随机值
theta2 = linspace(0, pi, n)';
x2 = [1 - cos(theta2), 1 - sin(theta2) - 0.5, randn(n, d-2)];

% 合并数据
X = [x1; x2];

% 在数据中添加一些随机噪声
X = X + 0.1 * randn(size(X));

%% 构建相似度矩阵
% 使用高斯核函数计算数据点之间的相似度
sigma = 0.1; % 高斯核的参数,控制相似度的衰减速度
N = size(X, 1); % 数据点总数
W = zeros(N, N); % 初始化相似度矩阵

for i = 1:N
    for j = 1:N
        % 计算第i个和第j个数据点之间的欧氏距离
        diff = X(i, :) - X(j, :);
        dist = norm(diff);
        % 使用高斯核函数计算相似度
        W(i, j) = exp(-dist^2 / (2 * sigma^2));
    end
end

%% 计算拉普拉斯矩阵
% 度矩阵
D = diag(sum(W, 2));

% 未归一化的拉普拉斯矩阵
L = D - W;

% 归一化的拉普拉斯矩阵
D_inv_sqrt = diag(1 ./ sqrt(sum(W, 2)));
L_normalized = D_inv_sqrt * L * D_inv_sqrt;

%% 计算拉普拉斯矩阵的特征值和特征向量
% 计算前k个最小的特征值及其对应的特征向量
k = 2; % 我们希望聚成的簇数
[EigVectors, EigValues] = eigs(L_normalized, k, 'SM'); % 'SM'表示求解最小的特征值

%% 对特征向量进行K-means聚类
% 将每个数据点对应的特征向量作为新的表示,进行K-means聚类
Y = EigVectors;
% 对行进行归一化
Y_norm = bsxfun(@rdivide, Y, sqrt(sum(Y.^2, 2)));

% 运行K-means算法
idx = kmeans(Y_norm, k);

%% 可视化聚类结果(仅适用于二维或三维数据)
if d == 2
    % 如果是二维数据,使用散点图可视化结果
    figure;
    gscatter(X(:,1), X(:,2), idx, 'rb', 'o^', 8);
    title('谱聚类结果(二维)');
    xlabel('X1');
    ylabel('X2');
    grid on;
    legend('簇 1', '簇 2');
elseif d == 3
    % 如果是三维数据,使用3D散点图可视化结果
    figure;
    scatter3(X(:,1), X(:,2), X(:,3), 50, idx, 'filled');
    title('谱聚类结果(三维)');
    xlabel('X1');
    ylabel('X2');
    zlabel('X3');
    grid on;
    legend('簇 1', '簇 2');
else
    disp('由于维数较高,无法直接可视化聚类结果。');
end

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值