我尝试使用KMeans质心标记/聚集像素进行土地覆盖分析。我希望只使用sklearn和matplotlib来做到这一点。目前我的代码看起来像这样:
kmeans.fit(band_5)
centroids = kmeans.cluster_centers_
plt.scatter(centroids[:, 0], centroids[:, 1])
band_5的形状是(713,1163),但从散点图中我可以看出质心坐标的值远远超过该形状。
根据我的理解,KMeans提供的质心需要转换为正确的坐标,然后转换为shapefile,然后在监督过程中使用它来标记/聚集像素。
如何将这些质心转换为正确的坐标,然后导出到shapefile?另外,我是否需要创建shapefile?
我试图采用这篇文章中的一些代码,但我无法让它工作。 http://scikit-learn.org/stable/auto_examples/cluster/plot_color_quantization.html#sphx-glr-auto-examples-cluster-plot-color-quantization-py
答案 0 :(得分:1)
有几点:
scikit-learn期望列中的数据(想想电子表格中的表格),所以简单地传入表示栅格波段的数组实际上会尝试对数据进行分类,就好像你有1163个采样点和713个值( (每个样本)。相反,你需要flatten数组,如果你在像ArcGIS这样的东西中查看它,那么返回的kmeans将等同于你的栅格的分位数分类,质心在波段最小值的范围内波段最大值(不在单元格坐标中)。
看看你提供的例子,他们有一个三波段jpeg,它重塑为三个长列:
image_array = np.reshape(china, (w * h, d))
xs, ys = np.meshgrid(
np.linspace(0, 1, 1163), # x
np.linspace(0, 1, 713), # y
)
data_with_coordinates = np.column_stack([
band_5.flatten(),
xs.flatten(),
ys.flatten()
])
# And on with the clustering