具体原理网址:http://wenku.baidu.com/link?url=zSDn1fRKXlfafc_tbofxw1mTaY0LgtH4GWHqs5rl8w2l5I4GF35PmiO43Cnz3YeFrrkGsXgnFmqoKGGaCrylnBgx4cZC3vymiRYvC4d3DF3

自组织特征映射神经网络(Self-Organizing Feature Map。也称Kohonen映射),简称为SMO网络,主要用于解决模式识别类的问题。SMO网络属于无监督学习算法,与之前的Kmeans算法类似。所不同的是,SMO网络不需要预先提供聚类的数量,类别的数量是由网络自动识别出来的。

  基本思想:将距离小的集合划分为同一类别,而将距离大的个体集合划分为不同的类别。

  6.4.1 SMO网络框架

  SMO网络比较简单,只有输入层和输出层。

  

  SMO网络的输出层比较有特点,与其他神经网络有所不同的是,它与同层的神经元之间建立侧向连接,并可通过权值的学习形成特定的模式。输出层排列成棋盘的形状。输出层的神经元可以形成多种形式,不同的形式可以映射出不同的模式,如一维线阵、二维平面阵和三维的栅格等。对于二维的训练数据,排列一般是二维平面阵。

  实现步骤:
  1.输入层网络

  输入层网络节点和数据集同行数、同列数,但数据集要归一化。

  2.输出网络

  一般根据数据集的维度来构建输出网络。例如二维的情况,希望分为4类,输出层可设计为4*2的矩阵

  3.权重节点

  根据输入层的数据集的维度和输出层的预估分类数,定义权重节点的维度。例如,数据集是二维的,权重的行数就定为2,分4类,权重列数就选4.权重值一般给定一个0~1之间的随机值。

  4.定义学习率

  学习率会影响收敛的速度,可以定义一个动态的学习函数,随着迭代的次数增加而收敛。本例中的学习函数为:

  

  式中,maxLrate为最大学习率,minLrate为最小学习率,MaxIteration为最大迭代次数,i为当前迭代次数。

  5.定义聚类半径函数

  学习半径影响聚类的效果。可以定义一个动态的收缩半径函数,随着迭代次数的增加而收缩,本例中定义的半径函数:

  数、式中,maxR为最大聚类半径,minR为最小聚类半径,MaxItertion为最大的迭代次数,i为当前迭代的次数。

  

  6.聚类的过程:

  • 接受输入:首先计算本次迭代的学习率和学习半径,并且从训练集中随机选取一个样本
  • 寻找获胜节点:计算数据集中其他样本与此样本的距离,从中找到点积最小的获胜节点
  • 计算优胜邻域:根据这两个节点计算出聚类的邻域,并找出此邻域中所有节点。
  • 调整权值:根据学习率、样本数据调整权重。
  • 根据计算的结果,为数据集分配类别标签。 
  • 评估结果:SMO网络属于无监督聚类,输出的结果就是聚类后的标签,如果训练集已经被分类好了,即具有分类标签,那么通过新旧标签的比较就可以反映聚类结果的准确度。   

  6.4.2  SOM类

  初始构造方法:

  

class Kohonen(object):def __init__(self):self.lratemax = 0.8        #最大学习率--欧式距离self.lratemin = 0.05       #最小学习率--欧式距离self.rmax     = 5.0        #最大聚类半径--根据数据集self.rmin     = 0.5        #最小聚类半径--根据数据集self.Steps    = 1000       #迭代次数self.lratelist = []        #学习率收敛曲线self.rlist     = []        #学习半径收敛曲线self.w         = []        #权重向量组self.M         = 2         #M*N聚类的总数self.N         = 2         #M/N表示邻域的参数self.dataMat   = []        #外部导入数据集self.classLabel = []       #聚类后的类别标签

  6.4.3 功能函数

  (1)数据归一化

  

def normlize(self,dataMat):         #数据标准化归一化[m,n] = shape(dataMat)for i in xrange(n-1):dataMat[:,i] = (dataMat[:,i]-mean(dataMat[:,i]))/(std(dataMat[:,i])+1.0e-10)return dataMat

  (2)计算欧氏距离:

    def distEclud(vecA,vecB):#欧式距离eps = 1.0e-6return linalg.norm(vecA-vecB) + eps

  (3)加载数据文件

  

 def loadDataSet(self,filename):     #加载数据集numFeat = len(open(filename).readline().split('\t'))-1fr      = open(filename)for line in fr.readlines():lineArr = []curLine = line.strip().split('\t')lineArr.append(float(curLine[0]))lineArr.append(float(curLine[1]))self.dataMat.append(lineArr)self.dataMat = mat(self.dataMat)

  (4)初始化第二层网格

  

