2017-07-03 52 views
2

我有一個38套公寓的數據集,並在上午,下午和晚上用電。我正嘗試使用scikit-learn的k-Means實現將此數據集羣化,並獲得一些有趣的結果。如何使用Python將k-Means集羣標籤從最高位置設置到最低位置?

首先聚類結果: Img

這一切都非常好,並用4個簇我顯然得到關聯到每個公寓4個標籤 - 0,1,2和3。使用KMeans方法的random_state參數,我可以修復質心隨機初始化的種子,因此我始終可以得到歸屬於相同公寓的相同標籤。

然而,由於這個特定的情況是關於能源消耗,可以在最高和最低消費者之間進行可測量的分類。因此,我希望將標籤0分配給消耗水平最低的公寓,將標籤1分配給消耗更多的公寓等等。截至目前,我的標籤是[2 1 3 0]或[「黑色」,「綠色」,「藍色」,「紅色」];我希望它們是[0 1 2 3]或[「紅色」,「綠色」,「黑色」,「藍色」]。我應該如何繼續這樣做,同時仍然保持質心初始化隨機(使用固定種子)?

非常感謝您的幫助!

+2

我認爲你最好的選擇是在註釋後標註標籤。 – GWW

回答

2

通過查找表轉換標籤是實現您想要的簡單方法。

首先我產生了一些模擬數據:

import numpy as np 

np.random.seed(1000) 

n = 38 
X_morning = np.random.uniform(low=.02, high=.18, size=38) 
X_afternoon = np.random.uniform(low=.05, high=.20, size=38) 
X_night = np.random.uniform(low=.025, high=.175, size=38) 
X = np.vstack([X_morning, X_afternoon, X_night]).T 

然後我對數據進行聚類:

from sklearn.cluster import KMeans 
k = 4 
kmeans = KMeans(n_clusters=k, random_state=0).fit(X) 

最後我用與NumPy的argsort創建一個查找表是這樣的:

idx = np.argsort(kmeans.cluster_centers_.sum(axis=1)) 
lut = np.zeros_like(idx) 
lut[idx] = np.arange(k) 

樣品運行:

In [70]: kmeans.cluster_centers_.sum(axis=1) 
Out[70]: array([ 0.3214523 , 0.40877735, 0.26911353, 0.25234873]) 

In [71]: idx 
Out[71]: array([3, 2, 0, 1], dtype=int64) 

In [72]: lut 
Out[72]: array([2, 3, 1, 0], dtype=int64) 

In [73]: kmeans.labels_ 
Out[73]: array([1, 3, 1, ..., 0, 1, 0]) 

In [74]: lut[kmeans.labels_] 
Out[74]: array([3, 0, 3, ..., 2, 3, 2], dtype=int64) 

idx顯示從最低到最高消耗級別排序的集羣中心標籤。 lut[kmeans.labels_]0/3的公寓屬於具有最低/最高消費級別的羣集。

+0

我正在尋找scikit學習包中的內容,想知道它是否已經在集羣方法中實現。沒有這個,你的解決方案工作得很好 - 謝謝。 – Sergio