2017-03-24 5 views
0

私はこの事故でこれに遭遇しましたが、何が起こっているのか理解できません。私は画像を使ってK平均クラスタリング割り当てを行い、できるだけ速く実行させるためにコードをベクトル化しようとしています。私は値がそれぞれ意味計算に含まれるべきピクセルを選択するために私のK配列を使用しますが、私は同意する軸を取得できませんでした、それぞれの新しい手段の計算ではnumpy関数は、軸引数の論理if演算子をどのように扱いますか?

image_values =np.array([[[ 0.36302522 0.51708686 0.20952381] 
         [ 0.46330538 0.69915968 0.2140056 ] 
         [ 0.7904762 0.93837535 0.27002802] 
         [ 0.78375351 0.89187676 0.24201682] 
         [ 0.57871151 0.79775912 0.24593839] 
         [ 0.2896359 0.39103645 0.64481789] 
         [ 0.23809525 0.30924368 0.64257705]] 

        [[ 0.36302522 0.51708686 0.20952381] 
         [ 0.46330538 0.69915968 0.2140056 ] 
         [ 0.7904762 0.93837535 0.27002802] 
         [ 0.78375351 0.89187676 0.24201682] 
         [ 0.57871151 0.79775912 0.24593839] 
         [ 0.2896359 0.39103645 0.64481789] 
         [ 0.23809525 0.30924368 0.64257705]] 

        [[ 0.36302522 0.51708686 0.20952381] 
         [ 0.46330538 0.69915968 0.2140056 ] 
         [ 0.7904762 0.93837535 0.27002802] 
         [ 0.78375351 0.89187676 0.24201682] 
         [ 0.57871151 0.79775912 0.24593839] 
         [ 0.2896359 0.39103645 0.64481789] 
         [ 0.23809525 0.30924368 0.64257705]]]) 
means = np.array([[0.909,0.839,0.6509],[0.813,0.808,0.694],[0.331,0.407,0.597]]) #random centroids 
err = 1 
while err > .01: 
    J = [np.sum((image_values-avg)**2, axis = 2) for avg in means] 
    K = np.argmin(J, axis = 0) 
    old_means = means 
    means = np.array([np.mean(image_values[K==i], axis ==True) for i in range(len(means))]) 
    print means 
    err = abs(sum(old_means)-sum(means)) 
    print err 

:私は、次のコードを思い付きました。私は実際に軸= 3の代わりに軸== 3とタイプし、それがうまくいったタイプミスを作った!私は数多くの異なる数字を試してみましたが、数字が何であるかは関係ありません。結果は同じです。私は彼らが働かなかった等価演算子で数とブール演算子の束を試しました。私はドキュメンテーションを見てきましたが、私はそれを理解することができませんでした。

配列関数の1つの引数の軸引数に論理がある場合、numpyは何をしますか?

ありがとうございます!

+0

Pythonでは、 '' True''は1に評価され、 '' False''は数値式で0と評価されます。 '' 'int(True) - > 1''' – wwii

+0

それは本当です - 質問は私が軸引数に何を置くかに関するものではありません。私はそこに何かを置くことができることを発見しました。問題は、軸の引数で論理if演算子が何をするかについてです。質問で正しい言葉を使用していますか(引数、論理ifなど)? – DanGoodrick

+0

どのnumpyのバージョンを使用していますか? ( 'numpy .__ version__'をチェックしてください。) –

答えて

1

私はあなたがしようとしていることを完全に理解しています。ここに私が仮定しているものがあります。 RGB値を持つ単一の画像があり、この画像内のピクセルをクラスタリングしたいとします。したがって、各セントロイドは、各カラーチャネルごとに1つの値を定義します。私は、あなたのmeans行列の各行が1つのセントロイドで、列がRGB値であると仮定します。

あなたのアプローチでは、重心を差し引く方法に間違いがあると思います。各重心について距離行列を作成する必要があります(各カラーチャネルを正しく減算しない場合)。

ここに1つの命題があります。与えられたサンプルデータでは、すべての重心に最も近いピクセルがあるため、NaNエラーが発生することに注意してください。また、必要に応じて停止基準を調整する必要があるかもしれません。

err = 1 
while err > 0.1: 
    # There are three centroids. We would like to compute the 
    # distance for each pixel to each centroid. Here, the image 
    # is thus replicated three times. 
    dist = np.tile(image_values, (3,1,1,1)) 

    # The 2D matrix needs to be reshaped to fit the dimensions of 
    # the dist matrix. With the new shape, the matrix can directly 
    # be subtracted. 
    means2 = means.reshape(3,3,1,1) 

    # Subtract each respective RGB value of the centroid for 
    # each "replica" of the image 
    J = np.power(dist - means2, 2) 

    # Sum the r,g,b channels together to get the total distance for a pixel 
    J = J.sum(axis=1) 

    # Check for which cluster the pixel is closest 
    K = np.argmin(J, axis=0) 

    # I couldn't think of a better way than this loop 
    newMeans = np.zeros((3,3)) 
    for i in range(means.shape[0]): # do each centroid 
     # In axis 1 there are pixels which we would like to 
     # average for each color channel (axis 0 are the RGB channels) 
     newMeans[i,:] = image_values[:,K==i].mean(axis=1) 

    err = np.power(means - newMeans, 2).sum() 
    means = newMeans