机器学习中的SOM神经网络的简单介绍

SOM

在这里插入图片描述

基本原理

在这里插入图片描述

计算过程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Python实现

(1)SOM类实现

import numpy as np
import matplotlib.pyplot as plt

class SOM:
    def __init__(self, grid_size=(10, 10), n_features=2, sigma=1.0, learning_rate=0.5, max_iter=100):
        self.grid_size = grid_size
        self.n_features = n_features
        self.sigma = sigma
        self.learning_rate = learning_rate
        self.max_iter = max_iter
        self.weights = np.random.rand(grid_size[0], grid_size[1], n_features)
    
    def _neighborhood(self, i, j, t):
        """计算邻域函数"""
        distances = np.sqrt((np.arange(self.grid_size[0])[:, None] - i)**2 + 
                           (np.arange(self.grid_size[1])[None, :] - j)**2)
        return np.exp(-distances**2 / (2 * (self.sigma * (1 - t / self.max_iter))**2))
    
    def train(self, X):
        """训练SOM"""
        for t in range(self.max_iter):
            # 随机选择一个样本
            idx = np.random.randint(0, len(X))
            x = X[idx]
            
            # 计算BMU
            distances = np.linalg.norm(self.weights - x, axis=2)
            bmu_i, bmu_j = np.unravel_index(np.argmin(distances), distances.shape)
            
            # 更新权重
            h = self._neighborhood(bmu_i, bmu_j, t)
            for i in range(self.grid_size[0]):
                for j in range(self.grid_size[1]):
                    self.weights[i, j] += self.learning_rate * h[i, j] * (x - self.weights[i, j])
            
            # 衰减学习率和邻域半径
            self.learning_rate = self.learning_rate * 0.9
            self.sigma = self.sigma * 0.9
    
    def predict(self, X):
        """预测每个样本的BMU"""
        predictions = []
        for x in X:
            distances = np.linalg.norm(self.weights - x, axis=2)
            bmu_i, bmu_j = np.unravel_index(np.argmin(distances), distances.shape)
            predictions.append((bmu_i, bmu_j))
        return np.array(predictions)

(2)示例数据

# 生成二维数据(环形分布)
np.random.seed(42)
theta = np.random.uniform(0, 2*np.pi, 100)
r = np.random.uniform(0, 1, 100)
X = np.column_stack([r * np.cos(theta), r * np.sin(theta)])

# 训练SOM
som = SOM(grid_size=(10, 10), n_features=2, sigma=1.0, learning_rate=0.5, max_iter=100)
som.train(X)

# 预测BMU
predictions = som.predict(X)

(3)可视化结果

# 绘制SOM网格
plt.figure(figsize=(8, 8))
for i in range(som.grid_size[0]):
    for j in range(som.grid_size[1]):
        plt.scatter(i, j, c=som.weights[i, j], cmap='viridis', s=100)
plt.title("SOM Weights")
plt.colorbar()
plt.show()

# 绘制数据点和BMU
plt.figure(figsize=(8, 8))
plt.scatter(X[:, 0], X[:, 1], c='blue', alpha=0.5, label='Data Points')
for idx, (i, j) in enumerate(predictions):
    plt.scatter(i, j, c='red', marker='x', s=50)
plt.title("Data Points and BMUs")
plt.legend()
plt.show()

数学公式的总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我是梦磊OL

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

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

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

打赏作者

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

抵扣说明:

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

余额充值