基於Python的K means簡單分類

2021-10-17 18:49:01 字數 3903 閱讀 1611

對於k-means的分類實現,我用的是jupyter notebook,這樣更方便,可視性更強。

用python對衛星資料進行非監督分類,需要gdalnumpysklearn,如果檢視資料,還需要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個資料做聚類中心,並將結果存放在 ...