揭秘自组织映射算法SOM:从原理到应用

⭐️ 前言

在人工智能和机器学习的世界里,自组织映射(Self-Organizing Map,简称SOM)算法以其独特的自组织特性和强大的可视化能力,成为了一个备受关注的热点。今天,就让我们一起简单探索这一算法的奥秘,了解其背后的原理、优势以及应用场景。

在这里插入图片描述

⭐️ 自组织映射算法简介

自组织映射算法,是由芬兰学者Teuvo Kohonen于1982年提出的一种基于无监督学习的神经网络算法。其核心思想是通过模拟人脑神经系统的自组织过程,对输入的高维数据进行聚类分析,并映射到一个低维的网格结构上。这一过程不仅保留了原始数据的拓扑结构,还使得数据间的相似性和差异性得以直观展现。

⭐️ 算法原理

SOM算法的实现主要依赖于两个核心机制:竞争学习和合作调整。

竞争学习: 在SOM网络中,每个神经元都对应一个权值向量。当一个新的输入样本进入时,算法会计算该样本与所有神经元权值向量之间的距离,并找出距离最小的神经元作为获胜神经元(Best Matching Unit,BMU)。
合作调整: 一旦确定了获胜神经元,SOM算法会利用邻域函数(neighborhood function)对BMU及其邻近神经元的权值进行更新。更新程度取决于神经元与BMU的距离以及预先设定的学习速率。通过这种方式,算法使得权值向量逐步逼近输入数据的空间分布。

在这里插入图片描述

⭐️ 算法优势

自适应性: SOM算法属于无监督学习,无需事先知道数据的类别标签。它能够在没有人工干预的情况下,自动对数据进行聚类分析。
拓扑保形特性: 通过神经元之间的竞争和合作调整,SOM算法能够保持原始高维数据空间的拓扑结构,将其映射到低维的二维或一维网格上。这使得复杂的数据分布得以直观展现,并揭示潜在的内在规律。
可视化能力: 由于SOM算法将高维数据映射到低维空间,我们可以轻松地通过图形化界面展示数据的聚类结果和分布情况。这对于数据分析和可视化具有重要意义。

关于SOM的原理,网络资料很多,这里就不再赘述。下面是本文案例。

⭐️ 案例

本文案例分别对于二维数据和三维数据进行SOM聚类。

from minisom import MiniSom
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

# 设置matplotlib参数以使用中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 获取网格坐标
def get_grid(m, n):
    grid = []
    for i in range(m):
        for j in range(n):
            grid.append((i, j))
    return grid

# 假设有4个聚类中心
n_centers = 4
# 假设有4个聚类中心,四个类别可视化是所以应的颜色
colors = ['r', 'g', 'c', 'y']
# SOM网格的大小(这里使用2x2的网格), 网格节点数与类别数尽量相同,不然会聚类不准
som_size = (2, 2)
# 网格坐标
grids = get_grid(2, 2)

def demo_som(n_f: int):
    # 生成数据,数据集有4个聚类中心
    X, _ = make_blobs(n_samples=300, centers=n_centers, n_features=n_f, random_state=42)
    # 输入数据的维度
    input_len = X.shape[1]
    # 创建SOM模型
    som = MiniSom(som_size[0], som_size[1], input_len, sigma=1.0, learning_rate=0.5)
    # 训练SOM模型
    som.train_random(X, 1000, verbose=True)
    # 为每个数据点找到最佳匹配单元(BMU)
    winners = [som.winner(d) for d in X]
    # 可视化二维数据集
    if input_len == 2:
        fig, ax = plt.subplots()
        # 绘制SOM权重,每个权重代表一个聚类中心
        for w in som.get_weights():
            ax.plot(w[:, 0], w[:, 1], 'o', color='black')
        # 绘制数据点及其类别
        for (w, c) in zip(winners, X):
            ax.scatter(c[0], c[1], color=colors[grids.index((w[0], w[1]))], marker='o')
        plt.title('SOM聚类结果,黑色代表聚类中心')
        # plt.show()
        plt.savefig('2d_som_cluster.png', dpi=800)

    # 可视化三维数据集
    if input_len == 3:
        fig = plt.figure(figsize=(10, 8))
        ax = fig.add_subplot(111, projection='3d')
        # 绘制SOM权重,每个权重代表一个聚类中心
        for w in som.get_weights():
            ax.scatter(w[:, 0], w[:, 1], w[:, 2], color='black', marker='*', s=80)
        # 绘制数据点及其类别
        for (w, c) in zip(winners, X):
            ax.scatter(c[0], c[1], c[2], color=colors[grids.index((w[0], w[1]))], marker='o', alpha=0.5)
        plt.title('SOM聚类结果,黑色星星代表聚类中心')
        # 使用plt.show()可以对场景进行三维旋转
        # plt.show()
        plt.savefig('3d_som_cluster.png', dpi=800)

# 输入数据维度是2维的情况
demo_som(2)
# 输入数据维度是3维的情况
demo_som(3)

输出结果如下

二维数据聚类结果:

在这里插入图片描述

三维数据聚类结果:

在这里插入图片描述

⭐️ 应用场景

SOM算法在多个领域都有着广泛的应用,包括但不限于:

数据可视化: 通过将高维数据映射到二维或一维网格上,SOM算法可以帮助我们更直观地理解数据的分布情况和内在规律。
特征降维: 在机器学习和数据挖掘中,我们经常需要处理高维数据。SOM算法可以将这些数据映射到低维空间,从而简化问题并提高计算效率。
模式识别: SOM算法可以对输入数据进行聚类分析,并根据聚类结果识别出不同的模式或类别。这在图像识别、语音识别等领域具有广泛的应用前景。
故障检测: 在工业生产中,SOM算法可以用于监测设备的运行状态并检测潜在的故障。通过分析设备数据的聚类结果和分布情况,我们可以及时发现异常情况并采取相应措施。

在这里插入图片描述

⭐️ 结语

自组织映射算法作为一种独特的无监督学习算法,在数据可视化、特征降维、模式识别等领域展现出卓越的应用价值。随着人工智能技术的不断发展,SOM算法将会得到更广泛的应用和研究。让我们一起期待它在未来带来更多惊喜吧!

笔者水平有限,若有不对的地方欢迎评论指正!

  • 30
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥猪猪爸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值