---
title: 自组织特征映射神经网络(SOM)
date: 2017-09-30 10:39:06
tags:
- 机器学习
- 无监督学习
---
自组织特征映射神经网络(SOM)设计思想基于人体大脑,外界信息输入时,大脑皮层对应区域的部分神经元会产生兴奋,位置临近的神经云也会有相近的刺激。大脑神经元的这种特点,不是先天安排好的,而是通过后天的自学习组织形成的。芬兰Helsinki大学的Kohonen教授提出了一种成为自组织特征映射的神经网络模型。
<!-- more -->
## SOM介绍
SOM与kmeans算法有点相似,其基本思想也是,将距离小的个体集合划分为同一类别,而将距离大的个体划分为不同的类别。
![SOM结构图](http://appwk.baidu.com/naapi/doc/view?ih=584&o=png_6_0_0_436_680_396_210_876_1252.5&iw=1100&ix=0&iy=414&aimw=1100&rn=1&doc_id=d6e8e02c647d27284b735162&pn=1&sign=b919aed799fa017c1e7f322b49ebb944&type=1&app_ver=2.9.8.2&ua=bd_800_800_IncredibleS_2.9.8.2_2.3.7&bid=1&app_ua=IncredibleS&uid=&cuid=&fr=3&Bdi_bear=WIFI&from=3_10000&bduss=&pid=1&screen=800_800&sys_ver=2.3.7)
从结构上看,SOM比较简单,只有两层,输入层和竞争层,只有输入层到竞争层的权重向量需要训练,不同于其他神经网络,竞争层同层之间的神经元还有侧向连接,在学习的过程中还会相互影响。竞争层神经元的竞争通过神经元对应的权重向量和输入样本的距离比较,距离最近的神经元成为获胜节点。
常见的相互连接的调整方式有以下几种
1. 墨西哥草帽函数:获胜节点,有最大的权值调整量,离获胜节点越远,调整量越小,甚至达到某一距离,调整量还会变为负值。如图a所示。
2. 大礼帽函数:墨西哥草帽函数的简化,如图b所示。
3. 厨师帽函数:大礼帽函数的简化,如图c所示。
![](https://i.imgur.com/JtGnkfW.png)
## SOM算法学习过程
### 网络初始化
输入层网络节点数与输入样本维度(列数)相同,通常需要进行数据归一化,常见的方法是标准归一化。
竞争层网络根据数据维度以及分类类别数来确定,二维数据和4种分类的话
,竞争层含4个节点,但是权重矩阵为4X2,权重矩阵的初始化一般·随机给一个0-1之间的随机值。对于分类类别数目不清楚的情况,可以定义竞争层多于可能的实际分类的节点,这样最后训练结果中不对应分类结果的节点始终不会收到刺激而兴奋,即抑制。
学习率会影响收敛速度,一般定义一个动态的学习率,随迭代次数增加而递减。优胜邻域半径也定义为一个动态收缩的,随着迭代次数增加而递减。
# 学习率和学习半径函数
def ratecalc(self,indx):
lrate = self.lratemax-(float(indx)+1.0)/float(self.Steps)*(self.lratemax-self.lratemin)
r = self.rmax-(float(indx)+1.0)/float(self.Steps)*(self.rmax-self.rmin)
return lrate,r
### 网络训练
训练过程如下:
1. 随机抽取一个数据样本,计算竞争层中神经元对应的权重矩阵与数据样本的距离,找到距离最近的为获胜节点。
2. 根据优胜邻域半径,找出此邻域内的所有节点。
3. 根据学习率调整优胜邻域半径内的所有节点,然后回到步骤1进行迭代,直到到达相应的迭代次数
4. 根据最终的迭代结果,为分类结果分配标签。
# 主算法
def train(self):
#1 构建输入层网络
dm,dn = shape(self.dataMat)
normDataset = self.normalize(self.dataMat) # 归一化数据x
#2 构建分类网格
grid = self.init_grid() # 初始化第二层分类网格
#3 构建两层之间的权重向量
self.w = random.rand(dn,self.M*self.N); #随机初始化权值 w
distM = self.distEclud # 确定距离公式
#4 迭代求解
if self.Steps < 10*dm: self.Steps = 10*dm # 设定最小迭代次数
for i in range(self.Steps):
lrate,r = self.ratecalc(i) # 计算学习率和分类半径
self.lratelist.append(lrate);self.rlist.append(r)
# 随机生成样本索引,并抽取一个样本
k = random.randint(0,dm)
mySample = normDataset[k,:]
# 计算最优节点:返回最小距离的索引值
minIndx= (distM(mySample,self.w)).argmin()
d1 = int(round(minIndx - r));
d2 = int(round(minIndx + r));
if(d1<0):
d1=0
if(d2>(shape(self.w)[1]-1)):
d2= shape(self.w)[1]-1
di=d1;
#print(d1,d2)
while(di<=d2):
self.w[:,di] = self.w[:,di]+lrate*(mySample[0]-self.w[:,di])
di=di+1
# 分配类别标签
for i in range(dm):
self.classLabel.append(distM(normDataset[i,:],self.w).argmin())
self.classLabel = mat(self.classLabel)
具体实现代码可见:[https://github.com/lkj1114889770/Machine-Leanring-Algorithm/tree/master/SOM](https://github.com/lkj1114889770/Machine-Leanring-Algorithm/tree/master/SOM)
针对数据集的分类结果:
![](https://i.imgur.com/KSlpNem.png)
**
参考文献:**
1. 《机器学习算法与编程实践》 郑捷著;
没有合适的资源?快使用搜索试试~ 我知道了~
机器学习不同算法的实现源代码.zip
共12个文件
py:6个
md:3个
txt:2个
需积分: 5 1 下载量 116 浏览量
2024-04-29
18:50:38
上传
评论
收藏 17KB ZIP 举报
温馨提示
机器学习 机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。它专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。机器学习是人工智能的核心,是使计算机具有智能的根本途径。 机器学习的发展历程可以追溯到20世纪50年代,当时Arthur Samuel在IBM开发了第一个自我学习程序,一个西洋棋程序,这标志着机器学习的起步。随后,Frank Rosenblatt发明了第一个人工神经网络模型——感知机。在接下来的几十年里,机器学习领域取得了许多重要的进展,包括最近邻算法、决策树、随机森林、深度学习等算法和技术的发展。 机器学习有着广泛的应用场景,如自然语言处理、物体识别和智能驾驶、市场营销和个性化推荐等。通过分析大量的数据,机器学习可以帮助我们更好地理解和解决各种复杂的问题。例如,在自然语言处理领域,机器学习技术可以实现机器翻译、语音识别、文本分类和情感分析等功能;在物体识别和智能驾驶领域,机器学习可以通过训练模型来识别图像和视频中的物体,并实现智能驾驶等功能;在市场营销领域,机器学习可
资源推荐
资源详情
资源评论
收起资源包目录
机器学习不同算法的实现源代码.zip (12个子文件)
content
Decision Tree
Decision_tree_ID3.py 2KB
tennis.csv 429B
BpNet
BpNet.py 6KB
BpNetTest.py 547B
testSet2.txt 11KB
README.md 3KB
SOM
dataset2.txt 5KB
Kohonen.py 4KB
README.md 5KB
testKohonen02.py 446B
Hidden Markov
forward_backward.py 1KB
README.md 43B
共 12 条
- 1
资源评论
生瓜蛋子
- 粉丝: 3794
- 资源: 4174
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功