2017-08-09 12 views
3

私は、tensorflow contribライブラリ内で使用可能なKmeansクラスタリングの実装があることを知りました。しかし、私は2D点のクラスタ中心を推定する簡単な操作を行うことができませんでした。Kmeansクラスタリングはテンソルフローでどのように機能しますか?

コード:

## Generate synthetic data 
N,D = 1000, 2 # number of points and dimenstinality 

means = np.array([[0.5, 0.0], 
        [0, 0], 
        [-0.5, -0.5], 
        [-0.8, 0.3]]) 
covs = np.array([np.diag([0.01, 0.01]), 
       np.diag([0.01, 0.01]), 
       np.diag([0.01, 0.01]), 
       np.diag([0.01, 0.01])]) 
n_clusters = means.shape[0] 

points = [] 
for i in range(n_clusters): 
    x = np.random.multivariate_normal(means[i], covs[i], N) 
    points.append(x) 
points = np.concatenate(points) 

## construct model 
kmeans = tf.contrib.learn.KMeansClustering(num_clusters = n_clusters) 
kmeans.fit(points.astype(np.float32)) 

私は次のエラーを取得する:

InvalidArgumentError (see above for traceback): Shape [-1,2] has negative dimensions 
    [[Node: input = Placeholder[dtype=DT_FLOAT, shape=[?,2], _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 

私は私が何か間違ったことをやっているが、どのようなドキュメントから見つけ出すことができませんでしたね。

編集

私はinput_fnを使用して、それを解決したが、(私が結果を見るために10に、各クラスタ内のポイントの数を削減しなければならなかった)本当に遅いです。それはなぜですか、どうすれば速くすることができますか?解決

def input_fn(): 
    return tf.constant(points, dtype=tf.float32), None 

## construct model 
kmeans = tf.contrib.learn.KMeansClustering(num_clusters = n_clusters, relative_tolerance=0.0001) 
kmeans.fit(input_fn=input_fn) 
centers = kmeans.clusters() 
print(centers) 

を相対的な公差が設定されるべきであると思われます。だから私は1行だけを変更し、うまく動作します。 kmeans = tf.contrib.learn.KMeansClustering(num_clusters = n_clusters, relative_tolerance=0.0001)

+0

実行中のTFのバージョンは何ですか? –

答えて

0

あなたの元のコードはTensorflow 1.2で次のエラーが返されます。あなたの編集に基づいて

WARNING:tensorflow:From <stdin>:1: calling BaseEstimator.fit (from   
    tensorflow.contrib.learn.python.learn.estimators.estimator) with x 
    is deprecated and will be removed after 2016-12-01. 
    Instructions for updating: 
    Estimator is decoupled from Scikit Learn interface by moving into 
    separate class SKCompat. Arguments x, y and batch_size are only 
    available in the SKCompat class, Estimator will only accept input_fn. 

、あなたがinput_fnのみ許容入力であることを考え出したようです。本当にTFを使いたいのであれば、r1.2にアップグレードして、エラーメッセージが示すように、EstimatorをSKCompatクラスにラップします。それ以外の場合は、SKLearnパッケージを使用します。 this blogに示すように、独自のクラスタリングアルゴリズムを手作業でTFに実装することもできます。

+0

ありがとうございます。私はそれを考え出した。しかし、1つの質問 - 私のポイントがtf変数の中にあればどうですか?それは同じに動作するか、私は別の何かをする必要がありますか? (kmeansクラスタリングに入力する前にそれを評価するのと同じように) –

+0

ラッパーなしの見積もりは、TFテンソルを入力として使用しないので、プレースホルダと変数は除外されます。それで入力する前に評価するとうまくいくはずです! –

関連する問題