質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

0回答

2461閲覧

TensorFlowでk-meansを実装

Rikuto.F

総合スコア8

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2017/06/29 02:11

現在 Learning TensorFlow :: Clustering and k-meansで学習しているのですが,このアルゴリズムで10回ないし特定の閾値を超えるまでk-meansを繰り返したいとき,どのようにすればいいのでしょうか?

上述のサイトと同様のコードですが,以下にコードを掲出します。

functions.py

python

1import tensorflow as tf 2import numpy as np 3 4def create_samples(n_clusters, n_samples_per_cluster, n_features, embiggen_factor, seed): 5 np.random.seed(seed) 6 slices = [] 7 centroids = [] 8 for i in range(n_clusters): 9 samples = tf.random_normal((n_samples_per_cluster, n_features), 10 mean=0.0, stddev=5.0, dtype=tf.float32, seed=seed, name="cluster_{}".format(i)) 11 current_centroid = (np.random.random((1, n_features)) * embiggen_factor) - (embiggen_factor/2) 12 centroids.append(current_centroid) 13 samples += current_centroid 14 slices.append(samples) 15 samples = tf.concat(slices, 0, name='samples') 16 centroids = tf.concat(centroids, 0, name='centroids') 17 return centroids, samples 18 19def plot_clusters(all_samples, centroids, n_samples_per_cluster): 20 import matplotlib.pyplot as plt 21 colour = plt.cm.rainbow(np.linspace(0,1,len(centroids))) 22 for i, centroid in enumerate(centroids): 23 samples = all_samples[i*n_samples_per_cluster:(i+1)*n_samples_per_cluster] 24 plt.scatter(samples[:,0], samples[:,1], c=colour[i]) 25 plt.plot(centroid[0], centroid[1], markersize=35, marker="x", color='k', mew=10) 26 plt.plot(centroid[0], centroid[1], markersize=30, marker="x", color='m', mew=5) 27 plt.show() 28 29def choose_random_centroids(samples, n_clusters, seed=None): 30 n_samples = tf.shape(samples)[0] 31 random_indices = tf.random_shuffle(tf.range(0, n_samples), seed=seed) 32 begin = [0,] 33 size = [n_clusters,] 34 size[0] = n_clusters 35 centroid_indices = tf.slice(random_indices, begin, size) 36 initial_centroids = tf.gather(samples, centroid_indices) 37 return initial_centroids 38 39def assign_to_nearest(samples, centroids): 40 expanded_vectors = tf.expand_dims(samples, 0) 41 expanded_centroids = tf.expand_dims(centroids, 1) 42 distances = tf.reduce_sum( tf.square( 43 tf.subtract(expanded_vectors, expanded_centroids)), 2) 44 mins = tf.argmin(distances, 0) 45 46 nearest_indices = mins 47 return nearest_indices 48 49def update_centroids(samples, nearest_indices, n_clusters): 50 nearest_indices = tf.to_int32(nearest_indices) 51 partitions = tf.dynamic_partition(samples, nearest_indices, n_clusters) 52 new_centroids = tf.concat([tf.expand_dims(tf.reduce_mean(partition, 0), 0) for partition in partitions], 0) 53 return new_centroids

generate_samples.py

import tensorflow as tf import numpy as np from functions import * n_features = 2 n_clusters = 5 n_samples_per_cluster = 500 seed = 700 embiggen_factor = 70 data_centroids, samples = create_samples(n_clusters, n_samples_per_cluster, n_features, embiggen_factor, seed) initial_centroids = choose_random_centroids(samples, n_clusters) nearest_indices = assign_to_nearest(samples, initial_centroids) updated_centroids = update_centroids(samples, nearest_indices, n_clusters) model = tf.global_variables_initializer() with tf.Session() as session: sample_values = session.run(samples) updated_centroid_value = session.run(updated_centroids) print(updated_centroid_value) plot_clusters(sample_values, updated_centroid_value, n_samples_per_cluster)

nearest_indices および updated_centroids を繰り返し実行するようにすればいいのだと思うのですが,どのようにして更新されたセントロイドの情報を保持し,それをもとに nearest_indices を実行すればよいのか悩んでいます。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問