CMAC(Cerebellar Model Articulation Controller)神经网络,也称为小脑模型关联控制器,是一种仿照人类小脑控制肢体运动的原理而建立的神经网络模型。它最初由Albus J.S.于1975年提出,经过多年的完善和发展,现已成为一种成熟的神经网络理论。
CMAC神经网络具有以下特点:
- 联想功能:CMAC神经网络具有联想功能,其联想具有局部推广(或称泛化)能力。因此,相似的输入将产生相似的输出,而远离的输入将产生独立的输出。
- 局部逼近:CMAC是一种局部逼近神经网络,其每个神经元的输入输出是一种线性关系,但总体上可以看作一种表达非线性映射的表格系统。对于网络的每一个输出,只有很少的神经元所对应的权值对其有影响,这些神经元由输入决定。
- 学习功能:CMAC神经网络具有学习功能,可以根据学习结果改变表格内容,对信息进行区分存储。它的学习只在线性映射部分进行,因此可以采用简单的δ算法进行训练,其收敛速度比BP算法快得多,且不存在局部极小问题。
CMAC神经网络的结构模型是将控制器的每个输入状态作为一个状态向量,组成一个输入空间。网络训练的权值被存入存储器,并根据期望输出与实际输出的误差来调整这些权值。实际上,CMAC神经网络可以被看作一种复杂的查表系统,主要用于表达非线性的映射关系。
import numpy as np import matplotlib.pyplot as plt # CMAC网络参数 input_size = 2 # 输入维度 quantization_levels = 5 # 输入量化级数 association_size = quantization_levels input_size # 联想存储空间大小 learning_rate = 0.1 # 学习率 # 随机生成数据 data_size = 100 # 数据集大小 x = np.random.rand(data_size, input_size) # 随机输入数据 y = np.sum(x 2, axis=1) # 非线性函数作为实际值:f(x) = x1^2 + x2^2 # CMAC网络结构初始化 weight_matrix = np.zeros((association_size, 1)) # 联想存储权重矩阵 quantization_step = 1.0 / (quantization_levels - 1) # 量化步长 # 训练CMAC网络 for i in range(data_size): input_vector = x[i] target_output = y[i] # 量化输入 quantized_input = np.floor(input_vector / quantization_step).astype(int) # 计算哈希地址 hash_address = np.ravel_multi_index(quantized_input, (quantization_levels,) * input_size) # 更新权重 weight_matrix[hash_address] += learning_rate * (target_output - weight_matrix[hash_address]) # 测试CMAC网络并绘制图表 x_test = np.linspace(0, 1, 100) x1_grid, x2_grid = np.meshgrid(x_test, x_test) y_pred = np.zeros_like(x1_grid) for i in range(x1_grid.shape[0]): for j in range(x1_grid.shape[1]): input_vector_test = np.array([x1_grid[i, j], x2_grid[i, j]]) quantized_input_test = np.floor(input_vector_test / quantization_step).astype(int) hash_address_test = np.ravel_multi_index(quantized_input_test, (quantization_levels,) * input_size) y_pred[i, j] = weight_matrix[hash_address_test] # 绘制实际值和预测值的比较图 plt.figure(figsize=(10, 6)) plt.scatter(np.arange(data_size), y, color='blue', label='Actual Values') # 实际值 # 由于CMAC是局部逼近,直接取测试点上的权重可能并不准确,这里取测试点周围权重平均值作为预测 # 注意:这种方法可能不是标准的CMAC预测方式,标准方式通常涉及多个权重和基函数的叠加 y_pred_plot = y_pred.flatten()[:data_size] # 取前data_size个预测值,以便和实际值进行比较 plt.scatter(np.arange(data_size), y_pred_plot, color='red', label='Predicted Values') # 预测值 plt.title('Actual vs Predicted Values') plt.xlabel('Data Points') plt.ylabel('Output Values') plt.legend() plt.show()
讯享网


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/19843.html