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

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

ただいまの
回答率

90.12%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,437

kouk

score 5

前提・実現したいこと

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

発生している問題・エラーメッセージ

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/ツール等のバージョンなど)

より詳細な情報

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • coco_bauer

    2016/10/03 13:40

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

    キャンセル

回答 1

checkベストアンサー

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる