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

使用MiniSom遇AttributeError:无cluster_centers_属性的解决方案咨询

解决MiniSom无cluster_centers_属性的问题

1. 获取MiniSom的“聚类中心”(神经元权重)

MiniSom的神经元权重等价于KMeans的cluster_centers_,直接调用get_weights()方法即可获取。该方法返回形状为(x_grid_size, y_grid_size, n_features)的数组,若要展平成(n_clusters, n_features)的格式(和KMeans一致),可以这样处理:

# som为已训练完成的MiniSom实例
cluster_centers = som.get_weights().reshape(-1, som.dim)

2. 为样本分配聚类标签

要给每个样本匹配对应的神经元(即聚类类别),用winner()方法遍历样本,再将神经元的二维坐标转换为一维标签:

import numpy as np

# X为输入特征数组
labels = np.array([som.winner(x) for x in X])
# 将(x,y)坐标转为唯一整数标签
labels = labels[:, 0] * som.weights.shape[1] + labels[:, 1]

3. 正确使用win_map分组样本

win_map是训练后自动生成的字典,键为神经元坐标(如(0,0)),值为属于该神经元的样本列表。如果你的数据是DataFrame,需先转为numpy数组再使用:

import pandas as pd

# df为你的数据集
X = df.values
win_map = som.win_map(X)

# 遍历每个神经元对应的样本
for neuron_pos, samples in win_map.items():
    print(f"神经元{neuron_pos}包含样本数:{len(samples)}")
    # 转回DataFrame便于后续处理
    sample_group = pd.DataFrame(samples, columns=df.columns)
    # 这里添加你的分析/保存逻辑

替换原KMeans代码示例

如果原博文中的KMeans代码是:

from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=5)
kmeans.fit(X)
centers = kmeans.cluster_centers_
labels = kmeans.labels_

替换为MiniSom实现相同逻辑的代码:

from minisom import MiniSom

# 初始化SOM,用1x5网格对应5个聚类(可根据需求调整x/y尺寸)
som = MiniSom(x=1, y=5, input_len=X.shape[1], sigma=0.3, learning_rate=0.5)
som.random_weights_init(X)
som.train_random(X, 100)  # 训练100次,可调整迭代次数

# 获取聚类中心
centers = som.get_weights().reshape(-1, X.shape[1])
# 获取样本标签
labels = np.array([som.winner(x)[1] for x in X])

内容的提问来源于stack exchange,提问作者Zeke Estes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:35:17