我有一个包含两个属性的点数据集,我想根据属性值对这些点进行聚类。我想使用K表示聚类,但我不确定在使用Scipy的实现时我的输入数据应该是什么样子。
例如,我应该创建一个numpy数组,每行包含:FID,属性1,属性2,x-coord,y-coord或仅包含属性值的数组?属性是整数和浮点数。
答案 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),你的属性为列,每个数据点为行。
您可能会通过白化(规范化)数据点来增强结果。假设您的数据有两个字段attr1
和attr2
,并且您有一个包含它们的列表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)