如何将DataFrame中的三维数据输入至K-Means聚类模型?
问题解决:K-Means处理脊柱三维点数据的错误修复
错误原因
scikit-learn的KMeans要求输入是二维数组,形状为(n_samples, n_features)(样本数×特征数)。你的DataFrame中每个单元格是长度为3的三维数组,直接传入时数据结构是嵌套的,不符合算法对输入格式的要求,因此抛出ValueError: setting an array element with a sequence.。
解决方案
需要将每个患者的17个三维点展开成一个一维特征向量(共17×3=51个特征),把数据集转换为(505, 51)的二维数组后再训练模型。
代码实现
方法1:遍历行展开数组
import numpy as np import pandas as pd from sklearn.cluster import KMeans # 将每个患者的17个三维点展开为一维特征向量 X = np.array([row.values.flatten() for _, row in data.iterrows()]) # 训练KMeans模型 kmeans = KMeans(n_clusters=4, n_init=10, max_iter=300) kmeans.fit(X) # 获取每个患者的聚类标签 labels = kmeans.labels_ # 可将标签合并回原始DataFrame data['cluster_label'] = labels
方法2:用apply简化转换
X = data.apply(lambda row: np.concatenate(row.values), axis=1).to_numpy()
进阶优化:提取更有意义的特征
直接展开所有坐标维度较高,可能包含冗余信息。可以提取脊柱的相对形态特征(比如椎体间的相对偏移、整体弯曲度等),降低特征维度同时提升聚类有效性:
def extract_spine_features(row): # 以第一个椎体为基准,计算其他椎体的相对偏移量 base_vert = row[0] relative_offsets = [vert - base_vert for vert in row.values] return np.concatenate(relative_offsets) X = data.apply(extract_spine_features, axis=1).to_numpy()
内容的提问来源于stack exchange,提问作者rchow
相关产品推荐
相关产品推荐

