⭐️ 前言
在人工智能和机器学习的世界里,自组织映射(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算法将会得到更广泛的应用和研究。让我们一起期待它在未来带来更多惊喜吧!
笔者水平有限,若有不对的地方欢迎评论指正!