算法简介
SOM网络是一种竞争学习型的无监督神经网络,将高维空间中相似的样本点映射到网络输出层中的邻近神经元。

训练过程简述:在接收到训练样本后,每个输出层神经元会计算该样本与自身携带的权向量之间的距离,距离最近的神经元成为竞争获胜者,称为最佳匹配单元。然后最佳匹配单元及其邻近的神经元的权向量将被调整,以使得这些权向量与当前输入样本的距离缩小。这个过程不断迭代,直至收敛。

网络结构:输入层和输出层(或竞争层),如下图所示。
输入层:假设一个输入样本为X=[x1,x2,x3,…,xn],是一个n维向量,则输入层神经元个数为n个。
输出层(竞争层):通常输出层的神经元以矩阵方式排列在二维空间中,每个神经元都有一个权值向量。
假设输出层有m个神经元,则有m个权值向量,Wi = [wi1,wi2,....,win], 1<=i<=m。


算法流程:

1. 初始化:权值使用较小的随机值进行初始化,并对输入向量和权值做归一化处理 X’ = X/||X|| ω’i= ωi/||ωi||, 1<=i<=m ||X||和||ωi||分别为输入的样本向量和权值向量的欧几里得范数。
2.将样本输入网络:样本与权值向量做点积,点积值最大的输出神经元赢得竞争,
(或者计算样本与权值向量的欧几里得距离,距离最小的神经元赢得竞争)记为获胜神经元。
3.更新权值:对获胜的神经元拓扑邻域内的神经元进行更新,并对学习后的权值重新归一化。 ω(t+1)= ω(t)+ η(t,n) * (x-ω(t))η(t,n):η为学习率是关于训练时间t和与获胜神经元的拓扑距离n的函数。η(t,n)=η(t)e^(-n)η(t)的几种函数图像如下图所示。4.更新学习速率η及拓扑邻域N,N随时间增大距离变小,如下图所示。
5.判断是否收敛。如果学习率η<=ηmin或达到预设的迭代次数,结束算法。


python代码实现SOM

