對於k-means的分類實現,我用的是jupyter notebook,這樣更方便,可視性更強。
用python對衛星資料進行非監督分類,需要gdal,numpy和sklearn,如果檢視資料,還需要matplotlib:
import numpy as np
from sklearn import cluster
from osgeo import gdal, gdal_array
import matplotlib.pyplot as plt
# 讓gdal丟擲python異常,並註冊所有驅動程式
gdal.useexceptions(
)gdal.allregister(
)
# 柵格檔案讀取,使用spot遙感影像
# 獲取第乙個波段資料
# 將img_ds轉化為乙個numpy陣列,陣列的形狀為(6000, 6000)
# 可以使用print(img.shape)檢查
)
# 將資料展平為行(未知長度),並將列的值保持為1
x = img.reshape((-
1,1)
)# 對資料執行k-means分類器
# 選擇6個分類集群
# 擬合到定義的資料x中
# 給擬合的結果分配乙個新變數x_cluster
# 重新調整原始影象的尺寸
# 此分類過程耗時比較長
k_means = cluster.kmeans(n_clusters=6)
k_means.fit(x)
x_cluster = k_means.labels_
x_cluster = x_cluster.reshape(img.shape)
# 視覺化資料
plt.figure(figsize =(10
,10))
plt.imshow(x_cluster,cmap = 「 hsv」)
plt.show()
分類結果 :4組聚類(效果更好)
6組聚類:
# 柵格檔案讀取
# 將多波段影象載入到numpy中(最快的方法)
img = np.zeros(
(img_ds.rasterysize, img_ds.rasterxsize, img_ds.rastercount)
, gdal_array.gdaltypecodetonumerictypecode(img_ds.getrasterband(1)
.datatype)
)for b in
range
(img.shape[2]
):img[:,
:, b]
= img_ds.getrasterband(b +1)
.readasarray(
)new_shape =
(img.shape [0]
* img.shape [1]
,img.shape [2]
)# spot有4個波段,將列重塑保持為4
x = img[:,
:,:4
].reshape(new_shape)
k_means = cluster.kmeans(n_clusters=4)
k_means.fit(x)
x_cluster = k_means.labels_
x_cluster = x_cluster.reshape(img[:,
:,0]
.shape)
plt.figure(figsize=(10
,10))
plt.imshow(x_cluster, cmap=
"hsv"
)plt.show(
)
結果如下圖所示:
可見效果,要比單一波段好一些。這段**的真正好處之一是如何更改分類器。因此,如果在資料載入後使用mini-batch k-means聚類演算法,則只需更改一行就可以了。
k-means演算法是常用的聚類演算法,但其演算法本身存在一定的問題,例如在大資料量下的計算時間過長。為此,mini batch k-means,這個基於k-means的變種聚類演算法應運而生。一般當樣本量大於1萬做聚類時,就需要考慮選用mini batch k-means演算法。
結果如下圖所示:
這是k-means的更快實現方法,但可能會有更多的噪音。
最後需要將分類結果進行儲存:
ds = gdal.open(
"e:/download/spot_pan.tif"
)band = ds.getrasterband(1)
arr = band.readasarray(
)[cols, rows]
= arr.shape
format
="gtiff"
driver = gdal.getdriverbyname(
format
)outdataraster = driver.create(
"e:/download/k_means.gtif"
, rows, cols,
1, gdal.gdt_byte)
outdataraster.setgeotransform(ds.getgeotransform())
outdataraster.setprojection(ds.getprojection())
outdataraster.getrasterband(1)
.writearray(x_cluster)
outdataraster.flushcache(
)del outdataraster
基於python的k means演算法實現
此次的作業是要求我們利用所學知識實現利用python實現k means演算法,首先我們先來簡單的介紹一下k means演算法 k means演算法接受輸入量k 然後將n個資料物件劃分為k個聚類以便使得所獲得的聚類滿足 同一聚類中的物件相似度較高 而不同聚類中的物件相似度較小。聚類相似度是利用各聚類中...
基於Python的K means聚類演算法
k means聚類的基本原理就不多闡述了,這裡直接講解如何實現。效果圖 紅色節點代表聚類中心,藍色節點和綠色節點代表不同的兩類 可以看到,初始時綠色節點很少且大多聚集於左下方,隨著聚類中心的移動,綠色節點區域越來越大,直到最後會穩定下來。一 建節點類 由於該聚類演算法是基於二維的,因此基本元素就是節...
kmeans演算法(python實現)
import numpy as np import matplotlib.pyplot as plt initialize center函式通過使用numpy庫的 zeros函式和random.uniform函式,隨機選取 了k個資料做聚類中心,並將結果存放在 了k個資料做聚類中心,並將結果存放在 ...