自组织映射或Kohonen映射是一种基于20世纪70年代生物神经模型的无监督神经网络算法。它采用竞争学习的方法,主要设计用于聚类和降维。SOM能够有效地将高维数据映射到低维网格上,从而使得复杂数据集的解释和可视化变得更加容易。
它主要包含两层:
- 输入层:代表数据的特征。
- 输出层:排列为二维的神经元网格,其中每个神经元代表数据中的一个簇。
自组织映射 (SOM) 的工作原理
让我们逐步深入探讨其工作原理:
1. 初始化
输出神经元的权重被随机初始化。这些权重代表每个神经元的特征,并将在训练期间进行调整。
2. 竞争
对于每个输入向量,SOM会计算输入向量与所有神经元权重向量之间的欧几里得距离。距离最小的神经元即为获胜神经元。
公式:D(j) = \sum{i=1}^{n} (w{ij} – x_i)^2
其中:
- D(j) 是神经元的距离
- j 是神经元索引,n 是特征的数量。
3. 权重更新
获胜神经元的权重会被更新,以使其向输入向量靠拢。相邻神经元的权重也会进行调整,但调整幅度较小。
公式:w{ij}^{(new)} = w{ij}^{(old)} + \alpha \cdot (xi – w{ij}^{(old)})
其中:
- \alpha 是学习率
- x_i 是输入特征。
4. 学习率衰减
学习率 \alpha 会随着时间的推移而减小,从而使映射收敛到稳定的数值。
公式:\alpha(t+1) = 0.5 \cdot \alpha(t)
5. 停止条件
当达到最大迭代次数或者权重收敛时,训练停止。
SOM 的 Python 实现
现在,让我们一步步进行 SOM 算法的 Python 实现。为了清晰起见,我们将代码分成了多个代码块。
1. 导入必要的库
我们将使用 math 库来计算输入向量与权重向量之间的欧几里得距离。
Python
CODEBLOCK_7e9762b9
2. 定义 SOM 类
在这个类中,我们定义了两个重要的函数:INLINECODEbcde045b 用于计算获胜神经元(通过计算输入与每个簇权重向量的欧几里得距离),以及 INLINECODE0940ef07 用于根据权重更新规则更新获胜神经元的权重向量。
Python
CODEBLOCK_2ff28780
3. 定义主函数
在这一部分,我们定义训练数据并初始化权重。同时,我们还要指定迭代次数和学习率。
- T:这是包含四个示例的训练数据,每个示例有四个特征。
- weights:这是两个簇的初始权重,每个簇也有四个特征。
- epochs:指定训练的迭代次数。
- alpha:用于更新权重的学习率。
Python
CODEBLOCK_1cdb37f4
4. 训练 SOM 网络
在这里,我们在指定的迭代次数内遍历每个训练样本,计算获胜簇并更新权重。对于每一次迭代和训练样本,我们都会执行以下操作:
- 使用
winner()方法计算获胜簇。 - 使用
update()方法更新获胜簇的权重。
Python
CODEBLOCK_0019165c
5. 分类测试样本
在训练完 SOM 网络后,我们使用一个测试样本 s,通过计算哪个簇的权重向量与输入样本最接近,将其归类到某个簇中。最后,我们打印簇的分配结果以及每个簇训练后的权重。
Python
CODEBLOCK_62f04a50
6. 运行主函数
以下代码块在脚本执行时运行 main() 函数。
Python
CODEBLOCK_e49a96a8