import numpy as np
import pylab as plclass SOM(object):def __init__(self, X, output, iteration, batch_size):""":param X:  形状是N*D, 输入样本有N个,每个D维:param output: (n,m)一个元组,为输出层的形状是一个n*m的二维矩阵:param iteration:迭代次数:param batch_size:每次迭代时的样本数量初始化一个权值矩阵,形状为D*(n*m),即有n*m权值向量,每个D维"""self.X = Xself.output = outputself.iteration = iterationself.batch_size = batch_sizeself.W = np.random.rand(X.shape[1], output[0] * output[1])print (self.W.shape)def GetN(self, t):""":param t:时间t, 这里用迭代次数来表示时间:return: 返回一个整数,表示拓扑距离,时间越大,拓扑邻域越小"""a = min(self.output)return int(a-float(a)*t/self.iteration)def Geteta(self, t, n):""":param t: 时间t, 这里用迭代次数来表示时间:param n: 拓扑距离:return: 返回学习率,"""return np.power(np.e, -n)/(t+2)def updata_W(self, X, t, winner):N = self.GetN(t)for x, i in enumerate(winner):to_update = self.getneighbor(i[0], N)for j in range(N+1):e = self.Geteta(t, j)for w in to_update[j]:self.W[:, w] = np.add(self.W[:,w], e*(X[x,:] - self.W[:,w]))def getneighbor(self, index, N):""":param index:获胜神经元的下标:param N: 邻域半径:return ans: 返回一个集合列表,分别是不同邻域半径内需要更新的神经元坐标"""a, b = self.outputlength = a*bdef distence(index1, index2):i1_a, i1_b = index1 // a, index1 % bi2_a, i2_b = index2 // a, index2 % breturn np.abs(i1_a - i2_a), np.abs(i1_b - i2_b)ans = [set() for i in range(N+1)]for i in range(length):dist_a, dist_b = distence(i, index)if dist_a <= N and dist_b <= N: ans[max(dist_a, dist_b)].add(i)return ansdef train(self):"""train_Y:训练样本与形状为batch_size*(n*m)winner:一个一维向量,batch_size个获胜神经元的下标:return:返回值是调整后的W"""count = 0while self.iteration > count:train_X = self.X[np.random.choice(self.X.shape[0], self.batch_size)]normal_W(self.W)normal_X(train_X)train_Y = train_X.dot(self.W)winner = np.argmax(train_Y, axis=1).tolist()self.updata_W(train_X, count, winner)count += 1return self.Wdef train_result(self):normal_X(self.X)train_Y = self.X.dot(self.W)winner = np.argmax(train_Y, axis=1).tolist()print (winner)return winnerdef normal_X(X):""":param X:二维矩阵,N*D,N个D维的数据:return: 将X归一化的结果"""N, D = X.shapefor i in range(N):temp = np.sum(np.multiply(X[i], X[i]))X[i] /= np.sqrt(temp)return X
def normal_W(W):""":param W:二维矩阵,D*(n*m),D个n*m维的数据:return: 将W归一化的结果"""for i in range(W.shape[1]):temp = np.sum(np.multiply(W[:,i], W[:,i]))W[:, i] /= np.sqrt(temp)return W#画图
def draw(C):colValue = ['r', 'y', 'g', 'b', 'c', 'k', 'm']for i in range(len(C)):coo_X = []    #x坐标列表coo_Y = []    #y坐标列表for j in range(len(C[i])):coo_X.append(C[i][j][0])coo_Y.append(C[i][j][1])pl.scatter(coo_X, coo_Y, marker='x', color=colValue[i%len(colValue)], label=i)pl.legend(loc='upper right')pl.show()#数据集:每三个是一组分别是西瓜的编号,密度,含糖量
data = """
1,0.697,0.46,2,0.774,0.376,3,0.634,0.264,4,0.608,0.318,5,0.556,0.215,
6,0.403,0.237,7,0.481,0.149,8,0.437,0.211,9,0.666,0.091,10,0.243,0.267,
11,0.245,0.057,12,0.343,0.099,13,0.639,0.161,14,0.657,0.198,15,0.36,0.37,
16,0.593,0.042,17,0.719,0.103,18,0.359,0.188,19,0.339,0.241,20,0.282,0.257,
21,0.748,0.232,22,0.714,0.346,23,0.483,0.312,24,0.478,0.437,25,0.525,0.369,
26,0.751,0.489,27,0.532,0.472,28,0.473,0.376,29,0.725,0.445,30,0.446,0.459"""a = data.split(',')
dataset = np.mat([[float(a[i]), float(a[i+1])] for i in range(1, len(a)-1, 3)])
dataset_old = dataset.copy()som = SOM(dataset, (5, 5), 1, 30)
som.train()
res = som.train_result()
classify = {}
for i, win in enumerate(res):if not classify.get(win[0]):classify.setdefault(win[0], [i])else:classify[win[0]].append(i)
C = []#未归一化的数据分类结果
D = []#归一化的数据分类结果
for i in classify.values():C.append(dataset_old[i].tolist())D.append(dataset[i].tolist())
draw(C)
draw(D)

由于数据比较少,就直接用的训练集做测试了,运行结果图如下,分别是对未归一化的数据和归一化的数据进行的展示。

--------------------- 
作者:_almost_ 
来源:CSDN 
原文:https://blog.csdn.net/u014028027/article/details/72458117 
版权声明:本文为博主原创文章,转载请附上博文链接!

