You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:06:04