我是靠谱客的博主 会撒娇自行车,最近开发中收集的这篇文章主要介绍【转】自组织神经网络算法-SOMSelf Organizing Maps : 一种基于神经网络的聚类算法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

入职后的第一个工作任务是使用python实现一篇论文中的提到的算法,该算法使用了LVQ神经网络,全称为“学习矢量量化神经网络”,想要理解这个模型必须先对SOM有一个简单的了解。找到一篇讲解很清晰的文章,收藏以供学习。

Self Organizing Maps : 一种基于神经网络的聚类算法

自组织神经网络,是一种用于聚类的神经网络算法,从名字便可以看出,这是一种无监督式的算法,意味着它不需要任何训练样本,便可以直接对输入样本根据其特征分类,将具有相似特征的划分为一类。

som算法是由两层网络组成,输入层与输出层(也叫作竞争层),大致示意图如下:

算法原理

一个例子来讲解som算法的原理。现在我有8个输入样本,每个输入样本由两个特征值组成(x,y),要求将图中的输入节点划分为两类,表示在二维坐标系(横为x,纵为y)如下图所示:

凭肉眼观察,8个输入样本很明显已经分为了粉红与淡蓝两类,使用som算法来做思路如下:

<1>.因为输入样本的特征为2(分别是x与y坐标值),共有8个输入样本,所以输入层的节点数为8(注意此处节点数不像BP神经网络那样将每个样本的特征数目作为输入样本的个数,这里将每个输入样本作为一个输入节点会更加容易理解)。
<2>.因为最终要划分为两类,所以需要定义两个输出样本,所以输出节点为2,且两个输出节点的特征数为2(x,y)。
<3>.根据以上规则随机初始化两个输出节点W。
<4>.for 每一个输入节点 INPUT{
for 每一个输出节点W{
计算当前输入节点i与输出节点w之间的欧式距离;
}
找到离当前输入节点i最近(欧式距离最小)的那个输出节点w作为获胜节点;
调整w的特征值,使该w的特征值趋近于当前的输入节点(有个阈值(步长)控制幅度);
}
衰减阈值(步长);
<5>. 循环执行步数<4>,直到输出节点W趋于稳定(阈值(步长)很小)。

原文中有一个gif动图可以很清晰地了解算法执行过程,详情见文末链接。

源代码

#-*- coding:utf-8 -*-
import random
import math
input_layer = [[39,281],[18,307],[24,242],[54,333],[322,35],[352,17],[278,22],[382,48]] # 输入节点
category = 2
class Som_simple_zybb():
def __init__(self,category):
self.input_layer = input_layer # 输入样本
self.output_layer = [] # 输出数据
self.step_alpha = 0.5 # 步长 初始化为0.5
self.step_alpha_del_rate = 0.95 # 步长衰变率
self.category = category # 类别个数
self.output_layer_length = len(self.input_layer[0]) # 输出节点个数 2
self.d = [0.0] * self.category
# 初始化 output_layer
def initial_output_layer(self):
for i in range(self.category):
self.output_layer.append([])
for _ in range(self.output_layer_length):
self.output_layer[i].append(random.randint(0,400))
# som 算法的主要逻辑
# 计算某个输入样本 与 所有的输出节点之间的距离,存储于 self.d 之中
def calc_distance(self,a_input ):
self.d = [0.0] * self.category
for i in range(self.category):
w = self.output_layer[i]
# self.d[i] =
for j in range(len(a_input)):
self.d[i] += math.pow((a_input[j] - w[j]),2) # 就不开根号了
# 计算一个列表中的最小值 ,并将最小值的索引返回
def get_min(self,a_list):
min_index = a_list.index(min(a_list))
return min_index
# 将输出节点朝着当前的节点逼近
def move(self,a_input,min_output_index):
for i in range(len(self.output_layer[min_output_index])):
self.output_layer[min_output_index][i] = self.output_layer[min_output_index][i] + self.step_alpha * ( a_input[i] - self.output_layer[min_output_index][i] )
# som 逻辑 (一次循环)
def train(self):
for a_input in self.input_layer:
self.calc_distance(a_input)
min_output_index = self.get_min(self.d)
self.move(a_input,min_output_index)
# 循环执行som_train 直到稳定
def som_looper(self):
generate = 0
while self.step_alpha >= 0.0001: # 这样子会执行167代
self.train()
generate +=1
print("代数:{0} 此时步长:{1} 输出节点:{2}".format(generate,self.step_alpha,self.output_layer))
self.step_alpha *= self.step_alpha_del_rate # 步长衰减
if __name__ == '__main__':
som_zybb = Som_simple_zybb(category)
som_zybb.initial_output_layer()
som_zybb.som_looper()

转载自 http://www.ziyoubaba.com/archives/606

最后

以上就是会撒娇自行车为你收集整理的【转】自组织神经网络算法-SOMSelf Organizing Maps : 一种基于神经网络的聚类算法的全部内容,希望文章能够帮你解决【转】自组织神经网络算法-SOMSelf Organizing Maps : 一种基于神经网络的聚类算法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部