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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

3184閲覧

python3 ライブラリを使わないK-MEANSの実装しています。

SHOWHEYHEI

総合スコア8

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

0クリップ

投稿2016/01/18 08:05

編集2022/01/12 10:55

##学校でK-MEANS(k平均法)をpython3で実装する課題をやっています。

クラスタリングの箇所がうまくいかなくて悩んでいます。

ipython-notebookを用いています。

irisデータをクラスタリングします。

↓最初にユークリッド関数を定義して

lang

1def EucDist(a,b) 2 """ 3 ユーグリット距離を求める関数 4 """ 5 return np.sqrt(np.power(a-b, 2).sum()) 6

↓irisデータを読み込んで

f = open("iris.data","r") text = f.read() f.close

↓カンマで区切って

a=text.replace("\n",",")#改行をカンマに変える b=a.split(",")#カンマで区切る c=[b[i:i+5] for i in range(0,752,5)]#4次元の座標データとクラスター c

↓座標点とクラスに分けて

data=[] for i in range(150): i=i*5 cb = [[float(b[i]),float(b[i+1]),float(b[i+2]),float(b[i+3])],b[i+4]] data.append(cb) data

↓座標点だけ取りだして

cd = []#irisデータの座表点のみ格納するリスト for i in range(len(data)): cd.append(data[i][0]) cd

↓重心の初期値をirisデータからランダムに選んで

k=3 cent=[] for i in range(k): cent.append(random.choice(cd))#cdからランダムに重心を3つ取り出す cent

↓クラスタリング

cmp=[]#ユークリッド距離を一時的に格納するリスト k0=[]#クラスタ1を格納するリスト k1=[]#クラスタ2を格納するリスト k2=[]#クラスタ3を格納するリスト for i in range(len(cd)): a=np.array(cd[i])#irisデータの座標 for j in range(k): b=np.array(cent[j])#初期の重心値 if len(cmp) != 3:#cmpには入っているデータ数が3になるまでcontinue文以下の処理を無視 continue if cmp.index(min(cmp)) == 0: k0.append(cent[0])# cmp[:] elif cmp.index(min(cmp)) == 1: k1.append(cent[1]) cmp[:] else: k2.append(cent[2]) cmp[:] else: cmp.append(EucDist(a,b))#ユークリッド距離を求め、結果をリストcmpに格納 print("クラスタ1: ",k0) print("クラスタ2: ",k1) print("クラスタ3: ",k2)

実行すると各クラスタのリストに何も要素が入らなかったです。

この後、各リストに入っている座標の平均を求め、それを新たな重心値として上記のソースコードの処理
を繰り返したいんですが、どうすればいいでしょうか。

意味のわからない説明で申し訳有りません。

ikuwow👍を押しています

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

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

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

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

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

ikuwow

2016/01/19 00:59

ややコードが見づらいので、Markdown記法でシンタックスハイライトしていただけると見やすくなるかと思います。
guest

回答1

0

if len(cmp) != 3:#cmpには入っているデータ数が3になるまでcontinue文以下の処理を無視 continue if cmp.index(min(cmp)) == 0: k0.append(cent[0])# cmp[:] elif cmp.index(min(cmp)) == 1: k1.append(cent[1]) cmp[:] else: k2.append(cent[2]) cmp[:] else: cmp.append(EucDist(a,b))#ユークリッド距離を求め、結果をリストcmpに格納

if len(cmp) != 3: の直後に continue が有るので、continueの次の行~上記最後のelse:の直前行までが全く実行されないプログラムになってます。

投稿2016/01/18 08:17

hiro-k

総合スコア902

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

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

SHOWHEYHEI

2016/01/18 11:57

修正するとしたら具体的にどうすればいいですか?
hiro-k

2016/01/19 05:33

#cmpには入っているデータ数が3になるまでcontinue文以下の処理を無視 のコメントが処理したいことの意図だとするなら、 continue 行を消して、 3か所の cmp[:] となってる行を cmp=[] とすると、期待通りの動作になるのではないかと思いますよ。
hiro-k

2016/01/19 10:58

あと、if len(cmp) != 3: → if len(cmp) == 3: の修正も必要でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問