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

以八维数据为例

设原本聚类数是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
相关推荐
君义_noip4 分钟前
信息学奥赛一本通 1661:有趣的数列 | 洛谷 P3200 [HNOI2009] 有趣的数列
c++·算法·组合数学·信息学奥赛·csp-s
程序员:钧念7 分钟前
深度学习与强化学习的区别
人工智能·python·深度学习·算法·transformer·rag
Katecat9966312 分钟前
YOLOv8-Seg改进系列真空喷嘴质量检测与分类任务实现
yolo·分类·数据挖掘
英英_1 小时前
MATLAB数值计算基础教程
数据结构·算法·matlab
一起养小猫1 小时前
LeetCode100天Day14-轮转数组与买卖股票最佳时机
算法·leetcode·职场和发展
hele_two2 小时前
快速幂算法
c++·python·算法
l1t2 小时前
利用DeepSeek将python DLX求解数独程序格式化并改成3.x版本
开发语言·python·算法·数独
JOBkiller1232 小时前
基于YOLOv8-Seg-RepHGNetV2的银耳缺陷检测与分类实现
yolo·分类·数据挖掘
jllllyuz2 小时前
基于子集模拟的系统与静态可靠性分析及Matlab优化算法实现
算法·matlab·概率论
程序员-King.3 小时前
day143—递归—对称二叉树(LeetCode-101)
数据结构·算法·leetcode·二叉树·递归