2017-07-18 109 views
0

我有一個包含5列的數據框。我正在嘗試爲三個變量X,YZ聚類點,並找出kmeans聚類的損失函數。下面的代碼會照顧到這一點,但是如果我使用160,000行對我的真實數據框運行此操作,它需要永遠!我認爲它可以做得更快。計算大熊貓數據框中kmeans的損失函數

PS:看來KMeans模塊在sklearn不提供損失函數,這就是爲什麼我寫我自己的代碼。

from sklearn.cluster import KMeans 
import numpy as np 

df = pd.DataFrame(np.random.randn(1000, 5), columns=list('XYZVW')) 
kmeans = KMeans(n_clusters = 6, random_state = 0).fit(df[['X','Y', 'Z']].values) 
df['Cluster'] = kmeans.labels_ 
loss = 0.0 
for i in range(df.shape[0]): 
    cluster = int(df.loc[i, "Cluster"]) 
    a = np.array(df.loc[i,['X','Y', 'Z']]) 
    b = kmeans.cluster_centers_[cluster] 
    loss += np.linalg.norm(a-b) 
print(loss) 
+0

避免Python代碼,如for循環。口譯員很慢。向量化您的操作! –

回答

0

看來,scipy包照顧損失功能,它是相當快。下面的代碼:

from scipy.cluster.vq import vq, kmeans, whiten 
import numpy as np 
df = pd.DataFrame(np.random.randn(1000, 5), columns=list('XYZVW')) 
centers, loss = kmeans(df[['X','Y', 'Z']].values, 6) 
df['Cluster'] = vq(features, centers)[0] 

話雖這麼說,我還是想知道計算使用sklearnkmeans模塊損失函數的最快方式。