使用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
相关产品推荐
相关产品推荐

