更高维度的 KMeans 聚类是不是可行?

Posted

技术标签:

【中文标题】更高维度的 KMeans 聚类是不是可行?【英文标题】:Is KMeans Clustering with higher dimensions possible?更高维度的 KMeans 聚类是否可行? 【发布时间】:2021-01-22 17:33:42 【问题描述】:

我有几百个 3d 数组,我想用它们做一些聚类分析,但是 sklearn.cluster.KMeans 只会做一个 2D 数组。我的每个数组的大小都是(56,88,56),我有300。当我将它们组合为一个数组时,我得到(300,56,88,56)。 KMeans 给出错误ValueError: Found array with dim 4. Estimator expected <= 2.。我解决这个问题的一种方法是在我的数组上使用np.ndarray.flatten(),所以我的新数组是(275968,),当组合成一个数组时,我得到(300,275968),我可以使用KMeans 聚类。有没有办法使用 4D 阵列执行聚类分析,或者我最终会得到与展平阵列以进行 2D 分析相同或相似的结果?

from sklearn.cluster import KMeans
import numpy as np
import pandas as pd
import nibabel as nib
import os, sys
from tqdm import tqdm

DIR = '(56x88x56)\\' 
flatten_list = []
for r,d,f in os.walk(DIR):
    for file in tqdm(f):
        path = DIR + file
        cp = nib.load(path).get_fdata()
        cp = np.array(cp)        
        array_flatten = np.ndarray.flatten(cp)
        flatten_list.append(array_flatten)

flatten_list = np.array(flatten_list)
kmeans = KMeans(n_clusters = 10, random_state = 0, verbose = 1).fit(flatten_list)
cluster_labels = kmeans.labels_
print(cluster_labels)

【问题讨论】:

【参考方案1】:

K-Means 聚类的步骤是:

选取一些随机中心:对所有坐标采样相同的分布,因此该操作相对于坐标变化是对称的。 计算所述集群和数据库中的点之间的距离。即使您更改坐标顺序,欧几里得距离的公式也保持不变。 计算平均值和移动中心。交换坐标时,平均值也保持不变。

总而言之,K-Means 中的所有步骤都与数据的内部结构无关。您可以轻松地为矩阵实现它,但这样做没有实际意义,因为您可以将它们展平并将它们视为数组。 sklearn 收敛到的解决方案应该与提供的实现相同。

你问这个有什么特别的原因吗? sklearn 的解决方案不会收敛到预期的输出吗?

【讨论】:

您可以轻松选择三个特征(列)作为您适合的变量的输入。 np.asarray([np.asarray(df['Feature1']),df['Feature2']),df['Feature3'])]).TX = data 如果您需要更多信息,请告诉我。

以上是关于更高维度的 KMeans 聚类是不是可行?的主要内容,如果未能解决你的问题,请参考以下文章

python代码在kmeans聚类后查找特征重要性

谱聚类为啥要用到kmeans

opencv kmeans 聚类的输入矩阵

opencv kmeans 聚类的输入矩阵

聚类 kmeans | 机器学习

图片压缩-KMeans