三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Matlab新手避坑指南:手把手教你用Kmeans处理自己的数据集(从导入数据到结果分析)

Matlab新手避坑指南:手把手教你用Kmeans处理自己的数据集(从导入数据到结果分析)

Matlab新手避坑指南:手把手教你用Kmeans处理自己的数据集

第一次用Matlab跑Kmeans时,我盯着屏幕上那堆报错信息发了半小时呆——明明教程代码能跑通,换成自己的数据就各种崩溃。后来才发现,问题出在数据预处理和参数设置这些看似简单的环节上。本文将带你避开这些坑,从Excel/CSV导入到最终可视化,完成真实数据集的完整聚类分析。

1. 数据导入与清洗:90%的问题源头

1.1 从Excel/CSV正确导入数据

新手最常犯的错误是直接复制粘贴数据到Matlab。推荐使用readtable函数,它能自动处理表头和数据类型的转换:

% 读取含表头的CSV文件 data = readtable('sales_data.csv'); % 查看前5行数据 head(data, 5)

常见报错处理

  • 中文路径问题:将文件放在纯英文路径下
  • 数据格式混乱:用detectImportOptions指定列格式
  • 缺失值标记:设置MissingRule参数识别"NA"或"NULL"

1.2 数据清洗实战技巧

原始数据往往包含三类问题:

  1. 缺失值:先用ismissing检测,再用fillmissing填充
    % 用列均值填充缺失值 data.Age = fillmissing(data.Age, 'mean');
  2. 异常值:结合箱线图和Z-score检测
    z = abs(zscore(data.Income)); outliers = z > 3; data(outliers, :) = [];
  3. 文本数据:用categorical转换分类变量
    data.Region = categorical(data.Region);

注意:Kmeans只能处理数值数据,文本列需要先进行独热编码或删除

2. 数据标准化:被忽视的关键步骤

2.1 为什么必须标准化?

假设你的数据包含年龄(20-60)和收入(5000-50000),直接聚类会导致收入主导结果。常用方法对比:

方法公式适用场景
Z-score(x-μ)/σ数据分布近似正态
Min-Max(x-min)/(max-min)有明确边界的数据
Robust(x-median)/IQR存在显著异常值
% 使用zscore标准化 scaled_data = zscore(table2array(data(:, 1:4])));

2.2 高维数据降维技巧

当特征超过10个时,建议先用PCA降维:

[coeff, score] = pca(scaled_data); % 保留95%方差的主成分 explained = cumsum(var(score))/sum(var(score)); keep = find(explained >= 0.95, 1); final_data = score(:, 1:keep);

3. 确定最佳K值:超越肘部法则

3.1 四种主流方法对比

  • 肘部法则:观察SSE拐点
    sse = []; for k = 1:10 [~, ~, sumd] = kmeans(final_data, k); sse(k) = sum(sumd); end plot(1:10, sse, '-o')
  • 轮廓系数:评估聚类紧密度
    silhouette_values = []; for k = 2:8 [idx, ~] = kmeans(final_data, k); silhouette_values(k-1) = mean(silhouette(final_data, idx)); end

3.2 Gap Statistic方法

更可靠的统计方法,通过比较实际数据与参考分布的聚类质量:

eva = evalclusters(final_data, 'kmeans', 'gap', 'KList', 1:6); plot(eva)

4. 运行Kmeans与结果解读

4.1 参数设置详解

完整调用格式:

[idx, C, sumd, D] = kmeans(data, k, 'Options', opts, ... 'Replicates', 10, 'Display', 'iter');

关键参数说明:

  • Replicates:重复运行次数(避免局部最优)
  • Distance:可选'sqeuclidean'(默认)或'cityblock'
  • EmptyAction:处理空簇的策略

4.2 结果可视化进阶

多维数据展示技巧

  1. 平行坐标图显示各特征分布
    parallelcoords(final_data, 'Group', idx)
  2. t-SNE非线性降维可视化
    Y = tsne(final_data); gscatter(Y(:,1), Y(:,2), idx)

聚类质量评估矩阵

% 计算轮廓系数 silhouette(final_data, idx) % 计算Davies-Bouldin指数 db_index = evalclusters(final_data, idx, 'DaviesBouldin');

5. 常见报错解决方案

5.1 数据维度不匹配

错误信息:

Error using kmeans: X must have more rows than the number of clusters

解决方法:

  • 检查输入矩阵尺寸:size(data)
  • 确保没有误将行/列转置

5.2 空簇问题

错误信息:

Empty cluster created at iteration XX

解决方案:

  • 增加Replicates参数值
  • 改用kmedoids算法
  • 调整初始中心点选择策略

5.3 内存不足

大数据集处理技巧:

  • 使用single精度替代double
  • 分批次处理数据
  • 考虑改用kmeans++初始化

6. 性能优化技巧

6.1 加速计算的方法

  • 预计算距离矩阵:
    D = pdist2(data, data); [idx, C] = kmedoids(D, k);
  • 使用GPU加速:
    gpu_data = gpuArray(data); [idx, C] = kmeans(gpu_data, k);

6.2 大数据集处理

当数据超过内存容量时:

  1. 使用datastore分批读取
    ds = datastore('large_file.csv'); while hasdata(ds) chunk = read(ds); % 处理数据块 end
  2. 采用Mini-Batch Kmeans
    opts = statset('UseParallel', true); [idx, C] = kmeans(data, k, 'Options', opts, ... 'Stream', true, 'MaxIter', 100);

7. 实际案例:客户分群分析

以某零售数据集为例,完整流程:

  1. 导入原始交易数据(含购买频率、金额、品类等)
  2. 清洗异常订单记录
  3. 标准化并降维到3个主成分
  4. 确定最佳K值为5
  5. 聚类结果解读:
    • 高价值低频客户(需激活)
    • 低价值高频客户(可促销)
    • 高价值高频客户(VIP维护)

可视化代码示例:

figure scatter3(final_data(:,1), final_data(:,2), final_data(:,3), 30, idx, 'filled') title('客户分群三维可视化') xlabel('PC1 (消费金额)') ylabel('PC2 (购买频率)') zlabel('PC3 (品类宽度)')
← 返回列表