【问题标题】:Data input for K means clustering with Scipy, Python?K 的数据输入意味着使用 Scipy、Python 进行聚类?
【发布时间】:2017-08-28 02:59:20
【问题描述】:

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

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

【问题讨论】:

  • x 和 y 位置是否与集群相关? IE。点的位置是您要考虑的聚类吗?还是只有属性值?
  • 主要是属性值,因为点数据已经聚合,为了采样目的,我想不管位置如何进行聚类。

标签: python-2.7 numpy scipy k-means


【解决方案1】:

数据中的每一行都应该是离散的观察结果,列应该对应于数据的特征或维度。对于您的情况: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 是数据点的数量。

【讨论】:

    【解决方案2】:

    如果您只想对属性进行聚类,您应该创建一个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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 2020-04-20
      • 2015-09-18
      • 2018-01-22
      • 2013-05-17
      • 2020-09-06
      • 2019-04-23
      相关资源
      最近更新 更多