私は、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)
実行中のTFのバージョンは何ですか? –