K的数据输入意味着使用Scipy,Python进行聚类?

时间:2017-04-03 09:43:13

标签: python-2.7 numpy scipy k-means

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

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

2 个答案:

答案 0 :(得分:0)

数据中的每一行都应是离散的观察值,列应与数据的要素或维度相对应。对于您的情况:FID,属性1,属性2,x-coord,y-coord应该在列上,每行应代表不同时间步的观察值。

"txt0"

其中Data应为Nx5矩阵,其中5列应对应于您的5个特征FID,属性1,属性2,x-coord,y-coord和N个对应于N个观察的行。换句话说,将您的FID数据数组重新整形为列向量,对其他要素进行相同处理,并将它们水平连接并将其作为kmeans函数的参数。 nbStates表示您希望看到的簇数,应该事先设置它。结果是中心是NxM矩阵,其中N对应于簇,M对应于数据中的要素数。 Data_id矩阵是一个列向量,表示与每个群集对应的数据点的标签。它是Nx1矩阵,其中N是多个数据点。

答案 1 :(得分:0)

如果你想仅仅根据属性进行聚类,你应该创建一个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)