2017-07-18 6 views
0

私は5つの列を含むデータフレームを持っています。私は3つの変数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

forループなどのPythonコードは使用しないでください。通訳は遅いです。操作をベクトル化する! –

答えて

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モジュールを使用して損失関数を計算する最速の方法を知って興味を持ってこと:ここでは、コードです。

関連する問題