赫布学习、自组织映射与聚类算法解析
立即解锁
发布时间: 2025-08-30 00:50:07 阅读量: 14 订阅数: 27 AIGC 


Python构建AI高级指南
### 赫布学习、自组织映射与聚类算法解析
#### 1. 自组织映射(SOM)
自组织映射(SOM)是一种能够将输入模式映射到包含吸引子的表面的模型。下面以Olivetti人脸数据集为例,介绍SOM的实现步骤:
1. **数据加载与预处理**:
```python
import numpy as np
from sklearn.datasets import fetch_olivetti_faces
faces = fetch_olivetti_faces(shuffle=True)
Xcomplete = faces['data'].astype(np.float64) / np.max(faces['data'])
np.random.shuffle(Xcomplete)
nb_iterations = 5000
nb_startup_iterations = 500
pattern_length = 64 * 64
pattern_width = pattern_height = 64
eta0 = 1.0
sigma0 = 3.0
tau = 100.0
X = Xcomplete[0:100]
matrix_side = 5
```
2. **权重矩阵初始化**:使用小标准差的正态分布初始化权重矩阵。
```python
W = np.random.normal(0, 0.1, size=(matrix_side, matrix_side, pattern_length))
```
3. **定义关键函数**:
- **获胜单元函数**:
```python
def winning_unit(xt):
distances = np.linalg.norm(W - xt, ord=2, axis=2)
max_activation_unit = np.argmax(distances)
return int(np.floor(max_activation_unit / matrix_side)), max_activation_unit % matrix_side
```
- **学习率函数 `eta(t)` 和邻域半径函数 `sigma(t)`**:
```python
def eta(t):
return eta0 * np.exp(-float(t) / tau)
def sigma(t):
return float(sigma0) * np.exp(-float(t) / tau)
```
- **预计算距离矩阵**:
```python
precomputed_distances = np.zeros((matrix_side, matrix_side, matrix_side, matrix_side))
for i in range(matrix_side):
for j in range(matrix_side):
for k in range(matrix_side):
for t in range(matrix_side):
precomputed_distances[i, j, k, t] = np.power(float(i) - float(k), 2) + np.power(float(j) - float(t), 2)
```
- **距离矩阵函数**:
```python
def distance_matrix(xt, yt, sigmat):
dm = precomputed_distances[xt, yt, :, :]
de = 2.0 * np.power(sigmat, 2)
return np.exp(-dm / de)
```
4. **训练过程**:
```python
sequence = np.arange(0, X.shape[0])
t = 0
for e in range(nb_iterations):
np.random.shuffle(sequence)
t += 1
if e < nb_startup_iterations:
etat = eta(t)
sigmat = sigma(t)
else:
etat = 0.2
sigmat = 1.0
for n in sequence:
x_sample = X[n]
xw, yw = winning_unit(x_sample)
dm = distance_matrix(xw, yw, sigmat)
dW = etat * np.expand_dims(dm, axis=2) * (x_sample - W)
W += dW
W /= np.linalg.norm(W, axis=2).reshape((matrix_side, matrix_side, 1))
```
训练5000个周期后,权重矩阵收敛到具有不同特征的人脸。矩阵大小的选择很重要,一般选择容量为期望吸引子数量2.0到3.0倍的矩阵,然后调整大小以达到最大准确率。训练结束后,还需要进行标记阶段,处理数据集并为每个模式
0
0
复制全文
相关推荐










