K-means聚类的PCA处理遇类型错误,求教核主成分分析聚类方法
解决K-means结合核PCA时的TypeError: 'str'与'int'不支持'<'运算问题
嘿,这个错误我太熟了——你这是数据集里混了字符串类型的特征,而核PCA和K-means都是纯数值计算的算法,根本没法处理字符串,当算法尝试对包含字符串的特征矩阵做比较或运算时,直接就触发类型不匹配的报错了。
咱们先拆解问题:你的数据集里Genre列是Male/Female这种字符串值,这就是罪魁祸首。接下来一步步解决:
1. 先处理字符串分类特征
针对Genre这种无顺序的分类特征,最稳妥的是用独热编码,用pandas就能轻松实现:
import pandas as pd # 假设你的数据存在DataFrame df中 # 对Genre列做独热编码,drop_first避免多重共线性 df = pd.get_dummies(df, columns=['Genre'], drop_first=True)
执行后会生成Genre_Male列,1代表男性,0代表女性,完美转换成数值型。
如果你好奇,标签编码(Label Encoding)虽然也能转,但只适合有顺序的分类(比如评分等级),这里Gender用独热编码更合理。
2. 移除无关列+标准化数值特征
首先,CustomerID是标识列,聚类完全用不上,先删掉:
df = df.drop('CustomerID', axis=1)
然后,核PCA对数据尺度很敏感,把数值特征(Age、年收入、消费评分)标准化一下,让它们处于同一尺度:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() numerical_features = ['Age', 'Annual Income (k$)', 'Spending Score (1-100)'] df[numerical_features] = scaler.fit_transform(df[numerical_features])
3. 重新运行核PCA+K-means流程
现在数据全是数值型了,就可以正常执行你的分析流程:
from sklearn.decomposition import KernelPCA from sklearn.cluster import KMeans # 用核PCA降维,比如选rbf核,降到2维方便后续可视化 kpca = KernelPCA(n_components=2, kernel='rbf', random_state=42) X_kpca = kpca.fit_transform(df) # 执行K-means聚类,这里假设分5类(你可以用肘部法确定最优聚类数) kmeans = KMeans(n_clusters=5, random_state=42) cluster_labels = kmeans.fit_predict(X_kpca) # 把聚类结果合并回原数据,方便后续分析 df['Cluster'] = cluster_labels
额外提醒
- 跑之前可以用
df.dtypes检查所有列的类型,确保没有遗漏的字符串列; - 核函数可以多试试(比如linear、poly),不同核函数对聚类效果影响不小;
- 确定K-means最优聚类数的话,可以用肘部法或轮廓系数法,比直接指定更靠谱。
内容的提问来源于stack exchange,提问作者Beg
相关产品推荐
相关产品推荐

