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

