一维数据k-means聚类MATLAB手动实现与同步可视化问题咨询
MATLAB一维数据手动实现2类k-means聚类及可视化方案
核心实现逻辑
一维2类场景下k-means的实现逻辑非常简洁,无需复杂的矩阵运算:
- 从输入的1x100数据中随机选取2个不重复的值作为初始聚类质心
- 迭代计算每个数据点到两个质心的绝对距离,将点分配给距离更近的聚类
- 用每个聚类的所有点的均值更新对应质心
- 直到两次迭代的质心差值小于收敛阈值,或达到最大迭代次数后停止
完整可运行代码
%% 1. 数据准备(可替换为你自己的1x100一维数据) rng(1); % 固定随机种子方便结果复现 data = [normrnd(2, 0.8, 1, 50), normrnd(6, 0.8, 1, 50)]; % 生成两个正态分布的测试数据 k = 2; max_iter = 100; % 最大迭代次数,防止不收敛 conv_threshold = 1e-6; % 收敛判定阈值 %% 2. 初始化质心 centroids = datasample(data, k, 'Replace', false); % 从数据中选2个不重复的初始质心 prev_centroids = centroids + 10; % 初始化旧质心,保证首次迭代正常运行 %% 3. 迭代聚类 for iter = 1:max_iter % 计算所有点到两个质心的一维距离(绝对差即可) dist_to_c1 = abs(data - centroids(1)); dist_to_c2 = abs(data - centroids(2)); % 分配聚类标签:1为第一类,2为第二类 labels = (dist_to_c2 < dist_to_c1) + 1; % 更新质心 centroids(1) = mean(data(labels == 1)); centroids(2) = mean(data(labels == 2)); % 收敛判断 if max(abs(centroids - prev_centroids)) < conv_threshold break; end prev_centroids = centroids; end %% 4. 可视化(解决质心无法显示的问题) figure('Color','w'); hold on; % 必须加hold on,保证后续绘图不会覆盖已有内容 % 绘制两类数据点,y轴固定为1避免一维点重叠,用颜色区分聚类 plot(data(labels==1), ones(1, sum(labels==1)), 'bo', 'MarkerFaceColor','b', 'DisplayName','聚类1'); plot(data(labels==2), ones(1, sum(labels==2)), 'ro', 'MarkerFaceColor','r', 'DisplayName','聚类2'); % 绘制质心,用大尺寸菱形标记,调高Zorder保证显示在最上层不被遮挡 plot(centroids(1), 1, 'kd', 'MarkerSize',15, 'LineWidth',3, 'DisplayName','聚类质心', 'ZOrder',10); plot(centroids(2), 1, 'kd', 'MarkerSize',15, 'LineWidth',3, 'HandleVisibility','off', 'ZOrder',10); % 调整坐标轴样式 yticks([]); % 隐藏无意义的y轴刻度 xlabel('一维数据值'); legend('Location','best'); xlim([min(data)-1, max(data)+1]); grid on; hold off;
质心无法显示的常见原因
- 未添加
hold on命令,导致后绘制的质心直接覆盖了之前的数据点图像 - 质心的y轴坐标和数据点的y轴坐标不在同一个显示区间,超出了坐标轴范围
- 质心标记尺寸太小,或者层级比数据点低,被重叠的数点挡住,上述代码用
ZOrder参数强制质心显示在最上层解决该问题
内容的提问来源于stack exchange,提问作者taru
相关产品推荐
相关产品推荐