聚类算法——python实现SOM算法相关推荐

  1. em算法python代码_EM 算法求解高斯混合模型python实现

    注:本文是对<统计学习方法>EM算法的一个简单总结. 1. 什么是EM算法? 引用书上的话: 概率模型有时既含有观测变量,又含有隐变量或者潜在变量.如果概率模型的变量都是观测变量,可以直接 ...

  2. knn算法python代码iris_KNN算法原理及代码实现

    如何选择K值 首先让我们理解K值到底如何影响KNN算法.如果我们 有很多蓝色点和红色点数据,使用不同K值,最终的分类效果大概如下图.我们发现随着K值的增大,分界面越来越平滑. 一般在机器学习中我们要将 ...

  3. knn算法python代码_KNN 算法原理及代码实现

    在本文中,我们将讨论一种广泛使用的分类技术,称为K最近邻(KNN).我们的重点主要集中在算法如何工作以及输入参数如何影响预测结果. 内容包括: 何时使用KNN算法? KNN算法原理 如何选择K值 KN ...

  4. 【数据结构与算法python】最小生成树算法-Prim算法

    1.引入 本算法涉及到在互联网中网游设计者和网络收音机所面临的问题:信息广播问题,如网游需要让所有玩家获知其他玩家所在的位置,收音机则需要让所有听众获取直播的音频数据 2.算法介绍 (1)单播解法 信 ...

  5. em算法python代码_EM算法的python实现的方法步骤

    导读热词 前言:前一篇文章大概说了EM算法的整个理解以及一些相关的公式神马的,那些数学公式啥的看完真的是忘完了,那就来用代码记忆记忆吧!接下来将会对python版本的EM算法进行一些分析. EM的py ...

  6. c4.5算法python实现_算法:用Python实现—最优化算法

    今天给大家分享一下算法,用python来实现最优化算法.废话不多说,直接上代码: 一.二分法 函数详见rres,此代码使该算法运行了两次 def asdf(x): rres=8*x**3-2*x**2 ...

  7. knn算法python代码_KNN算法原理(python代码实现)

    kNN(k-nearest neighbor algorithm)算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性 ...

  8. 算法python实现_Relief算法python实现

    文章目录 一.算法流程图 二.代码步骤 1.第一步:定义类和init方法 2.第二步:数据处理 3.第三步:通过计算距离,找出猜错近邻和猜对近邻 4.第四步:计算特征权重 5.第五步:根据权重过滤式选 ...

  9. pca算法python实现_PCA算法——Python实现

    一.流程生成模拟数据 模型训练 特征向量重要性分析 画图 二.Python语言 1.生成模拟数据 # 导入相关数据库 from sklearn import datasets ​ # 提取数据 dig ...

最新文章

  1. Xamarin开发Anroid应用介绍
  2. oracle oats 安装,Mentor完整培训教程.pdf
  3. @available 和 #available
  4. 报名 | 清华大学大数据能力提升项目报名指南 (2020秋)
  5. RSS - 简单方便的follow资讯
  6. Android踩坑日记:自定义水平和圆形ProgressBar样式
  7. 判断任意控制台输入的十进制数是否为水仙花数
  8. 【QQ输入法】QQ输入法-剪切板 释放内存
  9. 2019年第十届蓝桥杯国赛B组试题A-平方序列-枚举
  10. springboot开启debug日志_SpringBoot 如何优雅的打印日志?
  11. mysql5.7 on windows
  12. iOS Swift 绘制PDF,超长字符串分页绘制
  13. 有哪些不错的查文献或查资料的网站或APP?
  14. 从武汉远程医疗方案看,5G战“疫”是噱头还是福音?
  15. 51单片机学习:蜂鸣器实验
  16. opencv 图像拼接和图像融合技术
  17. 干货!我被面试官绝地反杀了,附详细答案
  18. 与微型计算机运算速度无关的是,四川大学《计算机应用基础0006》17春在线作业1...
  19. 全国专业技术人员计算机应用能力考试 excel2003 注册码,全国专业技术人员计算机应用能力考试Excel2003题库版...
  20. Display Port 1.4 link Training 过程

热门文章

  1. jzoj 4805. 【NOIP2016提高A组模拟9.28】跟踪 {树+dfs}
  2. 链表和动态申请内存空间
  3. 英国Hostinger免费空间申请和使用教程
  4. 完全卸载Myeclipse
  5. Matlab基础——变量和语句
  6. 从蓝光到4K,腾讯视频高码率下载背后的技术
  7. Python入门基础(2)——基本类型与字符串处理
  8. bugku web18 秋名山车神
  9. 淘宝/天猫开放平台新商品发布API接口,商品发布接口,店铺上传接口,利用淘宝新品发布商品接口进行上传商品至淘宝店铺,接口对接方案
  10. 信息技术相关的期刊杂志介绍