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

基于Kohonen包的SOM映射分析求助附代码及参考教程

获取Kohonen SOM的数值分析结果

嘿,我看到你正在用R的kohonen包做自组织映射(SOM)分析,想要获取映射的数值分析结果对吧?我来一步步帮你搞定,先把代码整理补全,再教你提取关键的数值输出:

第一步:整理并补全你的代码

你提供的数据是截断的,我先帮你搭好可运行的代码框架(后续替换成你实际的完整数据集即可):

# 加载kohonen包
require(kohonen)

# 构造完整数据矩阵(把你截断的部分补全到这里)
data <- matrix( 
  c(6, 6, 80, 280, 404, 0, 158, 158197, 158197233,
    6, 13, 80, 280, 404, 0, 158, 158197, 158197233,
    6, 13, 80, 283, 404, 0, 158, 158197, 158197233,
    6, 35, 80, 321, 301, 0, 158, 158197, 158197233,
    6, 35, 80, 3131, 200, 0, 158, 158197, 158197233,
    6, 35, 80, 20073, 200, 0, 158, 158197, 158197233),
  nrow = 6, byrow = TRUE # 根据你实际的数据行数调整这个参数
)

# 重点!SOM对特征尺度敏感,必须先标准化数据
scaled_data <- scale(data)

# 训练SOM模型(参数可以根据你的需求调整)
som_model <- som(scaled_data, 
                 grid = somgrid(xdim = 5, ydim = 5, topo = "hexagonal"), # 六边形网格,大小可改
                 rlen = 100, # 迭代次数,一般100-500足够
                 alpha = c(0.05, 0.01)) # 初始到最终的学习率

第二步:提取核心数值分析结果

1. 神经元的权重(聚类中心原型)

这是SOM最核心的数值结果,每个神经元对应一个“聚类中心”,包含所有特征的标准化后取值:

# 获取所有神经元的权重矩阵
neuron_weights <- som_model$codes
# 查看前5个神经元的权重,方便快速浏览
head(neuron_weights, 5)

2. 每个样本的神经元分配

知道你的每个数据点被映射到了哪个神经元,这是后续细分分析的基础:

# 获取每个样本对应的神经元ID
sample_assignments <- som_model$unit.classif
# 打印结果,每个数字代表对应行样本的神经元编号
print(sample_assignments)

3. 神经元的样本计数

统计每个神经元下有多少个样本,能帮你快速了解哪些聚类是“大簇”,哪些是“小簇”:

# 计算每个神经元的样本数量
neuron_counts <- table(sample_assignments)
print(neuron_counts)

4. 训练过程的误差指标

这两个指标能帮你评估模型效果:

  • 量化误差:所有样本到对应神经元的平均距离,越小说明聚类越紧凑
  • 拓扑误差:反映SOM的拓扑保持性,越小说明相似样本被映射到相邻神经元的比例越高
# 查看最终的误差值
cat("拓扑误差:", som_model$topo.error, "\n")
cat("最终量化误差:", som_model$quant.error[length(som_model$quant.error)], "\n")

# 如果想看迭代过程中量化误差的变化趋势,可以画个线图
plot(som_model$quant.error, type = "l", xlab = "迭代次数", ylab = "量化误差")

5. 特征的重要性排序

如果你想知道哪些特征对聚类的影响最大,可以计算每个特征在所有神经元权重中的范围(最大值减最小值),范围越大说明这个特征越能区分不同聚类:

# 计算每个特征的权重范围
feature_importance <- apply(som_model$codes, 2, function(x) max(x) - min(x))
# 按重要性从高到低排序
sort(feature_importance, decreasing = TRUE)

小提醒

  • 一定要记得标准化数据!如果你的特征尺度差异很大(比如你数据里的158197233和0),不标准化的话大数值特征会完全主导聚类结果,得到的结果毫无意义。
  • 如果你的数据集很大,可以适当增加迭代次数rlen,或者调整网格大小xdim/ydim来获得更细致的聚类。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:54:27