Kohonen算法中数据集随机点与中心距离计算及TypeError报错解决
报错原因与修复方案
错误根因
- 你的
dataset是由4个形状为(250,2)的numpy数组组成的列表,直接调用dataset[0]/dataset[1]得到的是整个二维数组,而非单个坐标点,math.sqrt仅支持单个标量数值输入,无法处理数组,因此触发类型错误。 - 距离公式括号位置错误:你写的
(W[k][1]-dataset[1]**2)是对数据点坐标先平方再做差,正确逻辑是先做差再对差值平方。 - 普通Python列表
W不支持W[:,k_min]这种numpy风格的二维切片操作。 - 距离比较逻辑写反:你当前是判断
dist>d_min时更新,实际Kohonen算法需要找到距离样本最近的获胜神经元,应该用小于号判断。 - 样本取值逻辑缺失:你循环了样本索引
j但完全没有用到,没有正确取出单个样本点参与计算。
修复后的代码
import numpy as np import math # 生成四个簇的样本 a1 = np.random.randn(250,2) arr1 = a1 + (0,0) a2 = np.random.randn(250,2) arr2 = a2 + [10,10] a3 = np.random.randn(250,2) arr3 = a3 + (0,10) a4 = np.random.randn(250,2) arr4 = a4 + (10,0) alpha = 0.1 # 转成numpy数组方便矩阵运算 W = np.array([[0,0],[0,10],[10,0],[10,10]]) # 拼接所有样本成形状为(1000,2)的数组,方便按索引取单个样本 dataset = np.concatenate([arr1, arr2, arr3, arr4], axis=0) for i in range(100): for j in range(dataset.shape[0]): # 取出当前单个样本点 current_point = dataset[j] d_min = np.inf k_min = 0 for k in range(4): # 用numpy的norm方法计算欧氏距离,避免手动写公式出错 dist = np.linalg.norm(W[k] - current_point) # 找距离最小的获胜神经元 if dist < d_min: d_min = dist k_min = k # 更新获胜神经元的权重 W[k_min] = W[k_min] * (1 - alpha) + alpha * current_point alpha = 0.5 * alpha
补充说明
如果不想用np.linalg.norm,也可以手动写距离计算逻辑,写法如下:
dist = math.sqrt((W[k][0] - current_point[0])**2 + (W[k][1] - current_point[1])**2)
内容的提问来源于stack exchange,提问作者dg123
相关产品推荐
相关产品推荐