#coding:utf-8
from numpy import *class Kohonen(object):def __init__(self):self.lratemax = 0.8        #最大学习率--欧式距离self.lratemin = 0.05       #最小学习率--欧式距离self.rmax     = 5.0        #最大聚类半径--根据数据集self.rmin     = 0.5        #最小聚类半径--根据数据集self.Steps    = 1000       #迭代次数self.lratelist = []        #学习率收敛曲线self.rlist     = []        #学习半径收敛曲线self.w         = []        #权重向量组self.M         = 2         #M*N聚类的总数self.N         = 2         #M/N表示邻域的参数self.dataMat   = []        #外部导入数据集self.classLabel = []       #聚类后的类别标签def ratecalc(self,i):               #学习率和半径Learn_rate = self.lratemax-((i+1.0)*(self.lratemax-self.lratemin))/self.StepsR_rate     = self.rmax-((i+1.0)*(self.rmax-self.rmin))/self.Stepsreturn  Learn_rate,R_ratedef normlize(self,dataMat):         #数据标准化归一化[m,n] = shape(dataMat)for i in xrange(n-1):dataMat[:,i] = (dataMat[:,i]-mean(dataMat[:,i]))/(std(dataMat[:,i])+1.0e-10)return dataMatdef distEclud(self,vecA,vecB):#欧式距离eps = 1.0e-6data = vecA-vecBdata = linalg.norm(vecA-vecB) + epsreturn linalg.norm(vecA-vecB) + epsdef loadDataSet(self,filename):     #加载数据集numFeat = len(open(filename).readline().split('\t'))-1fr      = open(filename)for line in fr.readlines():lineArr = []curLine = line.strip().split(' ')lineArr.append(float(curLine[0]))lineArr.append(float(curLine[1]))self.dataMat.append(lineArr)self.dataMat = mat(self.dataMat)def init_grid(self):k = 0 #构建第二层网络模型grid = mat(zeros((self.M*self.N,2)))for i in xrange(self.M):for j in xrange(self.N):grid[k,:] = [i,j]k += 1return griddef train(self):dm,dn = shape(self.dataMat)                 #1.构建输入网络normDataset = self.normlize(self.dataMat)   #归一化数据grid        = self.init_grid()              #初始化第二层分类器self.w      = random.rand(self.M*self.N,dn)#3.随机初始化两层之间的权重值# distM       = self.distEclud           #确定距离公式#4.迭代求解if self.Steps < 5*dm:self.Steps = 5*dm                        #设定最小迭代次数for i in xrange(self.Steps):lrate,r = self.ratecalc(i)               #1)计算当前迭代次数下的学习率和分类半径
            self.lratelist.append(lrate)self.rlist.append(r)#2)随机生成样本索引,并抽取一个样本k = random.randint(0,dm)mySample = normDataset[k,:]#3)计算最优节点:返回最小距离的索引值minIndx =[self.distEclud (mySample,i) for i in self.w]minIndx = minIndx.index(min(minIndx))# self.w[minIndx,:] = self.w[minIndx,:]+lrate*(mySample[0]-self.w[minIndx,:])#4)计算邻域d1 = ceil(minIndx/self.M)  #计算此节点在第二层矩阵中的位置d2 = mod(minIndx,self.M)distMat = [self.distEclud(mat([d1,d2]),i) for i in grid]nodelindx = (array(distMat) < r).nonzero()for j in xrange (shape(self.w)[1]):  #5)按列更新权重if sum(nodelindx == j):self.w[:,j] = self.w[:,j]+lrate*(mySample[0]-self.w[:,j])#主循环结束self.classLabel = range(dm) #分配和存储聚类后的类别标签for i in xrange(dm):self.classLabel[i] = distM(normDataset[i,:],self.w).argmin()self.classLabel = mat(self.classLabel)SMOnet = Kohonen()
SMOnet.loadDataSet('testSet2.txt')
SMOnet.train()

  

资料来源:郑捷《机器学习算法原理与编程实践》 仅供学习研究

转载于:https://www.cnblogs.com/wuchuanying/p/6385245.html

