我有一個具有兩個屬性的點數據集,我想根據屬性值對這些點進行聚類。我想使用K均值聚類,但我不確定使用Scipy實現時我的輸入數據應該如何。K的數據輸入意味着用Scipy,Python進行聚類?
例如,我應該製作一個numpy數組,每行包含:FID,屬性1,屬性2,x-coord,y-coord或僅包含屬性值的數組?屬性是整數和浮點數。
我有一個具有兩個屬性的點數據集,我想根據屬性值對這些點進行聚類。我想使用K均值聚類,但我不確定使用Scipy實現時我的輸入數據應該如何。K的數據輸入意味着用Scipy,Python進行聚類?
例如,我應該製作一個numpy數組,每行包含:FID,屬性1,屬性2,x-coord,y-coord或僅包含屬性值的數組?屬性是整數和浮點數。
數據中的每一行都應該是離散的觀察值,列應該與數據的特徵或維度相對應。對於你的情況: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是一些數據點。
如果您只想對屬性進行聚類,則應創建一個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)
是在x和y位置相關的集羣?即是你想爲聚類考慮點的位置?還是隻有屬性值? – hildensia
主要是屬性值,因爲點數據已經被聚合,並且爲了進行採樣,我想要爲了位置而進行聚類。 – Tins