som可用于聚类,图像分割等,由于论文需要matlab实现了som。

%som实现
%2016-11-12
%by wangbaojia
%  som原理及参数说明
% 1.竞争:匹配最佳神经元---------->计算每个样本和初始神经网络的距离,距离最近神经元作为获胜神经元
%
% 2.合作:在权值更新过程中,不仅获胜神经元的权
%值向量得到更新,而且其近邻神经元的权值向量也按照某个“近邻函数”进行更新。这样在开
%始时移动量很大,权值向量大致地可按它们的最终位置来排序;
%获胜神经元决定兴奋神经元的拓扑邻域的空间位置,从而提供了相邻神经元合作的基础
%   拓扑邻域:规则多边形一般都可以作为邻域形状,常用的主要有正方形或六边形,正方形更为普遍
%
%权重向量的调整就发生在获胜神经元的邻域内。在训练的刚开始阶段,这个邻域比较大,
%随着训练的进行,这个邻域开始不断减小
%
% 3.自适应:权值更新过程
% 算法:
% 1.初始化
%    1)迭代次数:时间步长iter
%    2)输出结点权值向量初始值,向量各元素可选区间(0,1)上的随机值,这里选择正方形邻域
%    3)学习率初始值
%    4)邻域半径的设置应尽量包含较多的邻神经元,整个输出平面的一半
% 2.求竞争获胜神经元;欧拉距离函数求解
% 3.权值更新:
%        获胜节点和邻域范围内神经元集合的m个节点更新权值,j=1:m;
%            wj(t+1)=wj(t)+learnfun(t)*neighborfun(t)*(x-wj);
% 4.更新学习率,更新邻域函数
%        neighborfun(t)=neighbor0*exp(-dij/t1);   t1=iter/log(neighbor0)
%         learnfun(t)=learn0*exp(-t/t2);     t2=iter
% 5.当特征映射不再发生明显变化时或达到最大网络训练次数时退出,否则转入第2步%载入数据,data数据每一行为一个用空格区分的多维数据样本
tic;
%样本数据的位置
file_path='C:\Users\Administrator\Desktop\testclustering\test1\';
path=strcat(file_path,'data.txt');
%path=strcat(file_path,'data_path.txt');
data=load(path);
[data_row,data_clown]=size(data);%自组织映射网络m*n
m=5;
n=5;
%神经元节点总数som_sum
som_sum=m*n;
%权值初始化,随机初始化
w = rand(som_sum, data_clown);
%初始化学习率
learn0 = 0.6;
learn_rate = learn0;
%学习率参数
learn_para=1000;
%设置迭代次数
iter =500;
%神经元位置
[I,J] = ind2sub([m, n], 1:som_sum);
%邻域初始化
neighbor0 =2;
neighbor_redius = neighbor0;
%邻域参数
neighbor_para = 1000/log(neighbor0);%迭代次数
for t=1:iter %  样本点遍历for j=1:data_row  %获取样本点值data_x = data(j,:); %找到获胜神经元[win_row, win_som_index]=min(dist(data_x,w'));  %获胜神经元的拓扑位置[win_som_row,win_som_cloumn] =  ind2sub([m, n],win_som_index);win_som=[win_som_row,win_som_cloumn];%计算其他神经元和获胜神经元的距离,邻域函数%distance_som = sum(( ([I( : ), J( : )] - repmat(win_som, som_sum,1)) .^2) ,2);distance_som = exp( sum(( ([I( : ), J( : )] - repmat(win_som, som_sum,1)) .^2) ,2)/(-2*neighbor_redius*neighbor_redius)) ;%权值更新for i = 1:som_sum% if distance_som(i)<neighbor_redius*neighbor_redius w(i,:) = w(i,:) + learn_rate.*distance_som(i).*( data_x - w(i,:));endend%更新学习率learn_rate = learn0 * exp(-t/learn_para);   %更新邻域半径neighbor_redius = neighbor0*exp(-t/neighbor_para);
end
%data数据在神经元的映射
%神经元数组som_num存储图像编号
som_num=cell(1,size(w,1));
for i=1:size(w,1)som_num{1,i}=[];
end
%每个神经元节点对应的data样本编号
for num=1:data_row[som_row,clown]= min(sum(( (w - repmat(data(num,:), som_sum,1)) .^2) ,2));som_num{1,clown}= [som_num{1,clown},num];
end%存储神经元数组,.mat格式
path1=strcat(file_path,'som_num.mat');
save(path1,'som_num');
toc;

1)针对一些问题这里统一说明一下,data中的数据没有标签的类别属性,data.txt文本数据为每一行为一个用空格区分的多维数据样本,读者的数据中如果有类别标签可取出单独用一个数组存放 ,若想要对聚类效果进行评价,如使用NMI值进行评估时,再和聚类输出结果进行比较计算,代码如下贴出,否则以上计算中不涉及类别标签
2)以上代码只是som的收敛过程,还需要进一步的聚类收敛,如使用K-means算法对som聚类中心进行聚类达到最后的聚类结果
3)各种聚类算法各有适用范围,som并不具有普适性,总体上som使用的并不多,在图像分割上较为常见,大家掌握思想就好

