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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:50:40