当前位置: 首页 > news >正文

SOM聚类Matlab程序

自组织特征映射(SOM)的数据聚类程序。 matlab程序。 数据格式为excel,聚类标签可显示在图上。

最近在折腾数据聚类的时候重新捡起了自组织特征映射(SOM)这个老伙计。作为神经网络家族里擅长无监督学习的成员,它在数据可视化方面确实有一套。今天咱们用MATLAB整一个能处理Excel数据的SOM聚类程序,顺便把标签直接怼到图上,让结果看起来更直观。

先准备数据环境。假设我们有个"sales_data.xlsx",里面是某商超12个月的各品类销售指标。读取数据时别直接用xlsread了,试试MATLAB 2019b之后更香的readtable:

raw_data = readtable('sales_data.xlsx'); data_matrix = table2array(raw_data(:,2:end)); % 假设首列是月份名称 feature_names = raw_data.Properties.VariableNames(2:end);

数据归一化这个步骤千万别省,特别是当特征量纲差异大的时候。个人习惯用mapminmax做区间缩放,比z-score更抗异常值:

[normalized_data, ps] = mapminmax(data_matrix', 0, 1); % 转置适应函数格式 normalized_data = normalized_data'; % 再转回来保持样本行方向

接下来构建SOM网络。这里有个小技巧:先用默认参数快速试跑,再根据收敛情况调整。初始网络结构设置为5x5的六边形网格,这个尺寸适合大多数中小型数据集:

net = selforgmap([5 5], 'grid', 'hextop', 'linkdist'); net.trainParam.epochs = 100; % 先跑100轮看效果 [net, tr] = train(net, normalized_data');

训练完成后,通过权值矩阵观察聚类情况。每个神经元的权向量代表该簇的中心特征。用plotsomnd(net)可以看拓扑结构,但咱们更关心实际数据点的归属:

% 获取每个样本所属的神经元编号 outputs = net(normalized_data'); cluster_indices = vec2ind(outputs); % 关联原始数据标签 month_labels = table2cell(raw_data(:,1));

这时候直接上plotsomhits虽然能看分布,但标签显示得不够直观。自己动手画个带文字标注的版本:

figure; plotsomhits(net, normalized_data'); hold on % 获取神经元位置坐标 pos = net.layers{1}.positions; for i = 1:length(month_labels) text(pos(cluster_indices(i),1)+0.1, pos(cluster_indices(i),2)+0.1,... month_labels{i}, 'FontSize',8, 'Color','k'); end hold off

运行后可能会发现某些神经元节点挤满了标签,这时候可以调两个地方:一是增大网格尺寸,二是改用kmeans对权向量做二次聚类。比如用权向量作为初始质心:

w = net.IW{1}; [~, super_clusters] = kmeans(w, 3, 'Start', w(1:3,:)); % 假设想合并为3个大类

最后导出结果到Excel时,记得把原始数据和聚类标签合并保存。这个技巧在处理业务数据时特别实用:

result_table = [raw_data, array2table(cluster_indices,... 'VariableNames',{'SOM_Cluster'})]; writetable(result_table, 'clustered_result.xlsx');

几点实战经验:

  1. 当数据量超过1万条时,建议启用GPU加速(train(net,X,[],'useParallel','yes'))
  2. 六边形网格比矩形网格的边界更清晰
  3. 用plotsomplanes观察各特征在网格上的分布,能发现哪些指标对聚类贡献大

这套方案在分析客户分群、库存分类时特别管用。曾经用这个方法处理过2000+SKU的库存数据,配合颜色深浅表示库存周转率,一眼就能看出哪些品类该清仓了。下次遇到需要解释"为什么这些数据被分到一组"的时候,试试把特征平面图贴给业务部门看,比单纯给聚类编号直观多了。

http://www.cnnetsun.cn/news/158659.html

相关文章:

  • 44、COMSOL模拟二维裂隙流压裂水平井裂缝性油藏离散裂缝网络模型COMSOL数值模拟案例
  • 今天咱们来聊聊ReliefF算法,一个在分类数据特征选择中相当实用的工具。废话不多说,直接上代码,边看边聊
  • MATLAB R2018A环境下的液相色谱信号自动调优降噪算法——交叉验证作为参数调节器
  • 计算机Java毕设实战-基于springboot的足球训练营系统的设计与实现设计与实现基于SpringBoot的青训足球综合运营平台设计与实现 【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 2025年软件测试技术发展趋势与从业者应对策略
  • 电驱动(电机+电控)开发验证方法与技巧的高清视频教程,深入讲解精细技术,掌握实用技巧
  • 每天24小时的电价(元/kWh)
  • C#编程下的自定义控件与OpenCVSharp结合应用:卡尺测距功能实现
  • NGBoost-shap方法回归任务,由斯坦福吴恩达团队提出,属于集成模型的一种2019年提出的
  • Langchain-Chatchat Kubernetes集群部署策略
  • Langchain-Chatchat日志监控与性能分析最佳实践
  • Langchain-Chatchat模型微调指南:适配垂直领域任务
  • 如何配置IPv6静态路由?解决企业网络难题
  • 【Linux网络基础】详解 TCP 面向连接 vs UDP 无连接
  • Langchain-Chatchat如何评估问答质量?指标体系构建
  • springboot在线教育系统(11528)
  • 测了多款AI自动生成PPT工具,真正能用的不到一半
  • springboot星之语明星周边产品销售网站的设计与实现(11529)
  • 毕设救星:Spring Boot + Neo4j 打造“医疗知识问答”——基于知识图谱的智能导诊平台
  • 华为网络设备基本配置命令
  • 志同道合交友网站毕业论文+PPT(附源代码+演示视频)
  • 【Java 25 LTS六大核心特性】
  • Langchain-Chatchat助力医疗文档智能检索与问答
  • Langchain-Chatchat如何实现文档相似度比对?查重与去重依据
  • java学习--String和StringBuffer互转
  • 如何用Langchain-Chatchat实现本地化AI智能问答?
  • Langchain-Chatchat如何处理多义词歧义?上下文感知消歧算法
  • Langchain-Chatchat如何实现文档访问统计?了解知识使用情况
  • Langchain-Chatchat与Argo CD持续交付集成:自动化部署流水线
  • Langchain-Chatchat与Consul服务发现集成:动态节点管理