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

以八维数据为例

设原本聚类数是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
相关推荐
IronMurphy13 分钟前
【算法四十三】279. 完全平方数
算法
墨染天姬20 分钟前
【AI】Hermes的GEPA算法
人工智能·算法
papership38 分钟前
【入门级-数据结构-3、特殊树:完全二叉树的数组表示法】
数据结构·算法·链表
smj2302_7968265242 分钟前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
Beginner x_u1 小时前
链表专题:JS 实现原理与高频算法题总结
javascript·算法·链表
瞎某某Blinder2 小时前
DFT学习记录[6]基于 HES06的能带计算+有效质量计算
python·学习·程序人生·数据挖掘·云计算·学习方法
_深海凉_5 小时前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
旖-旎5 小时前
深搜练习(电话号码字母组合)(3)
c++·算法·力扣·深度优先遍历
谭欣辰5 小时前
C++快速幂完整实战讲解
算法·决策树·机器学习
Mr_pyx6 小时前
【LeetHOT100】随机链表的复制——Java多解法详解
算法·深度优先