2016-04-24 3 views
0

私は小規模なプロジェクトに対してk平均クラスタリングアルゴリズムを実装しようとしています。私はあなたがnumpyの配列の操作を使用して更新機能を記述する場合numpy配列関数を使用して要素を更新する

K-手段ではなく、手動で配列をループし、値を自分で更新するので、はるかに高速であることを示唆しているthis articleに出くわしました。

私は正確に配列の各要素を反復して更新しています。データセットzの各要素について、最も近い重心からのクラスター配列を各要素の反復によって割り当てます。

for i in range(z): 
     clstr[i] = closest_center(data[i], cen) 

と私は、グレースケール画像を使用しておりますので、私の更新機能が

def closest_center(x, clist): 
    dlist = [fabs(x - i) for i in clist] 
    return clist[dlist.index(min(dlist))] 

で、私はユークリッド距離を計算し、絶対値を使用しています。

opencvにもこのアルゴリズムがあります。鉱山は70秒以上かかるが、アルゴリズムを実行するには2秒以下で済む。記事が示唆していることを知ることができますか?

私の画像はグレースケールとしてインポートされ、2dのnumpyの配列として表されます。 1d配列を処理する方が簡単だから、さらに1d配列に変換しました。

+0

なぜこれを自分で実装したいのですか? 'scipy'はすでにk-meansクラスタリングアルゴリズムを持っています。 –

+0

@AkshatMahajan画像処理における小さなプロジェクトです。私は既にOpenCV経由でアクセスしています。まだ私はinbuilt関数を使用せずにそれにする必要があります。 –

+0

より良いアイデアを得るためには、より多くのコードを共有する必要があります。ユークリッド距離を使ってはいけないのですか? – Romain

答えて

1

リストの理解度が低下する可能性があります。私はベクトルclosest_centerにお勧めします。

import numpy as np 

def closest_center(x, clist): 
    return clist[np.argmin(np.abs(x - clist))] 
関連する問題