2017-04-03 50 views
0

我有一个具有两个属性的点数据集,我想根据属性值对这些点进行聚类。我想使用K均值聚类,但我不确定使用Scipy实现时我的输入数据应该如何。K的数据输入意味着用Scipy,Python进行聚类?

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

+0

是在x和y位置相关的集群?即是你想为聚类考虑点的位置?还是只有属性值? – hildensia

+0

主要是属性值,因为点数据已经被聚合,并且为了进行采样,我想要为了位置而进行聚类。 – Tins

回答

0

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

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表示你期望看到的簇的数量,它应该事先设置。因此,您将得到的结果是NxM矩阵的中心,其中N对应于群集,M对应于数据中的要素数量。 Data_id矩阵是一个列向量,表示与每个群集对应的数据点的标签。它是N×1矩阵,其中N是一些数据点。

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) 
相关问题