function score = nmi(true_labels, cluster_labels)
%NMI Compute normalized mutual information (NMI) using the true and cluster
%   labels and return the value in 'score'.
%
%   Input    : true_labels    : N-by-1 vector containing true labels
%              cluster_labels : N-by-1 vector containing cluster labels
%
%   Output   : score          : NMI value
%
%   Reference: Shi Zhong, 2003.
%              http://www.cse.fau.edu/~zhong/software/textclust.zip% Compute the confusion matrix 'cmat', where
%   col index is for true label (CAT),
%   row index is for cluster label (CLS).
n = length(true_labels);
cat = spconvert([(1:n)' true_labels ones(n,1)]);
cls = spconvert([(1:n)' cluster_labels ones(n,1)]);
cls = cls';
cmat = full(cls * cat);n_i = sum(cmat, 1); % Total number of data for each true label (CAT), n_i
n_j = sum(cmat, 2); % Total number of data for each cluster label (CLS), n_j% Calculate n*n_ij / n_i*n_j
[row, col] = size(cmat);
product = repmat(n_i, [row, 1]) .* repmat(n_j, [1, col]);
index = find(product > 0);
n = sum(cmat(:));
product(index) = (n*cmat(index)) ./ product(index);
% Sum up n_ij*log()
index = find(product > 0);
product(index) = log(product(index));
product = cmat .* product;
score = sum(product(:));
% Divide by sqrt( sum(n_i*log(n_i/n)) * sum(n_j*log(n_j/n)) )
index = find(n_i > 0);
n_i(index) = n_i(index) .* log(n_i(index)/n);
index = find(n_j > 0);
n_j(index) = n_j(index) .* log(n_j(index)/n);denominator = sqrt(sum(n_i) * sum(n_j));
%denominator = -(sum(n_i) +sum(n_j))./2;% Check if the denominator is zero
if denominator == 0score = 0;
elsescore = score / denominator;
end

Matlab代码实现SOM(自组织映射)算法相关推荐

  1. MATLAB代码:基于蒙特卡洛算法的电动汽车充电负荷预测 关键词:蒙特卡洛 电动汽车 充电负荷预测

    MATLAB代码:基于蒙特卡洛算法的电动汽车充电负荷预测 关键词:蒙特卡洛 电动汽车 充电负荷预测 仿真平台:MATLAB 主要内容:代码主要做的是电动汽车的充电负荷模拟预测,具体为:从影响电动汽车充 ...

  2. MATLAB代码:全面ADMM算法代码,实现了三种ADMM迭代方式

    MATLAB代码:全面ADMM算法代码,实现了三种ADMM迭代方式 关键词:综合能源 分布式协同优化 交替方向乘子法 最优潮流 参考文档:<基于串行和并行ADMM算法的电_气能量流分布式协同优化 ...

  3. 粒子群(pso)算法详解matlab代码,粒子群(pso)算法详解matlab代码

    粒子群(pso)算法详解matlab代码 (1)---- 一.粒子群算法的历史 粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,C ...

  4. a*算法matlab代码_导向滤波算法及其matlab代码实现

    导向滤波同样是一种平滑滤波算法,其与最小二乘滤波和双边滤波相比,同样是一种具有边缘保持的功能的图形滤波算法,可以用于处理图形噪点较多的图像,而且此种滤波算法与最小二乘滤波和双边滤波相比,有其独特的特点 ...

  5. ransac剔除误匹配matlab代码,基于APAP图像拼接算法的改进

    硕 士 学 位 论 文 基于 APAP 图像拼接算法 的 改进 学 科 专 业  软件工程  学 位 类 型工 学硕 士学位 研 究 生 姓 名  刘 诗  导 师姓名 ...

  6. a*算法matlab代码_MATLAB数学建模算法的代码模板大全

    来喽,来喽! 上期的数模资源大家都领到了嘛 没领到的同学点击下方链接领哦 205G 数学建模备战资料大全免费送!!! 这期的数模代码模板也如约而至 废话不多说,直接上干货 内容大小接近120M,全是纯 ...

  7. 软抠图算法matlab代码,贝叶斯抠图算法matlab实现

    [实例简介] 完整的贝叶斯抠图matlab实现代码,经测试可运行,文档包含了图片资源,代码没有注释 [实例截图] [核心代码] BayesianMatting └── BayesianMatting ...

  8. 美赛算法及MATLAB代码,美赛常用算法及matlab代码——(3)熵权法

    熵权法真的用的太太太多啦(反正我们队是) 原理很简单,不再讲了(俺觉得就算不懂原理只要会用就OK) 举个栗子(以下数据全为我瞎编) 身高 气质 颜值 小王得分 5.5 3 2 小红得分 5.6 4 3 ...

  9. a*算法matlab代码_蚁群算法(含MATLAB代码)

    CSDN-专业IT技术社区-登录​blog.csdn.net

最新文章

  1. 51单片机c语言乘法,求一个 89C51 简易计算器的c语言程序 只要加减乘除就行!
  2. STM32之CAN---中断管理浅析
  3. openresty开发系列39--nginx+lua实现接口签名安全认证
  4. boost::multiprecision模块Eigen相关的测试程序
  5. JQuery控制只能输入带二位小数的数字
  6. 风波中的滴滴:离无人驾驶落地还有多远?
  7. Facebook要造芯片了,开发团队正在组建中
  8. Facebook推出高速光网络技术将共享
  9. 巴比特观察 | NFT朋克热潮:CryptoPunks的成功可以复制吗
  10. Excel数据透视表如何创建?
  11. PS学习总结三:修图必备的高阶操作
  12. 6个好用免费的LiDAR数据处理软件【2021最新】
  13. 【Scratch】青少年蓝桥杯_每日一题_11.25_小猫碰到黑块和白块
  14. 什么是智能会议平板?
  15. 好的设计的10个原则
  16. excel批注不显示批注框_批注和批注处理器入门指南[解释]
  17. 【学习】线程池:获取任务执行结果get与取消任务cancel方法
  18. 双目立体视觉简单介绍
  19. c语言程序设计青岛职业技术学院,2020年知道C语言程序设计(青岛职业技术学院)答案公众号...
  20. GIS教程之Cesium 基础入门教程

热门文章

  1. 【C语言作业7】猜数游戏:先由计算机“想”一个数请人猜,如果人猜对了,则计算机给出提示:“Right”,否则提示“Wrong”,并告诉人所猜的数是大还是小。
  2. 计算机毕业设计ssm宠物商店信息展示与服务订购系统7q5ic系统+程序+源码+lw+远程部署
  3. Java实现获取long类型的随机数
  4. 《财务自由之路I》阅读笔记2021-03-16
  5. 网线连接网络有黄色感叹号
  6. 数学建模之预测方法总结
  7. python实现简单的图书管理系统
  8. pythongui界面实现爬取b站弹幕_Python爬虫自动化爬取b站实时弹幕实例方法
  9. 个人小程序与企业小程序的区别
  10. 已知三角形三边长求面积java_已知三角形三点坐标求三角形面积.java