在R中执行k-means聚类(k=3)时出错,寻求解决方案
K-Means聚类代码报错排查(k=3)
我尝试将数据划分为3个聚类,但运行代码时kmeans()函数报错,代码如下:
#Compute k-means with k=3 library(ggplot2) library(cluster) library(factoextra) library(tidyverse) library(FactoMineR) set.seed(123) protein2 <- read_csv("Downloads/protein.csv") k1<- kmeans(protein2, centers=3, nstart=25) print(k1)
我的数据集第一列是字符型的国家名称(如Albania、Austria),其余列均为数值型的蛋白质摄入相关指标(如RedMeat、Fish、Eggs等)。
错误原因
K-Means是基于距离计算的聚类算法,仅支持数值型输入。你的protein2数据框包含字符型的国家名称列,直接传入kmeans()会触发类型不兼容的错误。
修复方案
移除字符型列,只保留数值型特征用于聚类:
# Compute k-means with k=3 library(ggplot2) library(cluster) library(factoextra) library(tidyverse) library(FactoMineR) set.seed(123) protein2 <- read_csv("Downloads/protein.csv") # 提取数值型特征列(移除第一列的国家名称) protein_numeric <- select(protein2, -1) # 或者用索引筛选:protein_numeric <- protein2[, -1] # 执行K-Means聚类 k1 <- kmeans(protein_numeric, centers=3, nstart=25) print(k1) # 可选:将聚类结果合并回原数据,方便后续分析 protein2$cluster <- k1$cluster head(protein2)
额外优化建议
如果各特征的量纲差异较大(比如有的指标是个位数,有的是几十),建议先对数据做标准化处理,避免量纲影响聚类结果:
# 标准化数值特征 protein_scaled <- scale(protein_numeric) # 基于标准化后的数据聚类 k1_scaled <- kmeans(protein_scaled, centers=3, nstart=25)
内容的提问来源于stack exchange,提问作者user19769766
相关产品推荐
相关产品推荐

