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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

データマイニング

データマイニングは、購買履歴やクレジットカードの利用履歴、電話の通話履歴など企業にある大量のデータを解析して、その中に隠れたパターンやルールを探し出す技術です。DMと略されることもあります。

Q&A

解決済

1回答

2562閲覧

データ分類のプログラムの作成が出来ません

kouk

総合スコア7

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

データマイニング

データマイニングは、購買履歴やクレジットカードの利用履歴、電話の通話履歴など企業にある大量のデータを解析して、その中に隠れたパターンやルールを探し出す技術です。DMと略されることもあります。

0グッド

0クリップ

投稿2016/10/02 06:36

編集2016/10/02 18:53

###前提・実現したいこと
ここに質問したいことを詳細に書いてください
クラスタリングのプログラムを作成中
与えたデータに対してランダムに代表点を決めその代表点から最も遠い点を計算し
その最も遠い点から決めたデータ数分近いデータを同じグループとして分類するプログラムです
決められたデータ数未満のデータが残った場合そのデータと分けられたそれぞれの代表点との距離を計算し
近い代表点のグループに分類します
全データが分けられた時点で終了とします

###発生している問題・エラーメッセージ
1各点にランダムにクラスタ(グループ)を割り当てる
2クラスタの重心を計算する。
3点のクラスタを、一番近い重心のクラスタに変更する
4変化がなければ終了。変化がある限りは 2. に戻る。

このk-meansと呼ばれるプログラムに現在なっているので 実現したいことの書いたようなプログラムに変更してもらいたいです よろしくお願いします

エラーメッセージ