郑捷《机器学习算法原理与编程实践》学习笔记(第六章 神经网络初步)6.3 自组织特征映射神经网路(SOM)...相关推荐

  1. 郑捷《机器学习算法原理与编程实践》学习笔记(第七章 预测技术与哲学)7.1 线性系统的预测...

    7.1.1 回归与现代预测 7.1.2 最小二乘法 7.1.3 代码实现 (1)导入数据 def loadDataSet(self,filename): #加载数据集X = [];Y = []fr = ...

  2. 郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(三)SVD...

    4.5.1 SVD算法回顾 A = U∑VT 其中:A是N*M的矩阵,U是M*M的方阵(里面向量正交,称为左奇异向量),∑是一个M*N的矩阵,VT是一个N*N的矩阵(里面向量正交,右奇异向量) 那么奇 ...

  3. 《机器学习:算法原理与编程实践》的读书笔记:SMO部分最难,大部分代码基于Scikit-Learn,决策树其实用处不大

    机器学习:算法原理与编程实践 目录 [隐藏] 1 机器学习的基础 2 中文文本分类 3 决策树的发展 4 推荐系统原理 5 梯度寻优 6 神经网络初步 7 预测的技术与哲学 8 万能分类器:SVM 9 ...

  4. OpenCV4机器学习算法原理与编程实战(附部分模型下载地址)

    一直想找本书,能在机器学习复杂的算法原理和高效的编程实战之间达到合适的平衡:让感兴趣的同学拿到就有能用的代码,还有基本原理的介绍,因为了解原理才知道什么时候用什么算法最合适,以及如何调整参数. 一直没 ...

  5. Python快速编程入门#学习笔记01# |第一章 :Python基础知识 (Python发展历程、常见的开发工具、import模块导入)

    全文目录 ==先导知识== 1 认识Python 1.1.1 Python的发展历程 1.1.2 Python语言的特点 2. Python解释器的安装与Python程序运行 1.2.1 安装Pyth ...

  6. 《区块链原理与技术》学习笔记(六) — 区块链安全

    <区块链原理与技术>学习笔记 第六部分 四.区块链网络层 1. 网络层安全 1.1 分布式拒绝服务攻击(DDos) 1.2 延展性攻击 1.3 日蚀攻击 1.4 分割攻击 1.5 延迟攻击 ...

  7. Unix原理与应用学习笔记----第六章 文件的基本属性2

    Unix原理与应用学习笔记----第六章 文件的基本属性2 改变文件权限命令:chmod 提示:文件或目录创建后,就被赋予一组默认的权限.所有的用户都有读,只有文件的所有者才有写. 相对权限设置 Ch ...

  8. Java编程思想学习笔记-第11章

    <?xml version="1.0" encoding="utf-8"?> Java编程思想学习笔记-第11章 Java编程思想学习笔记-第11章 ...

  9. Python快速编程入门#学习笔记03# |第二章 :Python基础(代码格式、标识符关键字、变量和数据类型、数字类型以及运算符)

    全文目录 ==先导知识== 学习目标: 2.1 代码格式 2.1.1 注释 2.1.2 缩进 2.1.3 语句换行 2.2 标识符和关键字 2.2.1 标识符 2.2.2 关键字 2.3 变量和数据类 ...

  10. 机器学习算法入门与编程实践课后题及答案(唐四新等编著)

    目录 习题1 习题2 习题3 习题4 习题5 习题6 习题7 习题8 习题1 1.无监督学习的两个主要任务是(多选)(BD). A.回归         B.降维         C.分类       ...

最新文章

  1. 人工智能学习框架TensorFlow渐近分析
  2. 浅析企业网站如何选择合适的网站空间
  3. 03-spring_配置bean
  4. Spring 多线程下注入bean问题
  5. leetcode 636. Exclusive Time of Functions | 636. 函数的独占时间(Stack)
  6. Could not find result map
  7. 数据分析流程和特征工程
  8. js 字符串编码与解码
  9. Java与微信不得不说的故事——消息的接收与发送
  10. 微信抢红包插件xposed框架
  11. python 显示gif_使用tkinter显示动态gif
  12. 读书笔记-人月神话7
  13. SVG线条动画实现蚂蚁线
  14. 线性代数学习笔记(二)——n阶行列式
  15. RedHat认证笔记-RH124
  16. python伪装ip_Python爬虫如何用高质量代理IP伪装?
  17. 基于Vue.js活动倒计时组件
  18. 【英语小作文】-相关
  19. 贪婪洞窟2服务器维护,贪婪洞窟2开服表
  20. 【正点原子Linux连载】第三十五章 Linux内核顶层Makefile详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

热门文章

  1. WPF中的自定义控件模板
  2. android 如何绕过签名校验
  3. MyBatis学习第一步
  4. 计算机用户名英文名称,好听的电脑英文用户名
  5. WiFi远程监控,监控摄像头只有在WiFi环境才能使用吗
  6. 有缓震功能的舒缓拖鞋能给运动后带来什么样的减压效果?
  7. 帮你混迹职场风生水起的八大定律
  8. 计算基因组外显子长度
  9. Vue消息列表已读/未读状态实时更新及数据更新set()用法
  10. 除了Google Adsense外比较适合英文站投放的国外广告联盟