【聚类算法】高维数据的聚类

以八维数据为例

设原本聚类数是4,目标聚类数也是4

代码:

matlab 复制代码
%% 八维数据聚类完整示例(自带数据 + 输出中心点)
% function Main_Cluster()
clc
clear
close all
%K是聚类数
%% 1. 生成 100 个 8 维样本(4 个高斯簇混合)
rng(0)                       % 保证每次结果可复现
K_true = 4;                  % 真实簇数
mu = [ 1*ones(1,8); ...
      -1*ones(1,8); ...
       3*ones(1,8); ...
      -3*ones(1,8)];         % 4×8 中心
sigma = 0.6;                 % 各维标准差
nPer = 25;                   % 每簇样本数
X = [];
for k = 1:K_true
    X = [X; mvnrnd(mu(k,:), sigma^2*eye(8), nPer)];
end
% 打乱顺序
X = X(randperm(size(X,1)), :);

%% 2. Elbow 方法自动选 K(可选)
maxK = 10;
sse  = zeros(maxK,1);
for k = 1:maxK
    [~,~,sumd] = kmeans(X,k,'Replicates',10,'Start','plus');
    sse(k) = sum(sumd);
end
figure;
plot(1:maxK, sse, '-o');
xlabel('K'); ylabel('SSE');
title('Elbow 方法选 K');
grid on;

%% 3. 用最佳 K(这里取 4)正式聚类
K =4;
[idx, C] = kmeans(X, K, 'Replicates', 20, 'Start', 'plus');

%% 4. 输出中心点
fprintf('\n==== 聚类完成 ====\n');
fprintf('K = %d 个簇的 8 维中心坐标如下:\n', K);
disp(C);                     % 4×8 矩阵

%% 5. 保存中心点到文件
writematrix(C, 'centers8D.txt', 'Delimiter', 'tab');
fprintf('中心点已写入 centers8D.txt\n');

%% 6. 2D 投影可视化(仅看前两维)
figure;
gscatter(X(:,1), X(:,2), idx);
hold on;
plot(C(:,1), C(:,2), 'kx', 'MarkerSize', 12, 'LineWidth', 2);
title('前二维投影及中心点');
xlabel('dim1'); ylabel('dim2');
grid on;

效果:

函数版代码

matlab 复制代码
%% 八维数据聚类完整示例(自带数据 + 输出中心点)
% function Main_Cluster()
clc
clear
close all
%K是聚类数
%% 1. 生成 100 个 8 维样本(4 个高斯簇混合)
rng(0)                       % 保证每次结果可复现
K_true = 4;                  % 真实簇数
mu = [ 1*ones(1,8); ...
      -1*ones(1,8); ...
       3*ones(1,8); ...
      -3*ones(1,8)];         % 4×8 中心
sigma = 0.6;                 % 各维标准差
nPer = 25;                   % 每簇样本数
X = [];
for k = 1:K_true
    X = [X; mvnrnd(mu(k,:), sigma^2*eye(8), nPer)];
end
% 打乱顺序
X = X(randperm(size(X,1)), :);
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 2.k均值聚类
maxK = 10;
K =5;
[idx, C]=K_means_Cluster(X,K,maxK);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%函数

%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 3. 输出中心点
fprintf('\n==== 聚类完成 ====\n');
fprintf('K = %d 个簇的 8 维中心坐标如下:\n', K);
disp(C);                     % 4×8 矩阵

%% 4. 保存中心点到文件
writematrix(C, 'centers8D.txt', 'Delimiter', 'tab');
fprintf('中心点已写入 centers8D.txt\n');

%% 5. 2D 投影可视化(仅看前两维)
figure;
gscatter(X(:,1), X(:,2), idx);
hold on;
plot(C(:,1), C(:,2), 'kx', 'MarkerSize', 12, 'LineWidth', 2);
title('前二维投影及中心点');
xlabel('dim1'); ylabel('dim2');
grid on;

%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Elbow 方法自动选 K(可选)
function [idx, C]=K_means_Cluster(X,K,maxK)
% maxK = 10;
sse  = zeros(maxK,1);
for k = 1:maxK
    [~,~,sumd] = kmeans(X,k,'Replicates',10,'Start','plus');
    sse(k) = sum(sumd);
end
% figure;
% plot(1:maxK, sse, '-o');
% xlabel('K'); ylabel('SSE');
% title('Elbow 方法选 K');
% grid on;

%% 3. 用最佳 K(这里取 4)正式聚类
% K =4;
[idx, C] = kmeans(X, K, 'Replicates', 20, 'Start', 'plus');
end
相关推荐
Gorway4 小时前
解析残差网络 (ResNet)
算法
拖拉斯旋风4 小时前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法
Wect4 小时前
LeetCode 207. 课程表:两种解法(BFS+DFS)详细解析
前端·算法·typescript
灵感__idea18 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
Wect1 天前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP2 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
颜酱2 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub2 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