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

R语言:apply()与kmeans()函数报错及市场篮子分析WSS计算问题

解决R中肘部法计算WSS时的apply()和kmeans()报错问题

首先,我来梳理下你的代码里可能导致报错的几个关键问题,然后给出修正后的完整解决方案:

1. 代码中的核心问题分析

  • 变量名覆盖风险:你把princomp(na.omit(pc1))重新赋值给了pc1,这会把原本的标准化数据框替换成princomp对象——虽然后续提取pc1$x是可行的,但这种命名方式极易混淆,建议改用不同的变量名避免后续逻辑出错。
  • kmeans调用不完整:你的循环里kmeans函数缺少必填的centers参数(也就是聚类数i),而且代码未写完(末尾的...);另外,计算WSS需要提取kmeans结果中的withinss并求和,而非直接对整个kmeans对象执行sum操作。
  • WSS向量初始化不规范:初始的wss是一个标量,直接给wss[i]赋值虽然R会自动扩展向量,但更稳妥的方式是提前初始化对应长度的向量,避免潜在的索引错误。

2. 修正后的完整代码

# 假设pc1是你的标准化输入数据框
# 第一步:执行PCA,使用独立变量名避免覆盖原数据
pca_result <- princomp(na.omit(pc1))
plot(pca_result)
loadings(pca_result)

# 提取前3个主成分构建聚类用数据框
pc.df <- data.frame(pca_result$x[,1:3])
names(pc.df)  # 可查看主成分的默认命名

# 初始化WSS向量,长度对应k=1到15的聚类数
wss <- numeric(15)
# 计算k=1时的WSS(所有样本归为一类的总方差)
wss[1] <- (nrow(pc.df)-1)*sum(apply(pc.df, 2, var))

# 循环计算k=2到15的WSS
for (i in 2:15) {
  kmeans_fit <- kmeans(pc.df, centers = i, nstart = 100, iter.max = 1000)
  wss[i] <- sum(kmeans_fit$withinss)
}

# 绘制肘部图,观察最优聚类数
plot(1:15, wss, type="b", xlab="Number of Clusters", ylab="Within Sum of Squares", main="Elbow Method for Optimal k")

3. 额外报错排查建议

  • apply()报错原因:如果apply(pc.df, 2, var)报错,大概率是pc.df中存在非数值型列,你可以用str(pc.df)检查数据类型,确保所有列都是数值型;同时确认na.omit(pc1)确实移除了所有缺失值,没有残留NA。
  • kmeans收敛问题:设置nstart=100是很好的习惯,能有效避免局部最优解;iter.max=1000也足够应对绝大多数聚类场景,确保算法能收敛。

内容的提问来源于stack exchange,提问作者Shankha Deep Karmakar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:47:29