K的数据输入意味着用Scipy、Python聚类?

Data input for K means clustering with Scipy, Python?

我有一个具有两个属性的点数据集,我想根据属性值对这些点进行聚类。我想使用 K 均值聚类,但我不确定在使用 Scipy 的实现时我的输入数据应该是什么样子。

例如,我应该制作一个 numpy 数组,每行包含:FID、属性 1、属性 2、x 坐标、y 坐标,还是仅包含属性值的数组?属性是整数和浮点数。

数据中的每一行都应该是离散的观察值,列应该对应于数据的特征或维度。对于您的情况:FID、属性 1、属性 2、x 坐标、y 坐标应该在列上,每一行应该代表不同时间步长的观察结果。

from scipy.cluster.vq import kmeans,vq
nbStates = 4
Centers, _ = kmeans(Data, nbStates)
Data_id, _ = vq(Data, Centers)

其中数据应为 Nx5 矩阵,其中 5 列应对应于您的 5 个特征 FID、属性 1、属性 2、x 坐标、y 坐标和对应于 N 个观测值的 N 行。换句话说,将您的 FID 数据数组重塑为列向量,并与其他特征相同,并将它们水平连接起来,并将其作为 kmeans 函数的参数。 nbStates 表示您希望看到的集群数,应该事先设置。您将得到的结果是 Centers,它是 NxM 矩阵,其中 N 对应于聚类,M 对应于数据中的特征数。 Data_id 矩阵是一个列向量,表示对应于每个集群的数据点的标签。它是 Nx1 矩阵,其中 N 是多个数据点。

如果您只想根据属性进行聚类,您应该创建一个 2xN 矩阵(根据 scipy docs),将您的属性作为列,将每个数据点作为行。

您可能会通过白化(规范化)数据点来增强您的结果。假设您的数据有两个字段 attr1attr2 并且您有一个列表 dataset 包含它们相应的代码如下所示:

from scipy.cluster.vq import kmeans, whiten 

data = np.ndarray((2, len(dataset))
for row, d in enumerate(dataset):
    data[0, row] = d.attr1
    data[1, row] = d.attr2

whitened_data = np.whiten(data)

clusters, _ = scipy.cluster.vq.kmeans(data, 5)  # 5 is the number of clusters you assume
assignments, _ = vq(data, clusters)