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

以八维数据为例

设原本聚类数是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
相关推荐
Cathy Bryant几秒前
傅里叶变换(二):旋转楼梯
笔记·算法·数学建模·信息与通信·傅里叶分析
2401_841495642 分钟前
【LeetCode刷题】零钱兑换
数据结构·python·算法·leetcode·动态规划·数组·时间复杂度
C雨后彩虹5 分钟前
ConcurrentHashMap 源码逐行拆解:put/get 方法的并发安全执行流程
java·算法·哈希算法·集合·hashmap
子夜江寒8 分钟前
SVM、K-means与DBSCAN 算法简介
算法·支持向量机·kmeans
aigcapi7 小时前
RAG 系统的黑盒测试:从算法对齐视角解析 GEO 优化的技术指标体系
大数据·人工智能·算法
柯慕灵8 小时前
7大推荐系统/算法框架对比
算法·推荐算法
adam-liu8 小时前
Fun Audio Chat 论文+项目调研
算法·语音端到端·fun-audio-chat
栀秋6669 小时前
你会先找行还是直接拍平?两种二分策略你Pick哪个?
前端·javascript·算法
如果你想拥有什么先让自己配得上拥有9 小时前
数学思想和数学思维分别都有什么?
线性代数·算法·机器学习
长安er10 小时前
LeetCode136/169/75/31/287 算法技巧题核心笔记
数据结构·算法·leetcode·链表·双指针