% 清空工作区,关闭所有图形窗口,清空命令行
clear; clc; close all;
% X的每一行都是一条数据
%% 1. 生成任意维数的数据
% 设置维度和聚类数目
numDimensions = 4; % 数据的维度
numClusters = 3; % 聚类的数量
numPointsPerCluster = 1000; % 每个聚类的点数
% 随机生成聚类中心
rng(1); % 固定随机数种子
clusterCenters = rand(numClusters, numDimensions) * 10;
% 初始化数据矩阵
X = [];
% 为每个聚类生成数据点
for i = 1:numClusters
X = [X; bsxfun(@plus, randn(numPointsPerCluster, numDimensions), clusterCenters(i,:))];
end
% 添加一些随机噪声数据点
X = [X; randn(50, numDimensions) * 5 + 20];
%% 2. 执行DBSCAN聚类
% 设置DBSCAN的参数
epsilon = 1.5; % 半径参数 影响聚类数目
minPts = 5; % 最小点数,决定形成一个聚类所需的邻域点数
% 使用DBSCAN算法进行聚类
labels = dbscan(X, epsilon, minPts);
%% 3. 可视化聚类结果
% 由于高维数据无法直接可视化,因此我们使用PCA将数据降到2维
[coeff, score, ~] = pca(X);
% 绘制降维后的聚类结果
figure;
hold on;
gscatter(score(:,1), score(:,2), labels);
title('DBSCAN聚类结果(PCA降维到2维)');
xlabel('第一主成分');
ylabel('第二主成分');
hold off;
%% 4. 显示聚类结果信息
% 获取聚类数量(不包括噪声点)
numClustersDetected = max(labels);
% 显示每个聚类的点数
for i = 1:numClustersDetected
fprintf('聚类 %d: %d 个点\n', i, sum(labels == i));
end
fprintf('噪声点: %d 个\n', sum(labels == -1));
05-03
1414