###該当のソースコード python ここにご自身が実行したソースコードを書いてください import sys ##重要な関数を使える為のimport import numpy as np ##numpyの関数を使えるようにする関数 import scipy.spatial.distance as dist ##scipyのなんか関数import from matplotlib import pylab from matplotlib.font_manager import FontProperties ##matplotlibで日本語を使うための準備 C = 2 #クラスタ数 ROOP = 20 #アルゴリズムの繰り返し回数 objE = 0.0001 #目的関数の収束に使用する定数 fileName = "sampleN100C2Labeled" # データ数100、次元数2、クラスタ数2 def scale(argX): """データ行列Xを属性ごとに正規化したデータを返す""" """正規化とは平均0、分散1に変換すること""" col = argX.shape[1]#次元の数(=列の数) mu = np.mean(argX, axis=0) #次元ごとに平均値と標準偏差を計算 #縦の並びがaxis 0, 横の並びがaxis 1 sigma = np.std(argX, axis=0) #axisなしだと全体の平均 for i in xrange(col): #次元ごとにデータを正規化 argX[:,i] = (argX[:,i] - mu[i]) / sigma[i] return argX if __name__ == "__main__": data = np.genfromtxt("Data/" + fileName + ".txt")#入力データの格納 X = data[:, 0:-1] #ラベル付きデータを扱う場合にラベルを除去 ##X = data[:, :] X = scale(X) N = len(X) # データ数 P = X.shape[1] ##print "X = ", X ##print "Label = ", Label print "N = %d, P = %d, C = %d" % (N, P, C) Label = data[:, -1] #Label付きデータを扱う場合に必要 ##print "Label = ", Label listRI = [] ##RIの結果を保存する配列 np.random.seed() #乱数の列を固定 listClus = [] ##各個体の所属クラスタ for k in xrange(N): listClus.append( 0 ) #初期化 objVal = sys.maxsize ##目的関数の値の初期化 numOfRoop = 0 ##mainループ(Start)--------------------------- V = np.zeros( (C, P) ) ##Vの初期化(Start)------------------------------- initV = np.random.choice(xrange(N), C, replace = False)##初期Vとなる個体の番号を選択-------------------- print "初期クラスタ中心となる個体は ", initV V = X[ initV ] print "Vの初期値は \n", V ##Vの初期化(End)------------------------------- D = np.zeros( (N, C) ) ##非類似度行列Dの初期化(Start)------------------------------- D = dist.cdist(X, V, 'sqeuclidean') #非類似度にユークリッド距離の自乗を設定 while True:##アルゴリズムのループ(Start)------------------- Mu = np.zeros( (N, C) )##帰属度行列Muの更新(Start)----------------------------- for k in xrange(N): for i in xrange(C): if( D[k][i] == np.min( D[k] ) ): Mu[k][i] = 1 break ##帰属度行列Muの更新(End)------------------------------- for i in xrange(C): ##クラスタ中心の行列Vの更新(Start)---------------------- vBunshi = 0.0 vBunbo = np.sum(Mu[:,i], axis=0) for k in xrange(N): vBunshi += Mu[k][i] * X[k] V[i] = vBunshi / vBunbo ##クラスタ中心の行列Vの更新(End)--------------------------- D = dist.cdist(X, V, 'sqeuclidean') ##非類似度行列Dの更新 newObjVal = np.sum(Mu * D) ##目的関数の値を更新 print "numOfRoop = ", numOfRoop, "\t newObjVal = ", newObjVal##ループ回数と目的関数の値を出力(必要なし) if numOfRoop == ROOP or np.abs(objVal - newObjVal) < objE : break ##目的関数が収束するか、ループ回数が上限に達したら終了(##全データをグループ化すると終了に変更) else: ##上記以外の場合は目的関数の値とループ回数を更新してアルゴリズムを続行 objVal = newObjVal numOfRoop += 1 for k in xrange(N): ##所属クラスタの決定 for i in xrange(C): if( Mu[k][i] == np.max( Mu[k] ) ): listClus[k] = i + 1 listNumOfClus = [] ##各クラスタの所属個体数を更新 for i in xrange(C): listNumOfClus.append( np.sum(Mu[:,i], axis=0) ) print "アルゴリズム終了 ----------" print "ループ回数は %d, 目的関数の値は %f" %(numOfRoop, objVal) print "N = %d, P = %d, C = %d" % (N, P, C) print "各クラスタの個体数 = ", listNumOfClus ------------------ファイル出力--------------------------- outputData = np.zeros( (N, P+1), )##データと所属クラスタの出力 for k in xrange(N): for j in xrange(P+1): if(j<P): outputData[k][j] = float(data[k][j]) else: outputData[k][j] = listClus[k] np.savetxt('outData.txt', outputData, fmt='%.5f') np.savetxt('outV.txt', V, fmt='%.5f')##Betaの出力 np.savetxt('outMu.txt', Mu, fmt='%.5f')##Muの出力 np.savetxt('outRI.txt', arrayRI, fmt='%.5f') ##RIの出力 -----------表示関係------------ fp = FontProperties(fname=r'/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf') ##日本語テキスト描画の準備 ## IPAフォント color = ['r', 'b', 'g', 'm', 'y', 'c', 'w'] # C < 7と想定 symbol = ['o', 'x', '+', 's', '*', '^', 'p'] --------------図のオプションなど------------------ pylab.figure(figsize=(8,8)) #描画範囲を正方形に変更 デフォルトは(8,6)%% pylab.xlabel(u'説明変数', fontproperties=fp, fontsize=15) pylab.ylabel(u'目的変数', fontproperties=fp, fontsize=15) pylab.title(u'クラスタリングの結果', fontproperties=fp, fontsize=15) pylab.grid(True) #gridの表示 pylab.axis([minX0-1, maxX0+1, minX1-1, maxX1+1]) #描画範囲の指定 pylab.axis([-3.0, 3.0, -3.0, 3.0]) #描画範囲の指定 pylab.axis([-2.5, 2.5, -2.5, 2.5]) #描画範囲の指定 pylab.axis([-1, 81, -1, 81]) #描画範囲の指定 for i in xrange(C):## 結果の表示 for k in xrange(N): if(listClus[k] == i+1): pylab.scatter(X[k], Y[k], color=color[i], marker=symbol[i], label='data point', s=100) pylab.scatter(X[k][0], X[k][1], color=color[i], marker=symbol[i], s=100) for i in xrange(C): pylab.scatter(V[i][0], V[i][1], color='k', marker='x', s=150) pylab.legend(loc='upper left') #凡例表示 pylab.savefig('fig-regression.eps') pylab.savefig('fig-hcm-' + fileName + '.eps', format='eps', dpi=600, bbox_inches="tight", pad_inches=0.1) #出力画像の保存 pylab.show() #結果の表示 ###試したこと 課題に対してアプローチしたことを記載してください ###補足情報(言語/FW/ツール等のバージョンなど) より詳細な情報

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

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

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

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

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

coco_bauer

2016/10/03 04:40

問題の丸投げは、ダメです。 人が書いたコードでは無く、自分が書いたコードを示して下さい。
guest

回答1

0

ベストアンサー

Kmeans クラスタリングを行いたいのであれば、scikit-learn に実装があるので利用を検討してみてください。

投稿2016/10/08 02:12

iktakahiro

総合スコア142

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問