自组织映射 ( Self Organization Map, SOM )神经网络是较为广泛应用于聚类的神经网络,它是由 Kohonen提出的一种无监督学习的神经元网络模型。
主要功能是将输入的 n 维空间数据映射到一个较低的维度 (通常是一维或者二维 )输出 ,同时保持数据原有的拓扑逻辑关系。
优劣:
(1)它不是以一个神经元或网络的状态矢量反映分类结果的 ,而是以若干神经元同时 (并行 )反映分类结果 .这种特征映射神经网络通过对输入模式的反复学习 ,使连接权矢量的空间分布能反映输入模式的统计特性。
(2)SOM 神经网络对于解决各类别特征不明显、特征参数相互交错混杂的、非线性分布的类型识别问题是非常有效的(客户行为的客户细分和分类研究也是相当有效的 ,因为客户行为识别本身也是一种复杂多变的问题)。
还不了解的童鞋,来带他们看一张图:
二、SOM模型原理
三、SOM模型的R语言实现——三个函数包介绍
SOM模型在R语言中,目前,我看到的有三个函数包,分别是:Kohonen包、som包、RSNNS包。
补充内容:
SOM的分类是否有意义?
答:木有,需要进行后续的分析,如客户细分中,还要继续计算每个群落的RFM值的均值,然后进行判断,可参考博客:
也可以用在离群值筛选中,可参考博客:RFM模型+SOM聚类︱离群值筛选问题
SOM如何合理地自定义分组数量?
答:笔者认为需要写一个循环语句,来验证一下,哪些组更好。
1、som包
library(som) #输入函数 som(data, xdim, ydim, init="linear", alpha=NULL, alphaType="inverse", neigh="gaussian", topol="rect", radius=NULL, rlen=NULL, err.radius=1, inv.alp.c=NULL)
#结果分析函数 #foo$data源数据 #init 初始化方法 #xdim x的维数 #ydim y的维数 #code 初始矩阵行索引=x维度+y维度*x向量值(行) #visual 每一案例,地图上的维数坐标 qerror是初始向量和最后测试向量的差的平方距离,这个就是分类 #alpha0 学习速率 #alpha 学习训练函数形式 #neigh 近邻函数类型 #topol 输出层近邻函数类型 #qerror 误差的平均 #code.sum xy的计数矩阵(类似混淆矩阵) #som案例 data(yeast) yeast <- yeast[, -c(1, 11)] yeast.f <- filtering(yeast) yeast.f.n <- normalize(yeast.f) foo <- som(yeast.f.n, xdim=6, ydim=6) foo <- som(yeast.f.n, xdim=5, ydim=6, topol="hexa", neigh="gaussian") plot(foo) names(foo)
2、kohonen包
这个包有人已经用来给白葡萄酒进行评分,可视化程序很高,比较适合做科研的包,粘贴一些细节,
完整请点击
3、RSNNS包
号称做神经网络最强的包,这个包中有很多很神经网络方法,其他方面很值得研究。目前,国内没有看到特别好的关于这个包的应用案例。(包介绍参考点击)
包的介绍
R语言中已经有许多用于神经网络的package。例如nnet、AMORE以及neuralnet,nnet提供了最常见的前馈反向传播神经网络算法。AMORE包则更进一步提供了更为丰富的控制参数,并可以增加多个隐藏层。neuralnet包的改进在于提供了弹性反向传播算法和更多的激活函数形式。但以上各包均围绕着BP网络,并未涉及到神经网络中的其它拓扑结构和网络模型。而新出炉的RSNNS包则在这方面有了极大的扩充。 Stuttgart Neural Network Simulator(SNNS)是德国斯图加特大学开发的优秀神经网络仿真软件,为国外的神经网络研究者所广泛采用。其手册内容极为丰富,同时支持友好的 Linux 平台。而RSNNS则是连接R和SNNS的工具,在R中即可直接调用SNNS的函数命令。</span>
######RSNNS案例 library(RSNNS) data(iris) inputs <- normalizeData(iris[,1:4], "norm") #数据标准化 model <- som(inputs, mapX=16, mapY=16, maxit=500, calculateActMaps=TRUE, targets=iris[,5]) par(mfrow=c(3,3)) for(i in 1:ncol(inputs)) plotActMap(model$componentMaps[[i]], col=rev(topo.colors(12))) plotActMap(model$map, col=rev(heat.colors(12))) plotActMap(log(model$map+1), col=rev(heat.colors(12))) persp(1:model$archParams$mapX, 1:model$archParams$mapY, log(model$map+1), theta = 30, phi = 30, expand = 0.5, col = "lightblue") plotActMap(model$labeledMap) model$componentMaps model$labeledUnits model$map names(model)
可参考以下文献:
1、自组织映射神经网络_SOM_在客户分类中的一种应用_陈伯成
2、基于RFM分析的银行信用卡客户的_省略_经网络SOM和Apriori方法_梁昌勇